Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/104: Рейтинг темы: голосов - 104, средняя оценка - 4.62
13 / 13 / 0
Регистрация: 24.10.2015
Сообщений: 267
1

Суммирование по условию

04.02.2016, 19:45. Показов 18736. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго дня, уважаемые. Подскажите, не могу сообразить, как просуммировать изменяющийся диапазон по условию. Что вроде суммесли. Условие подразумевается вводить через InputBox, а результат выводить через MsgBox. Т.е. есть два столбца (допустим 1 и 2). Через InputBox вводится значение, и если оно встречается в столбце 1, то суммируются значения из столбца 2 для строк, в которых это значение встречается. В MsgBox выводятся общая сумма всех значений. Количество заполненных строк в столбце 1 равно количеству заполненных строк в столбце 1 и это количество периодически добавляется.
Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.02.2016, 19:45
Ответы с готовыми решениями:

Суммирование по условию
Здравствуйте! Нужна помощь в создании кода. Мне нужно ввести в ячейку определенный интервал....

Суммирование по условию работает не совсем корректно
Добрый день! Написал макрос для суммирования по условию: Sub страхование() Dim insur As...

Суммирование значений листов закрытой книги по условию
Здравствуйте. Есть сложная для меня задача. Есть книга "Сумма" , на листе "Итог" - кнопка. По...

Поиск и суммирование значений по условию в разных листах
Доброго времени суток! У меня в книге Экзеля есть около 80 листов, нужно переодически суммировать...

14
11513 / 3799 / 681
Регистрация: 13.02.2009
Сообщений: 11,217
04.02.2016, 19:49 2
и если оно встречается в столбце 1,
А где находятся эти столбцы?
На вскидку если на листе: сначала считать два столбца в массив, потом загнать в словарь и потом уже спрашивая значения, проверять наличие ключа в словаре суммировать
0
13 / 13 / 0
Регистрация: 24.10.2015
Сообщений: 267
04.02.2016, 19:59  [ТС] 3
Цитата Сообщение от Alex77755 Посмотреть сообщение
А где находятся эти столбцы?
Допустим, столбец 1 - это столбец А, а столбец 2 - это столбец С.
Вася 35
Петя 40
Вася 40
В данном примере, если в InputBox завести "Вася", то в MsgBox должно отобразиться 75
0
11513 / 3799 / 681
Регистрация: 13.02.2009
Сообщений: 11,217
04.02.2016, 20:05 4
А, допустим:
Без файла я могу только предложить вариант решения...

Добавлено через 2 минуты
Допустим, столбец 1 - это столбец А, а столбец 2 - это столбец С.
Типа макрос должен обладать способностями искусственного интеллекта и сам догадаться где что находится?
0
4135 / 2239 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
04.02.2016, 20:05 5
A что =СУММЕСЛИ() уже исчезла из Excel

Visual Basic
1
MsgBox Application.SumIf([A:A], InputBox("Введите имя"), [C:C])
1
13 / 13 / 0
Регистрация: 24.10.2015
Сообщений: 267
04.02.2016, 20:12  [ТС] 6
Цитата Сообщение от pashulka Посмотреть сообщение
1
MsgBox Application.SumIf([A:A], InputBox("Введите имя"), [C:C])
Суммесли мне известна, но не в VBA Спасибо, это то, что надо.
0
4135 / 2239 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
04.02.2016, 20:21 7
teplovdl, Сорри, прочитал в Вашем сообщение, как счётесли катастрофически быстро теряю зрение
0
13 / 13 / 0
Регистрация: 24.10.2015
Сообщений: 267
04.02.2016, 20:25  [ТС] 8
Это нормально...

Добавлено через 1 минуту
А скажите, а если придется суммировать диапазон, состоящий из двух столбцов, то как?
0
4135 / 2239 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
04.02.2016, 20:54 9
Результат для товарища Вася должен быть 105 ?
Миниатюры
Суммирование по условию  
0
13 / 13 / 0
Регистрация: 24.10.2015
Сообщений: 267
04.02.2016, 20:57  [ТС] 10
Да
0
4135 / 2239 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
04.02.2016, 21:32 11
Как вариант, просто суммировать каждый столбец, т.е.

Visual Basic
1
2
iText = InputBox("Введите имя", , "Вася")
MsgBox Application.SumIf([A:A], iText, [B:B]) + Application.SumIf([A:A], iText, [D:D])
Если столбцов более двух

