Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Функция SUMPRODUCT - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Функция SUMPRODUCT (Макросы/Sub)
Функция SUMPRODUCT
mamontenok Дата: Вторник, 01.07.2014, 16:30 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Добрый день!
Пытаюсь научиться писать макросы на VBA. Пока на "школьном" уровне.
Есть база данных. По ней нужно составить отчёт (на другом листе), в котором явно используется функция СУММПРОИЗВ с тремя условиями.
Делала отчёт с помощью формул.
Пример формулы:
Код
D4=СУММПРОИЗВ((апрель!D$8:D$325=D$1)*(апрель!G$8:G$325=D$3)*(апрель!E$8:E$325=A4)*(апрель!C$8:C$325))

Потом попыталась написать макрос (без использования функции СУММПРОИЗВ, а просто с использованием 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. таблица, вычисленная с помощью макроса (написанного человеком с нулевым опытом, то есть мной :) )
К сообщению приложен файл: 8970864.xlsm (42.3 Kb)


Сообщение отредактировал mamontenok - Вторник, 01.07.2014, 16:32
 
Ответить
СообщениеДобрый день!
Пытаюсь научиться писать макросы на VBA. Пока на "школьном" уровне.
Есть база данных. По ней нужно составить отчёт (на другом листе), в котором явно используется функция СУММПРОИЗВ с тремя условиями.
Делала отчёт с помощью формул.
Пример формулы:
Код
D4=СУММПРОИЗВ((апрель!D$8:D$325=D$1)*(апрель!G$8:G$325=D$3)*(апрель!E$8:E$325=A4)*(апрель!C$8:C$325))

Потом попыталась написать макрос (без использования функции СУММПРОИЗВ, а просто с использованием 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
Дата добавления - 01.07.2014 в 16:30
_Boroda_ Дата: Вторник, 01.07.2014, 16:57 | Сообщение № 2
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Помогите, пожалуйста, хорошей девушке!)
Елена, а Вы точно хорошая девушка? Тогда так:
формулу можно написать такую
Код
=СУММПРОИЗВ((апрель!$D$8:$D$325=D$1)*(апрель!$G$8:$G$325=D$3)*(апрель!$E$8:$E$325=$A4)*апрель!$C$8:$C$325)

но это не будет
функция СУММПРОИЗВ с тремя условиями
- там одно условие.
С четырьмя условиями будет так:
Код
=СУММПРОИЗВ(--(апрель!$D$8:$D$325=D$1);--(апрель!$G$8:$G$325=D$3);--(апрель!$E$8:$E$325=$A4);апрель!$C$8:$C$325)


Макросом это будет так?
[vba]
Код
Range("D4:K37").FormulaLocal = "=СУММПРОИЗВ(--(апрель!$D$8:$D$325=D$1);--(апрель!$G$8:$G$325=D$3);--(апрель!$E$8:$E$325=$A4);апрель!$C$8:$C$325)"
[/vba]
К сообщению приложен файл: 8970864_1.xlsm (43.2 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение
Помогите, пожалуйста, хорошей девушке!)
Елена, а Вы точно хорошая девушка? Тогда так:
формулу можно написать такую
Код
=СУММПРОИЗВ((апрель!$D$8:$D$325=D$1)*(апрель!$G$8:$G$325=D$3)*(апрель!$E$8:$E$325=$A4)*апрель!$C$8:$C$325)

но это не будет
функция СУММПРОИЗВ с тремя условиями
- там одно условие.
С четырьмя условиями будет так:
Код
=СУММПРОИЗВ(--(апрель!$D$8:$D$325=D$1);--(апрель!$G$8:$G$325=D$3);--(апрель!$E$8:$E$325=$A4);апрель!$C$8:$C$325)


Макросом это будет так?
[vba]
Код
Range("D4:K37").FormulaLocal = "=СУММПРОИЗВ(--(апрель!$D$8:$D$325=D$1);--(апрель!$G$8:$G$325=D$3);--(апрель!$E$8:$E$325=$A4);апрель!$C$8:$C$325)"
[/vba]

Автор - _Boroda_
Дата добавления - 01.07.2014 в 16:57
mamontenok Дата: Пятница, 04.07.2014, 07:46 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

_Boroda_
Хорошая)) Но не разбирающаяся в данных вопросах. А когда обращаюсь с такими вопросами к IT-отделу, то они говорят, что не работают с экселем и не разбираются в нём.
Может просто неправильно сформулировала вопрос))
Про 3 условия, которые я имела ввиду, понятно из макроса, написанного на VBA (в СУММПРОИЗВ 4 аргумента: первые 3 - "условия", 4 - то, что складываем).
Спасибо за подсказку!)
 
Ответить
Сообщение_Boroda_
Хорошая)) Но не разбирающаяся в данных вопросах. А когда обращаюсь с такими вопросами к IT-отделу, то они говорят, что не работают с экселем и не разбираются в нём.
Может просто неправильно сформулировала вопрос))
Про 3 условия, которые я имела ввиду, понятно из макроса, написанного на VBA (в СУММПРОИЗВ 4 аргумента: первые 3 - "условия", 4 - то, что складываем).
Спасибо за подсказку!)

Автор - mamontenok
Дата добавления - 04.07.2014 в 07:46
Hugo Дата: Пятница, 04.07.2014, 10:03 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Тут нужен макрос на словаре. Ну и массивах.
Сперва циклом по апрелю собираем словарь сумм по составным ключам.
Затем циклом по результирующей таблице эти суммы раскладываем по местам.
Всего 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]


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеТут нужен макрос на словаре. Ну и массивах.
Сперва циклом по апрелю собираем словарь сумм по составным ключам.
Затем циклом по результирующей таблице эти суммы раскладываем по местам.
Всего 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]

Автор - Hugo
Дата добавления - 04.07.2014 в 10:03
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Функция SUMPRODUCT (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!