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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2010, 20:49   #11
Igor67
Пользователь
 
Регистрация: 09.12.2008
Сообщений: 56
По умолчанию

2 Hugo
Наверное было бы лучше еще и проверку через несколько If делать.
В вашем случае, даже если первое условие не выполняется, два последующих все равно проверятся
If a(i, 1) = b(1, k + 2) And a(i, 2) = b(r, 1) And a(i, 3) = b(r, 2) Then b(r, k + 2) = b(r, k + 2) + a(i, 5)

For k = 1 To 12
For r = 2 To bb
For i = 1 To aa
If a(i, 1) = b(1, k + 2) then
If a(i, 2) = b(r, 1) then
if a(i, 3) = b(r, 2) Then b(r, k + 2) = b(r, k + 2) + a(i, 5)
end if
end if
Next
Next
Next
обычно я на http://planetaexcel.ru/forum.php
Igor67 вне форума Ответить с цитированием
Старый 25.07.2010, 22:16   #12
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Да, спасибо, что-то мне и в голову не пришло А результат-то существенный, в 2 раза (напомню - анализируем и суммируем данные из 65499 рядов):

6,515625
7,34375
7,46875
7,0625
7,359375
7,46875

3,53125
3,09375
3,3125
3,3125
3,3125
3,375

P.S.Только сейчас дошло - так ведь так мы сделали ADO! На целую секунду!
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 25.07.2010 в 22:26.
Hugo121 вне форума Ответить с цитированием
Старый 26.07.2010, 09:58   #13
kipish_lp
Форумчанин
 
Регистрация: 25.11.2009
Сообщений: 113
По умолчанию

А если я заполняю:
Код:
For k = 10 to 34 Step 2
и
Код:
 rrng = Array(5,10,15)
For Each r in rrng
У меня с такими параметрами че-то не получается.
kipish_lp вне форума Ответить с цитированием
Старый 26.07.2010, 10:33   #14
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Ничего не понял
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 26.07.2010, 10:45   #15
kipish_lp
Форумчанин
 
Регистрация: 25.11.2009
Сообщений: 113
По умолчанию

Приношу свои извинения.
У меня цикл для обработки столбцов с шагом, напр., 2, и определенные строки, куда ставить данные.
Код:
For k = 10 to 34 Step 2
rrng = Array(5,10,15)
For Each r in rrng
For i = 1 To aa
If a(i, 1) = b(1, k + 2) then
If a(i, 2) = b(r, 1) then
if a(i, 3) = b(r, 2) Then b(r, k + 2) = b(r, k + 2) + a(i, 5)
end if
end if
Next
Next
Next
Если использовать массив, вставляются всякие данные подряд. А как к моим условиям переделать, я пока не догадываюсь.
kipish_lp вне форума Ответить с цитированием
Старый 26.07.2010, 11:01   #16
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

For k = 10 to 34 Step 2 - перебираем названия месяцев
If a(i, 1) = b(1, k + 2) then - если название месяца в таблице совпадает с названием месяца из списка, т.е. надо синхронизировать элемент массива b, из которого берёте значения.
Вообще так без примера трудно с уверенностью сказать, где проскакивает ошибка. Прогоните через F8 и в окне Locals смотрите, какие значения в массивах, что сравнивается и что суммируется.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 26.07.2010, 17:54   #17
kipish_lp
Форумчанин
 
Регистрация: 25.11.2009
Сообщений: 113
По умолчанию

Вот, что у меня получилось. Не пойму, в чем дело.
И еще, не пойму как сделать строки, напр, 22, 24, 27.
Вложения
Тип файла: rar Книга1.rar (10.4 Кб, 12 просмотров)
kipish_lp вне форума Ответить с цитированием
Старый 26.07.2010, 20:09   #18
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Там почти уже сошлось, основная ошибка была в расположении выгрузки массива. В архиве есть скрин сравнения кодов, если интересно.
Да, и k надо перебирать с 1, там ведь в начале халаты/перчатки в этом массиве надо сравнить
Но если делать, как я в начале, на 3-4 массивах, тогда проще алгоритм построить - месяцы в одном массиве, халаты/перчатки в другом, выгружаем в третий. Поанализируйте тот код.

Насчёт "строки 22,24,27" - вот весь код. Добавил массив значений цикла rrng, как у Вас выше было. Ещё пришлось заменить определение r.
Строки в явном виде не указываются, указываются элементы массива, в которых содержатся значения этих строк.
А вообще наверное это можно и формулами сделать. На таком объёме сработают, вот на 65500 будет тормозить. Но я не формулист

Код:
Sub Sobrat2()
'Dim tm 'это я время считал
'tm = Timer 'это я время считал
Dim ash As Worksheet
Dim a(), b()
Dim i As Long, k As Long, aa As Long, bb As Long, r
Dim rrng()

Set ash = ThisWorkbook.Sheets(1)
ash.Range("i21:af27").Value = "" 'обнуляем, если надо суммировать - можно закомментировать
a = ash.Range("A2:e42").Value 'база данных всего, вместо 65500 можно переменную
b = ash.Range("g20:af27").Value  'база сводной - что ищем и куда грузим
aa = UBound(a)
'bb = UBound(b) 'это не нужно, если rrng перебираем
rrng = Array(3, 5, 8) ' это элементы массива, на листе это строки 22,24,27

For k = 1 To 24 Step 2
    For Each r In rrng
'    For r = 1 To bb 'это не нужно, если rrng перебираем
        For i = 1 To aa
        If a(i, 1) = b(1, k + 2) Then
        If a(i, 2) = b(r, 1) Then
        If a(i, 3) = b(r, 2) Then b(r, k + 2) = b(r, k + 2) + a(i, 5)
        End If
        End If
        Next
    Next
Next

ash.Range("g20:af27") = b

'Debug.Print Timer - tm 'это я время считал
End Sub
Вложения
Тип файла: rar Hugo.rar (30.7 Кб, 11 просмотров)
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 26.07.2010 в 20:39.
Hugo121 вне форума Ответить с цитированием
Старый 27.07.2010, 04:59   #19
kipish_lp
Форумчанин
 
Регистрация: 25.11.2009
Сообщений: 113
По умолчанию

Спасибо огромное!
А можно еще вопрос. Как сделать так, чтобы во всем массиве изменялись только нужные ячейки, а остальные данные (у меня, к примеру, формулы) не трогались. Сейчас они все заменяются на значения.

Последний раз редактировалось kipish_lp; 27.07.2010 в 05:52. Причина: Возник вопрос
kipish_lp вне форума Ответить с цитированием
Старый 27.07.2010, 09:30   #20
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Это меняет дело. Легко не получится, в этом подходе тогда надо делать выборочную выгрузку полученного массива на лист - выгружать не всё, а только в те ячейки, которые подсчитывались. Т.е. вместо одной строки ash.Range("g20:af27") = b надо делать цикл по массиву и выгружать на лист выбранные элементы, а не сразу всё.
Это муторно, попробуйте сами. Только Вы знаете, где эти формулы
Ну и очистку тогда тоже делать надо выборочно, не затирая формулы.
Это если формулы в области сводной.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите оптимизировать код. kievlyanin Microsoft Office Excel 3 22.05.2009 18:20
помогите оптимизировать! kievlyanin Microsoft Office Excel 11 28.04.2009 14:19
Помогите оптимизировать процедуру Cold Went Компоненты Delphi 4 29.04.2008 15:11
Помогите оптимизировать! Altera Общие вопросы Delphi 6 25.03.2008 20:09
помогите оптимизировать процедуру _XspeC_ Общие вопросы Delphi 12 08.04.2007 02:05