Visual Basic
1
2
3
4
5
iText = InputBox("Введите имя", , "Вася")
For Each iColumn In Array("B", "D", "F")
    iResult = iResult + Application.SumIf(Columns("A"), iText, Columns(iColumn))
Next
MsgBox iResult
Или программно вычислять формулу :

Visual Basic
1
2
=СУММ((A1:A10="Вася")*(B1:B10+D1:D10))
=СУММПРОИЗВ((A1:A10="Вася")*(B1:B10+D1:D10))
1
13 / 13 / 0
Регистрация: 24.10.2015
Сообщений: 267
04.02.2016, 22:09  [ТС] 12
Цитата Сообщение от pashulka Посмотреть сообщение
Visual BasicВыделить код
1
2
3
4
5
iText = InputBox("Введите имя", , "Вася")
For Each iColumn In Array("B", "D", "F")
* * iResult = iResult + Application.SumIf(Columns("A"), iText, Columns(iColumn))
Next
MsgBox iResult
Прошу прощения, а выйти из цикла так?
If cells(i,1) = iText Then exit For

Добавлено через 1 минуту
Это правда для цикла типа For i = 1 to 10
0
4135 / 2239 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
04.02.2016, 22:13 13
А не нужно никуда выходить т.к. цикл в моём примере предназначен для перебора столбцов ("B", "D", "F"), а не строк.

P.S. С какой целью Вы перебираете строки ?
0
13 / 13 / 0
Регистрация: 24.10.2015
Сообщений: 267
04.02.2016, 22:20  [ТС] 14
А если пример вот такой
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub zarplata()
lastrow = Cells.SpecialCells(xlLastCell).Row
Temp1 = (InputBox("Укажите начало периода"))
Temp2 = (InputBox("Укажите конец периода"))
Temp3 = (InputBox("Введите Ф.И.О. работника"))
For i = 3 To lastrow
        If Cells(i, 1) >= Temp1 Or Cells(i, 1) <= Temp2 Then
            MsgBox "Зарплата за период " & " с " & Temp1 & " по " & Temp2 & " составила " & Application.SumIf([C:C], Temp3, [Z:Z]) + Application.SumIf([C:C], Temp3, [AA:AA]) & " руб", , "Зарплата"
        
        End If
        If Cells(i, 3) = Temp3 Then Exit For
Next
End Sub
Это реальный пример. Все работает хорошо, но нужно, чтобы цикл прерывался как только в столбце 1 повстречается Temp3. Иначе бесконечно много раз вылезает MsgBox. Вроде все правильно написано, но че то цикл не прерывается.
0
4135 / 2239 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
04.02.2016, 22:55 15
Если воспользуетесь функцией СУММЕСЛИМН (Excel 2007 и старше), то сможете отказаться от цикла.

P.S. В более ранних версиях - можно использовать другие возможности.

Добавлено через 16 минут
Если же для подсчёта зарплаты использовать именно перебор ячеек, то можно и так :

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Option Compare Text
 
Private Sub Zarplata()
    On Error GoTo ErrHandler
    
    Dim LastRow&, Row&, Zarplata#
    Dim Temp1 As Date, Temp2 As Date, Temp3$
 
    LastRow = Cells.SpecialCells(xlLastCell).Row
    Temp1 = CDate(InputBox("Укажите начало периода"))
    Temp2 = CDate(InputBox("Укажите конец периода"))
    Temp3 = Trim(InputBox("Введите Ф.И.О. работника"))
 
    For Row = 3 To LastRow
        If Cells(Row, 3) = Temp3 Then
           Select Case Cells(Row, 1)
               Case Temp1 To Temp2
               Zarplata = Zarplata + Cells(Row, 26) + Cells(Row, 27)
           End Select
       End If
    Next
    MsgBox Zarplata: Exit Sub
    
ErrHandler:
    MsgBox Err.Description, vbCritical, Err.Number
End Sub
2
04.02.2016, 22:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.02.2016, 22:55
Помогаю со студенческими работами здесь

Суммирование по условию
Есть два листа. На первом листе в столбец указана валюта. На втором столбце указана валютная...

Суммирование по условию
В FastReport сделал отчет-накладную на перемещение оборудования. Поля - наименование, ID ,...

Суммирование по условию
Здравствуйте! Мне нужно просуммировать данные диапазона ячеек Е3:АН3125 листа &quot;11&quot; при условии...

Суммирование по условию
Доброго дня. помогите не могу разобраться((( есть таблица Столбец А = сумма (числовой формат);...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru