Цикл по рабочим листам и применение фильтра - PullRequest
0 голосов
/ 13 февраля 2019

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

Public Sub someFunction()

Dim recipients As String
Dim recipient As Range
Dim worksheet As worksheet

For Each worksheet In ActiveWorkbook.Worksheets
    Select Case worksheet.Name
        Case "ABC Group", "DEF Group"
            ' DO NOTHING
        Case Else
            Worksheets(Worksheet.Name).Activate
            colNum = Application.WorksheetFunction.Match("a column name", ActiveSheet.Rows(5), 0)
            Rows(5).AutoFilter Field:=colNum - 1, Criteria1:="=some string*"
            With ActiveSheet ' ThisWorkbook.Sheets("Sheet1") - Or ActiveSheet
                For Each recipient In .Range("B6:B" & .UsedRange.Rows.Count).SpecialCells(xlCellTypeVisible).Cells
                    recipients = recipients + recipient + ";"
                Next recipient
            End With
    End Select
Next
End Sub

Однако фильтр корректно применяется ко всем соответствующимлисты, а в графическом интерфейсе код заканчивается на последнем листе.

1 Ответ

0 голосов
/ 13 февраля 2019

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

Вам следует изменить переменную листа на , а не соответствовать ключевым словам / объектам VBA.Я изменил его на ws, поскольку ваш метод именования был слишком близок к предопределенным объектам VBA

Кроме того, вы строите строку с оператором &, а не +


Option Explicit

Public Sub someFunction()

Dim mystring As String
Dim recipient As Range
Dim colNum As Long
Dim ws As Worksheet

For Each ws In ActiveWorkbook.Worksheets
    Select Case ws.Name
        Case "ABC Group", "DEF Group"
            ' DO NOTHING
        Case Else
            colNum = Application.WorksheetFunction.Match("a column name", ws.Rows(5), 0)
            ws.Rows(5).AutoFilter Field:=colNum - 1, Criteria1:="=some string*"

                For Each recipient In ws.Range("B6:B" & ws.UsedRange.Rows.Count).SpecialCells(xlCellTypeVisible).Cells
                    mystring = mystring & recipient & ";"
                Next recipient

    End Select
Next ws

mystring = Left(mystring, Len(mystring) - 1) '<-- Remove last instance of ";"

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