Макрос с использованием .AutoFilter работает только на первой итерации - все остальные итоги равны нулю - PullRequest
0 голосов
/ 09 мая 2019

У меня есть две таблицы на листе Excel 2016 (win 10): data и template.Data содержит класс и связанные с ним данные.Лист сортируется (az) по классу.Template содержит фоновые данные с одной строкой на класс.Примером КЛАССА могут быть oranges, apples, blackberries.

Я просматриваю список классов в Template.Для каждого класса я использую Автофильтр, чтобы выбрать определенный класс на листе «данных», а затем подсчитать количество записей с помощью .SpecialCells(XlCellTypeVisible).Rows.count.Я сохраняю счет на листе Template.Первый класс фильтруется и считается правильно.Все следующие классы отфильтрованы правильно, но количество равно нулю.

Пример:

"data" sheet
CLASS column (sorted a-z)
apples
apples
apples
apples
apples
blackberries
blackberries
blackberries
oranges
oranges

"Template" sheet
CLASS column
apples
blackberries
melons
oranges

Желаемый результат:

"Template" sheet
CLASS column    myCount column
apples          5
blackberries    3
melons          0
oranges         2

Фактические результаты:

"Template" sheet
CLASS column    myCount column
apples          5
blackberries    0
melons          0
oranges         0

Мой код:

Sub CountAll()
  Dim rng As Range
  Dim myRow As Integer     'Row number in Template
  Dim thisClass As String  'Class we are currently counting
  Dim myCount As Integer   'Number of times thisClass is in "data"
  Dim numClasses as Integer  'Set to the number of classes in "Template"
  ...
  For myRow = 1 to numClasses
    thisClass = Worksheets("template").Cells(myRow, 1).Value
    Set rng = Worksheets("data").Range("A:A")
    With rng
      .AutoFilter Field:=1, Criterial:=thisClass
    End With

    myCount = rng.SpecialCells(xlCellTypeVisible).Rows.count
    Worksheets("template").Cells(myRow,3).Value = myCount
    ActiveSheet.showAllData 'Display all data again.
  Next myRow
End Sub

Этот код является временным (6-12 месяцев), пока не будет приобретен генератор отчетов.VBA не был моим выбором.Я лучше со сборкой, C, FORTRAN и JAVA.Любые предложения будут ценны.Я потратил около 4 часов на изучение этой проблемы.

1 Ответ

0 голосов
/ 17 мая 2019

Проверьте этот ответ: Количество строк на отфильтрованных данных

[Rows.Count] будет подсчитывать только количество строк в первой смежной видимой области автофильтрованногоrange ... [Cells.Count] даст вам точный счет, даже если Range имеет несколько областей, в отличие от свойства Rows

Только что протестировано и может подтвердить, что это правда.Вы должны помнить о Cells.Count и убедиться, что ваш диапазон обрабатывается надлежащим образом.

  • В связанном решении Cells.Count -1 используется для корректировки заголовка в первой строке, но вы не будете вычитать1 от подсчета, если ваш диапазон был основан на таблице DataBodyRange.
  • Если ваш диапазон содержит более 1 столбца, то ваш счет будет умножен на количество видимых столбцов, и вы можете захотеть разделитьрезультат по количеству столбцов или задайте другой диапазон.

В вашем примере ваш диапазон явно определен как один полный столбец, но я оставлю вывод, если вы используете строку заголовка или хотите эту строкуподсчитаны.Предполагая, что вы используете его и не хотите считать его, тогда -1 подходит.

В заключение, это ваше решение: myCount = rng.SpecialCells(xlCellTypeVisible).Cells.Count-1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...