изменения показаний с помощью автофильтра для нескольких столбцов - PullRequest
0 голосов
/ 17 октября 2018

Я работаю над проектом VBA и хочу, чтобы он подсчитывал количество ячеек в диапазоне, соответствующем определенному критерию.

Так же, как и два столбца, и счетчик будет подсчитывать значение, если два требованиявыполнено.Кроме того, я добавил автофильтр в диапазон, поэтому счетчик будет меняться при фильтрации столбцов (например, значение изменится, если я выберу определенный класс, а не весь класс)

        dim i as integer
    dim rcell as integer
    lastrow = Activesheet.Cells(.Rows.Count, 1).End(xlUp).Row

Col_Dessert =5
Col_Snack =6

i=0

    with Worksheets("JIS")
For rcell = 1 to lastrow
If range(cells(rcell,Col_Dessert).value="L" ) And range(cells(rcell,Col_Dessert).value="WESTERN" ) then
i=i+1

end if
next rcell
end with

Ответы [ 3 ]

0 голосов
/ 18 октября 2018
Dim i As Integer
Dim r As Range
Dim wsCheck As Worksheet

i = 0
Set wsCheck = Worksheets("JIS")
For Each r In Intersect(wsCheck.AutoFilter.Range.Columns(5), wsCheck.AutoFilter.Range.SpecialCells(xlCellTypeVisible)).Cells
    If wsCheck.Cells(r.Row, Col_Starter).Value = "S" And wsCheck.Cells(r.Row, Col_Dessert).Value = "WESTERN" Then
        i = i + 1
        wsCheck.Range("A5") = "S:" & " " & i
    End If
Next r
0 голосов
/ 18 октября 2018
Dim i As Long 
Dim r As Range
 Dim wsCheck As Worksheet 
i = 0 
Set wsCheck = Worksheets("JIS")
 wsCheck.Application.Volatile (True) 
For Each r In Intersect(wsCheck.AutoFilter.Range.Columns(Col_Western), wsCheck.AutoFilter.Range.SpecialCells(xlCellTypeVisible)).Cells
If wsCheck.Cells(r.Row, Col_Starter).Value = "S" And wsCheck.Cells(r.Row, Col_Dessert).Value = "WESTERN" Then i = i + 1 wsCheck.Range("A5") = "S:" & " " & i 
End If 
Next r 
Set wsCheck = Nothing
0 голосов
/ 17 октября 2018

Если это действительно должно быть в VBA - и я могу думать о различных ситуациях, когда это произойдет - тогда вы можете использовать Range.SpecialCells(xlCellTypeVisible), чтобы получить только Ячейки, которые являются видимыми- например,

Dim Col_Dessert As Long, Col_Snack As Long

Dim i As Long
Dim rowCheck As Range, wsCheck As Worksheet

Col_Dessert = 5
Col_Snack = 6

i = 0
Set wsCheck = Worksheets("JIS")
For Each rowCheck In Intersect(wsCheck.AutoFilter.Range.Columns(1), wsCheck.AutoFilter.Range.SpecialCells(xlCellTypeVisible)).Cells
    If wsCheck.Cells(rowCheck.Row, Col_Dessert).Value = "L" And wsCheck.Cells(rowCheck.Row, Col_Dessert).Value = "WESTERN" Then
        i = i + 1
    End If
Next rowCheck

Set wsCheck = Nothing

Однако, если вы пытаетесь создать пользовательскую функцию для этого на рабочем листе, рассмотрите SUMPRODUCT с SUBTOTAL(103 (то есть COUNTA, игнорируя скрытые строки).Базовая форма:

=SUMPRODUCT(--(ConditionRange1="Value1")*--(ConditionRange2="Value2")*--SUBTOTAL(103,OFFSET($A$1,ROW(ConditionRange1)-1,0)))

Адаптировано для вас, чтобы соответствовать "L" в столбце E и "WESTERN" в столбце F:

=SUMPRODUCT(--($E$1:$E$100="L")*--($F$1:$F$100="WESTERN")*--SUBTOTAL(103,OFFSET($A$1,ROW($A$1:$A$100)-1,0)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...