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 Only THINK!
|
|
|
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 Only THINK!
|
|
|
|