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

Вход

Регистрация

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

 

= Мир MS Excel/Подсчет значений по уникальному полю - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Подсчет значений по уникальному полю (Макросы/Sub)
Подсчет значений по уникальному полю
ant6729 Дата: Пятница, 24.11.2017, 11:11 | Сообщение № 1
Группа: Проверенные
Ранг: Ветеран
Сообщений: 533
Репутация: 2 ±
Замечаний: 40% ±

Excel 2010
Добрый день, второй день не могу победить такую "тему"

В колонке 1 критерии, в колонке 2 значения

Использовал код (спасибо RAN)

[vba]
Код
Sub rere()

Dim ar, ai, ak, arCount()
Dim count1&, count2&
Dim i&

lr = Cells(Rows.Count, 1).End(xlUp).Row

ar = Range("a2:b" & lr)

With CreateObject("Scripting.Dictionary")
For i = 1 To UBound(ar)
.Item(ar(i, 1)) = .Item(ar(i, 1)) + ar(i, 2)

Next
ak = .keys
ai = .items

ReDim arCount(.Count - 1)
For i = 0 To .Count - 1

If ai(i) <= 2 Then count1 = count1 + 1 Else count2 = count2 + 1
arCount(i) = ak(i) & " - " & ai(i)

Next

MsgBox Join(arCount, vbLf)

End With
End Sub
[/vba]

Но столкнулся с ситуацией, что когда происходит фильтрация - то подсчет идет с указанного диапазона
[vba]
Код
ar = Range("a2:b" & lr)
[/vba]

То есть, если я отфильтровался по второму уникальному значению "Катя", то в месседжбокс я получу еще и "Вася"

Как оставить чисто Катю (конкретно отфильтрованное значение\ия) и забить на Васю?

Потому что начинаю в цикле по коллекции фильтроваться (я это уже не указываю тут - так, для общего представления) - показывает все имена в конце. А хочется, чтобы только одно, по которому происходит фильтрация.

Может, нужно как-то обнулять или Trim ить данные... не могу здесь подобрать метод. Подскажите, пожалуйста, как лучше и каким путем идти.

Пример во вложении.
К сообщению приложен файл: 9567802.xlsm (14.0 Kb)


Сообщение отредактировал ant6729 - Пятница, 24.11.2017, 11:13
 
Ответить
СообщениеДобрый день, второй день не могу победить такую "тему"

В колонке 1 критерии, в колонке 2 значения

Использовал код (спасибо RAN)

[vba]
Код
Sub rere()

Dim ar, ai, ak, arCount()
Dim count1&, count2&
Dim i&

lr = Cells(Rows.Count, 1).End(xlUp).Row

ar = Range("a2:b" & lr)

With CreateObject("Scripting.Dictionary")
For i = 1 To UBound(ar)
.Item(ar(i, 1)) = .Item(ar(i, 1)) + ar(i, 2)

Next
ak = .keys
ai = .items

ReDim arCount(.Count - 1)
For i = 0 To .Count - 1

If ai(i) <= 2 Then count1 = count1 + 1 Else count2 = count2 + 1
arCount(i) = ak(i) & " - " & ai(i)

Next

MsgBox Join(arCount, vbLf)

End With
End Sub
[/vba]

Но столкнулся с ситуацией, что когда происходит фильтрация - то подсчет идет с указанного диапазона
[vba]
Код
ar = Range("a2:b" & lr)
[/vba]

То есть, если я отфильтровался по второму уникальному значению "Катя", то в месседжбокс я получу еще и "Вася"

Как оставить чисто Катю (конкретно отфильтрованное значение\ия) и забить на Васю?

Потому что начинаю в цикле по коллекции фильтроваться (я это уже не указываю тут - так, для общего представления) - показывает все имена в конце. А хочется, чтобы только одно, по которому происходит фильтрация.

Может, нужно как-то обнулять или Trim ить данные... не могу здесь подобрать метод. Подскажите, пожалуйста, как лучше и каким путем идти.

Пример во вложении.

Автор - ant6729
Дата добавления - 24.11.2017 в 11:11
K-SerJC Дата: Пятница, 24.11.2017, 11:20 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 487
Репутация: 86 ±
Замечаний: 0% ±

Excel 2013
вот этот метод подойдет?
[vba]
Код
ar = Range("a2:b" & lr).SpecialCells(xlCellTypeVisible)
[/vba]


Благими намерениями выстелена дорога в АД.
 
Ответить
Сообщениевот этот метод подойдет?
[vba]
Код
ar = Range("a2:b" & lr).SpecialCells(xlCellTypeVisible)
[/vba]

Автор - K-SerJC
Дата добавления - 24.11.2017 в 11:20
nilem Дата: Пятница, 24.11.2017, 11:43 | Сообщение № 3
Группа: Авторы
Ранг: Старожил
Сообщений: 1612
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Фильтр не поможет (и даже навредит). Разве что в коде:
[vba]
Код
    For i = 2 To UBound(ar)
       If ar(i, 1) = "Катя" Then .Item(ar(i, 1)) = .Item(ar(i, 1)) + ar(i, 2)
    Next
[/vba]


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеФильтр не поможет (и даже навредит). Разве что в коде:
[vba]
Код
    For i = 2 To UBound(ar)
       If ar(i, 1) = "Катя" Then .Item(ar(i, 1)) = .Item(ar(i, 1)) + ar(i, 2)
    Next
[/vba]

Автор - nilem
Дата добавления - 24.11.2017 в 11:43
ant6729 Дата: Пятница, 24.11.2017, 12:10 | Сообщение № 4
Группа: Проверенные
Ранг: Ветеран
Сообщений: 533
Репутация: 2 ±
Замечаний: 40% ±

Excel 2010
Спасибо
 
Ответить
СообщениеСпасибо

Автор - ant6729
Дата добавления - 24.11.2017 в 12:10
Wasilich Дата: Суббота, 25.11.2017, 11:01 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
показывает все имена в конце. А хочется, чтобы только одно
По моему, надо чуток по другому. Просто, циклом выбирать одно имя и суммировать.
Так наверное.
К сообщению приложен файл: ant6729_2.xls (34.5 Kb)
 
Ответить
Сообщение
показывает все имена в конце. А хочется, чтобы только одно
По моему, надо чуток по другому. Просто, циклом выбирать одно имя и суммировать.
Так наверное.

Автор - Wasilich
Дата добавления - 25.11.2017 в 11:01
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Подсчет значений по уникальному полю (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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