Отфильтруйте несколько листов, используя переменное значение ячейки - PullRequest
0 голосов
/ 27 июня 2018

У меня есть рабочая тетрадь с несколькими листами.

Каждый лист с данными имеет общий столбец K, который содержит имена Client Manager. В Sheet2 я использовал поле проверки данных в C1, используя список, поэтому создал раскрывающийся список, в котором я могу выбрать Client Manager. Поэтому, если я выберу Чарли Брауна и запуском макроса, я бы хотел, чтобы все листы были отфильтрованы, чтобы показывать только данные Чарли Брауна.

Я абсолютный новичок в VBA, поэтому я беспощадно беспокоил г-на Google - большинство предложений касаются жесткого кодирования значения фильтра, а не превращения его в переменное значение ячейки. Лучшее, что я нашел, это:

Sub apply_autofilter_across_worksheets ()
Dim xWs As Worksheet
В случае ошибки Продолжить Далее
Для каждого xWs в рабочих листах
xWs.Range ("K"). Автофильтр 1, CLng (Sheets ("Sheet2"). Диапазон ("C1"). Значение)
Далее
Конец Sub

Когда я запускаю макрос:

• Положительный - без ошибок!
• Отрицательно - ничего не происходит

Я не уверен, что это делает: xWs.Range ("K") - исходный скрипт имел номер после буквы столбца, но независимо от того, какой номер я ставил после него, он делает без разницы.

Я также просто ввел имя Client Manager в C1, без последствий. Так ясно, что все просто сломано. Есть 8 листов данных, а также Sheet2. Количество столбцов варьируется от листа к листу, но ни один не превышает AZ.

Любая помощь будет принята с благодарностью, пожалуйста!

1 Ответ

0 голосов
/ 27 июня 2018

Как уже упоминалось в комментариях, On Error Resume Next скрывает ошибки, но не обрабатывает их. Использование Clng определенно вызывает ошибку - это попытается преобразовать значение в C2 в тип Long, когда вы имеете дело с String. Также вам необходимо специально не фильтр Sheet2.

Как насчет этого? (предполагается, что ваши данные начинаются с A1 на каждом листе.)

Отредактировано только для видимых листов автофильтра.

Sub apply_autofilter_across_worksheets()
    Dim ws As Worksheet
    Dim clientManager As String
    Dim lastCol As Long, lastRow As Long
    Dim filterRng As Range

    clientManager = Sheets("Sheet2").Range("C1").Value

    For Each ws In Worksheets
        If ws.Name <> "Sheet2" And ws.Visible Then
            With ws
                If .AutoFilterMode Then .AutoFilter.ShowAllData

                lastCol = .Cells(1, Columns.Count).End(xlToLeft).Column
                lastRow = .Cells(Rows.Count, 1).End(xlUp).Row

                Set filterRng = .Range(.Cells(1, 1), .Cells(lastRow, lastCol))
                filterRng.AutoFilter 11, clientManager
            End With
        End If
    Next ws

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