Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как улучшить макрос?  (Прочитано 11054 раз)
0 Пользователей и 1 Гость смотрят эту тему.
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 шага вниз до конца массива данных и не делать это вручную?
К сожалению, четкого объяснения для "чайников" я не нашел, а существующие примеры мне не подходят...Надеюсь на Ваш совет!

С уважением,
Сергей

* Climate_example.xls (46 Кб - загружено 781 раз.)
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #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.

Как же можно сделать универсальный макрос, чтобы он считал среднеарифметическое для определенной даты вне зависимости от числа измерений?


* example.xls (56 Кб - загружено 816 раз.)
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Молодой специалист

ru
Offline Offline

« Ответ #5 : 25-01-2010 04:57 » 

Было бы проще, если бы Вы выложили файл, с которым работаете.
Данные не обязательно все, а некоторый диапозон, который и нужно обработать, а то файл может быть очень большим
и сказали какой результат нужен
Записан

I Have Nine Lives You Have One Only
THINK!
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 25-01-2010 07:23 » 

HandKot, так он вложил файл
но там диапазон 24-х часовый
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Highland
Гость
« Ответ #7 : 25-01-2010 07:58 » 

Добрый день!

Спасибо за макрос! Сегодня-завтра попробую обработать данные, результаты сообщу.

to HandKot:
Если Вам все еще интересно, то в приложении я прикрепил два файла: в первом станция записывает в часовом формате, в другом в т.н. субчасовом. В каждом случае нужно среднеарифметическое для определенной даты. Проблема в том, что некоторые значения в массиве данных для одного дня могут выпадать.

* субчасовой.xls (49 Кб - загружено 805 раз.)
* часовой.xls (68 Кб - загружено 779 раз.)
« Последнее редактирование: 25-01-2010 08:08 от Sel » Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #8 : 25-01-2010 10:57 » 

мне кажется, что лучше сделать запрос
Данные-Внешние данные-Создать запрос
тогда не будет никаких проблем с кол-вом строк
Записан

I Have Nine Lives You Have One Only
THINK!
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines