Ошибка времени выполнения «1004» - сбой метода автофильтра класса диапазона - PullRequest
1 голос
/ 14 января 2020

Я получаю отчет об организации работы и хочу найти и отфильтровать по уникальному значению идентификатора. Уникальный фильтруемый идентификатор указывается свойством publi c (этот номер используется в другом случае, поэтому он публикуется c), вводимым через текстовое поле в пользовательской форме. Используемый файл представляет собой отчет с динамическим именем, который пользователь выбирает в диалоговом окне открытия файла.

  • Пользователь вводит уникальный идентификатор менеджера, которого он хочет фильтровать, в поле
  • Используйте уникальный идентификатор для поиска у какого столбца уровня менеджера есть уникальный идентификатор
  • Перейти к следующему столбцу, если идентификатор не найден
  • Как только идентификатор найден, столбец фильтра

Существует 9 различных менеджеров уровни, которые я фильтрую, столбцы AU, AW, AY, BA, B C, BE, BG, BI и BK, и все они располагаются на строке 3. Поэтому у меня есть столбцы «A3: BK3», но я только фильтрую между «AU3: BK3» для извлечения данных в более ранних столбцах.

Проблема: я продолжаю получать «Ошибка времени выполнения» 1004: сбой метода автофильтра класса Range, и я понятия не имею, почему даже после попытки отладки. Он работает с некоторыми столбцами, но не с другими при использовании идентификаторов тестов, которые находятся в 9 столбцах.

Код:

Private Sub EmailButton_Click()

    'test WWIDS
    '75305 -- 337431 -- 152820578 -- 152821156

Application.ScreenUpdating = False


'Filter by WWID -- Question: How to know who to pull for?
'Filter criteria (Unique ID - WWID), if it does not exist, then move to next, else end/stop

    If Len(Trim(Me.EnterWWIDtxtbox.Text)) = 0 Then

        Me.EnterWWIDtxtbox.SetFocus
        MsgBox "Must provide a Unique ID"

        Exit Sub
    End If

Dim ws As Worksheet
Dim wb As Workbook

    Set wb = Workbooks.Open(Filename:=OpenFileTxt)
    Set ws = wb.Worksheets("Sheet1")

With wb.Worksheets("Sheet1")

 Dim aColumns() As String
    aColumns = Split("AU,AW,AY,BA,BC,BE,BG,BK,BI", ",")

    Dim bFound As Boolean
    bFound = False

    Dim rFound As Range
    Dim vColumn As Variant
    For Each vColumn In aColumns
        Set rFound = ws.Columns(vColumn).Find(WWID, , xlValues, xlPart)
        If Not rFound Is Nothing Then
            bFound = True
            MsgBox "Found [" & WWID & "] in column " & vColumn
            With ws.Columns(vColumn)

                .AutoFilter 1, rFound.Value

            End With
            Exit For
        End If
    Next vColumn

    If bFound = False Then MsgBox "Unique ID [" & WWID & "] not found"

End With

1 Ответ

1 голос
/ 15 января 2020

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

TLDR:

Использование: With ws.Range(rFound.Address(False, False)) НЕ With ws.Columns(vColumn)

У вас есть куча повторяющихся кодов, которые я пытался урезать, но так как я не на 100% на конечной цели или на том, как все работает, я мог сделать только так много. Вот чем я закончил.

Private Sub EmailButton_Click()

'Get WWID
WWID = "111"
'WWID = "777" ' HardCode for Testing

Dim ws As Worksheet
Dim wb As Workbook

    Set wb = ActiveWorkbook
    Set ws = wb.ActiveSheet

Dim aColumns() As String
    aColumns = Split("AU,AW,AY,BA,BC,BE,BG,BI,BK", ",")

 If WWID = "111" Then
    Col = "47" 'AU = "47"
 End If
    AW = "49"
    AY = "51"
    BA = "53"
    BC = "55"
    BE = "57"
 If WWID = "777" Then
    Col = "59" 'BG = "59"
 End If
    BI = "61"
    BK = "63"

ws.AutoFilterMode = False

Dim rFound As Range
Dim vColumn As Variant
  For Each vColumn In aColumns
        Set rFound = ws.Columns(vColumn).Find(WWID, , xlValues, xlPart)
        If Not rFound Is Nothing Then

            With ws.Range(rFound.Address(False, False))

                .AutoFilter Col, rFound.Value

            End With
        End If
    Next vColumn
End Sub
...