Добрый день! Пытаюсь научиться писать макросы на VBA. Пока на "школьном" уровне. Есть база данных. По ней нужно составить отчёт (на другом листе), в котором явно используется функция СУММПРОИЗВ с тремя условиями. Делала отчёт с помощью формул. Пример формулы:
Потом попыталась написать макрос (без использования функции СУММПРОИЗВ, а просто с использованием IF) [vba]
Код
For d = 4 To 11 For b = 4 To 37 k = 0 For a = 8 To 325 If Worksheets("апрель").Cells(a, 4) = Worksheets("коды").Cells(1, d) Then If Worksheets("апрель").Cells(a, 7) = Worksheets("коды").Cells(3, d) Then If Worksheets("апрель").Cells(a, 5) = Worksheets("коды").Cells(b, 1) Then k = k + Worksheets("апрель").Cells(a, 3) End If End If End If Next a Worksheets("коды").Cells(b, d) = k Next b Next d
[/vba]
А теперь нужно понять как написать код с использованием функции SUMPRODUCT. Хочу научиться использовать функции.
Помогите, пожалуйста, хорошей девушке!) В файле 3 листа (лишнюю информацию удалила): 1. с базой данных 2. таблица, вычисленная с помощью формулы (там чёрти что, т.к. были ошибки из-за форматов ячеек, но суть должна быть понятна) 3. таблица, вычисленная с помощью макроса (написанного человеком с нулевым опытом, то есть мной )
Добрый день! Пытаюсь научиться писать макросы на VBA. Пока на "школьном" уровне. Есть база данных. По ней нужно составить отчёт (на другом листе), в котором явно используется функция СУММПРОИЗВ с тремя условиями. Делала отчёт с помощью формул. Пример формулы:
Потом попыталась написать макрос (без использования функции СУММПРОИЗВ, а просто с использованием IF) [vba]
Код
For d = 4 To 11 For b = 4 To 37 k = 0 For a = 8 To 325 If Worksheets("апрель").Cells(a, 4) = Worksheets("коды").Cells(1, d) Then If Worksheets("апрель").Cells(a, 7) = Worksheets("коды").Cells(3, d) Then If Worksheets("апрель").Cells(a, 5) = Worksheets("коды").Cells(b, 1) Then k = k + Worksheets("апрель").Cells(a, 3) End If End If End If Next a Worksheets("коды").Cells(b, d) = k Next b Next d
[/vba]
А теперь нужно понять как написать код с использованием функции SUMPRODUCT. Хочу научиться использовать функции.
Помогите, пожалуйста, хорошей девушке!) В файле 3 листа (лишнюю информацию удалила): 1. с базой данных 2. таблица, вычисленная с помощью формулы (там чёрти что, т.к. были ошибки из-за форматов ячеек, но суть должна быть понятна) 3. таблица, вычисленная с помощью макроса (написанного человеком с нулевым опытом, то есть мной )mamontenok
_Boroda_ Хорошая)) Но не разбирающаяся в данных вопросах. А когда обращаюсь с такими вопросами к IT-отделу, то они говорят, что не работают с экселем и не разбираются в нём. Может просто неправильно сформулировала вопрос)) Про 3 условия, которые я имела ввиду, понятно из макроса, написанного на VBA (в СУММПРОИЗВ 4 аргумента: первые 3 - "условия", 4 - то, что складываем). Спасибо за подсказку!)
_Boroda_ Хорошая)) Но не разбирающаяся в данных вопросах. А когда обращаюсь с такими вопросами к IT-отделу, то они говорят, что не работают с экселем и не разбираются в нём. Может просто неправильно сформулировала вопрос)) Про 3 условия, которые я имела ввиду, понятно из макроса, написанного на VBA (в СУММПРОИЗВ 4 аргумента: первые 3 - "условия", 4 - то, что складываем). Спасибо за подсказку!)mamontenok
Тут нужен макрос на словаре. Ну и массивах. Сперва циклом по апрелю собираем словарь сумм по составным ключам. Затем циклом по результирующей таблице эти суммы раскладываем по местам. Всего 2 цикла. Будет быстрее раз так в 100 вероятно. P.S. Да какое там в 100 - запустил код, должно быть раз в 1000 быстрее этого кода... Померил - где-то в 500 получилось.. не важно... [vba]
Код
Sub tt() Dim a(), i&, ii&, t$
With CreateObject("Scripting.Dictionary"): .comparemode = 1 a = [апрель!A6].CurrentRegion.Value For i = 3 To UBound(a) ' код операции код валюты направление t = a(i, 5) & "|" & a(i, 7) & "|" & a(i, 4) .Item(t) = .Item(t) + a(i, 3) Next
a = [коды!A1].CurrentRegion.Value For i = 4 To UBound(a) For ii = 2 To UBound(a, 2) t = a(i, 1) & "|" & a(3, ii) & "|" & a(1, ii) a(i, ii) = .Item(t) Next Next End With
[коды!A1].CurrentRegion.Value = a End Sub
[/vba]
Тут нужен макрос на словаре. Ну и массивах. Сперва циклом по апрелю собираем словарь сумм по составным ключам. Затем циклом по результирующей таблице эти суммы раскладываем по местам. Всего 2 цикла. Будет быстрее раз так в 100 вероятно. P.S. Да какое там в 100 - запустил код, должно быть раз в 1000 быстрее этого кода... Померил - где-то в 500 получилось.. не важно... [vba]
Код
Sub tt() Dim a(), i&, ii&, t$
With CreateObject("Scripting.Dictionary"): .comparemode = 1 a = [апрель!A6].CurrentRegion.Value For i = 3 To UBound(a) ' код операции код валюты направление t = a(i, 5) & "|" & a(i, 7) & "|" & a(i, 4) .Item(t) = .Item(t) + a(i, 3) Next
a = [коды!A1].CurrentRegion.Value For i = 4 To UBound(a) For ii = 2 To UBound(a, 2) t = a(i, 1) & "|" & a(3, ii) & "|" & a(1, ii) a(i, ii) = .Item(t) Next Next End With