| 
			| 
					
						| Highland 
								Гость
 | 
								|  | «  : 23-01-2010 08:28 »  |  | 
 
 Уважаемые форумчане!
 Мы исследуем реакцию растений в зависимости от определенных климатических параметров. В прошлом месяце мы получили данные из Гидрометеоцентра с сети метеостанций (температура воздуха, осадки, и т.п.). Для обработки этих данных мы используем специальную программу для расчета средних, максимумов, минимумов, корреляций, трендов и т.п.
 
 Проблема в том, что программа работает только со средними дневными значениями (например, 01.01.1991 -12С), но часть данных (с новых метеостанций) представлена в т.н. "часовом формате", т.е. для каждого дня у меня есть 24 измерения с интервалом в 1 час. Перед обработкой мне нужно все данные привести в один среднедневной формат, т.е. рассчитать среднедневные значения на основе часовых.
 
 Решением данной проблемы, по-моему мнению, может быть макрос. Честно говоря, до вчерашнего дня я даже и не подозревал о их существовании, но через некоторое время у меня получился такой макрос:
 
 Sub Average()
 '
 ' Average Макрос
 ' Макрос записан 23.01.2010
 '
 ' Сочетание клавиш: Ctrl+q
 '
 Range("D23").Select
 ActiveCell.FormulaR1C1 = "Average"
 Range("D24").Select
 ActiveCell.FormulaR1C1 = "=AVERAGE(R[-23]C[-1]:RC[-1])"
 Range("D23 : D24").Select
 Selection.Copy
 ActiveWindow.SmallScroll Down:=24
 Range("D47").Select
 ActiveSheet.Paste
 ActiveWindow.SmallScroll Down:=30
 Range("D71").Select
 ActiveSheet.Paste
 ActiveWindow.SmallScroll Down:=18
 Range("D95").Select
 ActiveSheet.Paste
 End Sub
 
 Вопрос в том, как "зациклить" макрос, т.е. сдвигать расчет среднеарифметической постоянно на 24 шага вниз до конца массива данных и не делать это вручную?
 К сожалению, четкого объяснения для "чайников" я не нашел, а существующие примеры мне не подходят...Надеюсь на Ваш совет!
 
 С уважением,
 Сергей
 
 |  
						| 
								| 
 |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Sla | 
								|  | « Ответ #1 : 23-01-2010 10:20 »  |  | 
 
 Sub Average()
 Rowaddr = ActiveSheet.Cells.SpecialCells(xlLastCell).Row
 For i = 23 To Rowaddr Step 24
 Cells(i, 4).Value = "Average"
 Cells(i + 1, 4).FormulaR1C1 = "=AVERAGE(R[-23]C[-1]:RC[-1])"
 Next i
 End Sub
 
И это "не зациклить макрос", а выполнить цикл в макросе |  
						| 
								|  |  
								|  |  Записан | 
 
 Мы все учились понемногу... Чему-нибудь и как-нибудь. |  |  | 
	| 
			| 
					
						| Highland 
								Гость
 | 
								|  | « Ответ #2 : 23-01-2010 11:22 »  |  | 
 
   ) Все работает! Огромное спасибо!!! |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Highland 
								Гость
 | 
								|  | « Ответ #3 : 23-01-2010 15:03 »  |  | 
 
 Еще раз здравствуйте!
 Дошел до нового уровня проблем...
 1. Некоторые значения в моем массиве выпали, и в результате для некоторых дат у меня меньше 24 значений.
 2. Четыре станции записывают параметры с интервалом в 10 минут и поэтому число записей для одного дня 240.
 
 Как же можно сделать универсальный макрос, чтобы он считал среднеарифметическое для определенной даты вне зависимости от числа измерений?
 
 
 |  
						| 
								| 
 |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Sla | 
								|  | « Ответ #4 : 23-01-2010 16:04 »  |  | 
 
 Sub tempAv()'
 ' tempAv Макрос
 '
 
 '
 Dim Tday, Tmonth, Tyear
 Dim Tdate, LastDate As Date
 Dim numval As Integer
 Dim SumTemp
 
 RowLast = ActiveSheet.Cells.SpecialCells(xlLastCell).Row
 LastDate = "01.01.1900"
 SumTemp = 24000
 numval = 1
 For i = 1 To RowLast
 Tday = Cells(i, 1).Value
 Tmonth = Cells(i, 2).Value
 Tyear = Cells(i, 3).Value
 Tdate = DateSerial(Tyear, Tmonth, Tday)
 If Tdate <> LastDate Then
 If LastDate <> "01.01.1900" Then
 'вывести среднюю температуру
 Avtemp = SumTemp / numval
 Cells(i, 6).Value = Avtemp
 Cells(i, 7).Value = numval
 End If
 LastDate = Tdate
 SumTemp = Cells(i, 5).Value
 numval = 1
 Else
 SumTemp = SumTemp + Cells(i, 5).Value
 numval = numval + 1
 End If
 Next i
 End Sub
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Мы все учились понемногу... Чему-нибудь и как-нибудь. |  |  | 
	| 
			| 
					
						| HandKot 
								Молодой специалист    Offline | 
								|  | « Ответ #5 : 25-01-2010 04:57 »  |  | 
 
 Было бы проще, если бы Вы выложили файл, с которым работаете.Данные не обязательно все, а некоторый диапозон, который и нужно обработать, а то файл может быть очень большим
 и сказали какой результат нужен
 |  
						| 
								|  |  
								|  |  Записан | 
 
 I Have Nine Lives You Have One OnlyTHINK!
 |  |  | 
	| 
			| 
					
						| Sla | 
								|  | « Ответ #6 : 25-01-2010 07:23 »  |  | 
 
 HandKot, так он вложил файлно там диапазон 24-х часовый
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Мы все учились понемногу... Чему-нибудь и как-нибудь. |  |  | 
	| 
			| 
					
						| Highland 
								Гость
 | 
								|  | « Ответ #7 : 25-01-2010 07:58 »  |  | 
 
 Добрый день!
 Спасибо за макрос! Сегодня-завтра попробую обработать данные, результаты сообщу.
 
 to HandKot:
 Если Вам все еще интересно, то в приложении я прикрепил два файла: в первом станция записывает в часовом формате, в другом в т.н. субчасовом. В каждом случае нужно среднеарифметическое для определенной даты. Проблема в том, что некоторые значения в массиве данных для одного дня могут выпадать.
 |  
						| 
								| 
 |  
								| « Последнее редактирование: 25-01-2010 08:08 от Sel » |  Записан | 
 |  |  | 
	| 
			| 
					
						| HandKot 
								Молодой специалист    Offline | 
								|  | « Ответ #8 :  25-01-2010 10:57 »   |  | 
 
 мне кажется, что лучше сделать запросДанные-Внешние данные-Создать запрос
 тогда не будет никаких проблем с кол-вом строк
 |  
						| 
								|  |  
								|  |  Записан | 
 
 I Have Nine Lives You Have One OnlyTHINK!
 |  |  | 
	|  |