Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2010, 17:11   #1
1134
Пользователь
 
Аватар для 1134
 
Регистрация: 20.01.2010
Сообщений: 53
По умолчанию Структура макроса

Хочу организовать макрос таким образом, чтобы пробегая по строкам в каждом листе он отыскивал нужные (у меня те в, которых есть ''Qж м3/сут'', таких строк 12 по количеству месяцев), затем в нужных строках определял диапазон ячеек (в соответствии с количеством дней в месяце) производил над ним математическую операцию (находил среднее арифметическое) и записывал результаты в столбик на соседнем листе. В результате должен получиться столбик в котором, будут идти сначала 12 расчитанных значений для первого листа, затем 12 для второго и так далее для всех листов. Было бы идеально, если напротив каждого значения в соседних ячейках отображались месяц и имя листа в котором брались значения. Проблема в том, что я никак не могу чётко представить себе "анатомию" такого макроса. Помогите пожалуйста составить алгоритм, схему, возможно, у кого-то найдётся похожий код... Спасибо!
1134 вне форума Ответить с цитированием
Старый 04.02.2010, 18:52   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Проблема в том, что я никак не могу чётко представить себе "анатомию" такого макроса.
Проблема в том, что я вообще никак не могу представить себе "анатомию" Вашего файла.

1) Выкладываете файл
2) Указываете на примере файла, что и где должен искать макрос (помечаете цветом обрабатываемые диапазоны), и куда помещать результат.
3) Объясняете, чем Вас не устраивают формулы (ими решить задачу проще, нежели макросами)
EducatedFool вне форума Ответить с цитированием
Старый 05.02.2010, 07:42   #3
1134
Пользователь
 
Аватар для 1134
 
Регистрация: 20.01.2010
Сообщений: 53
По умолчанию

Формулы не устраивают, потому что в реальном файле слишком много листов и как минимум 12 расчётов для каждого.
Вложения
Тип файла: rar Primer.rar (70.5 Кб, 12 просмотров)
1134 вне форума Ответить с цитированием
Старый 05.02.2010, 08:41   #4
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Посмотрите вложение. Запустите макрос "Tablica".
Вложения
Тип файла: rar Primer_2.rar (62.8 Кб, 14 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 05.02.2010, 16:29   #5
1134
Пользователь
 
Аватар для 1134
 
Регистрация: 20.01.2010
Сообщений: 53
По умолчанию

Я немного видоизменил предложенный SAS888 макрос и столкнулся с новыми трудностями. В приложенном файле, в Макросе "Tablica" разкоментируйте закоментированные участки и вы тоже с ними столкнётесь!
Вложения
Тип файла: rar Primer_3.rar (60.2 Кб, 10 просмотров)
1134 вне форума Ответить с цитированием
Старый 08.02.2010, 07:01   #6
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Я не разбирался, зачем Вам все это нужно, просто, исправил и оптимизировал Ваш макрос. Посмотрите вложение.
Вложения
Тип файла: rar Primer_4.rar (62.8 Кб, 9 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 08.02.2010, 08:41   #7
1134
Пользователь
 
Аватар для 1134
 
Регистрация: 20.01.2010
Сообщений: 53
По умолчанию

SAS888, спасибо за помощь, но к сожалению когда я применяю макрос в своём реальном файле он выдаёт ошибку Run-time error '13' type mismatch в этой строке:

Cells(i, 3) = Application.AverageIf(ws.Range(ws.C ells(x.Row + 1, 6), ws.Cells(x.Row + 1, 36)), "<>0") / ws.[AG5]


Как я понимаю, это происходит в том случае, если в диапозоне отсутствуют значения, в таких случаях хотелось бы Cells(i, 3) ="0"
1134 вне форума Ответить с цитированием
Старый 08.02.2010, 08:52   #8
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Все правильно. У Вас ячейка "AG5 " проверяется на пустоту, а на 0 проверки нет. Для корректной работы, строку кода
Код:
If Cells(i, 5) <> "0" And ws.[AG5] <> "" Then _
                        Cells(i, 3) = Application.AverageIf(ws.Range(ws.Cells(x.Row + 1, 6), ws.Cells(x.Row + 1, 36)), "<>0") / ws.[AG5]
замените на
Код:
If Cells(i, 5) <> 0 And Val(ws.[AG5]) <> 0 Then _
    Cells(i, 3) = Application.AverageIf(ws.Range(ws.Cells(x.Row + 1, 6), ws.Cells(x.Row + 1, 36)), "<>0") / ws.[AG5] Else Cells(i, 3) = 0
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 08.02.2010 в 08:54.
SAS888 вне форума Ответить с цитированием
Старый 08.02.2010, 09:05   #9
1134
Пользователь
 
Аватар для 1134
 
Регистрация: 20.01.2010
Сообщений: 53
По умолчанию

Заменил, но почему-то не помогает, возможно, когда в диапазоне:

ws.Range(ws.Cells(x.Row + 1, 6), ws.Cells(x.Row + 1, 36))

присутствуют только 0 и пустые значения, то формула:

Application.AverageIf(ws.Range(ws.C ells(x.Row + 1, 6), ws.Cells(x.Row + 1, 36)), "<>0")

не считается?
1134 вне форума Ответить с цитированием
Старый 08.02.2010, 09:19   #10
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Не хочу гадать. Прикрепите пример с проблемным файлом и Вашим макросом - разберемся.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Структура Telec Помощь студентам 2 20.01.2010 12:46
C++. Структура. bpystep Помощь студентам 12 24.11.2009 00:28
структура hungry Общие вопросы C/C++ 11 25.06.2009 20:31
Структура SL1CK Общие вопросы C/C++ 8 08.06.2009 21:31
Запуск макроса с параметрами из другого макроса Saladin Microsoft Office Excel 2 19.01.2009 09:43