运行时错误'1004'-范围类的自动筛选方法失败

问题描述 投票:1回答:1

我正在提取工作组织的报告,并希望通过唯一的ID值进行查找和过滤。通过用户表单中的文本框输入的公共属性(此数字在其他场合使用,因此它是公共的)指定要过滤的唯一ID。所使用的文件是用户从打开的文件对话框中选择的动态命名的报告。

  • 用户输入要在其下过滤的经理的唯一ID
  • 使用唯一ID查找哪个经理级别列具有唯一ID
  • 如果找不到ID,则移至下一列
  • 一旦找到ID,过滤列

我正在过滤9个不同的经理级别,AU,AW,AY,BA,BC,BE,BG,BI和BK列,它们都位于第3行。因此,我有'A3:BK3'列但仅在“ AU3:BK3”之间进行过滤以提取较早列中的数据。

问题:我继续收到“运行时错误'1004':Range类的AutoFilter方法失败”,即使尝试调试,我也不知道为什么。它使用某些9列中的测试ID时,在某些列上有效,但在其他列上则无效。

代码:

Private Sub EmailButton_Click()

Application.ScreenUpdating = False

    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")


Dim aColumns() As String

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

Dim bFound As Boolean

    bFound = False

Dim rFound As Range
Dim vColumn As Variant
Dim AU As String
Dim AW As String
Dim AY As String
Dim BA As String
Dim BC As String
Dim BE As String
Dim BG As String
Dim BI As String
Dim BK As String

    AU = "47"
    AW = "49"
    AY = "51"
    BA = "53"
    BC = "55"
    BE = "57"
    BG = "59"
    BI = "61"
    BK = "63"



    'Checks if WWID is present
    For Each vColumn In aColumns
        Set rFound = ws.Columns(vColumn).Find(WWID, , xlValues, xlPart)
        If Not rFound Is Nothing Then

            bFound = True

            If vColumn = "AU" Then

            bFound = True

            'Filtering of WWID takes place
            With ws.Columns(vColumn)

                .AutoFilter AU, rFound.Value

            End With
Exit Sub

                Else

            End If

                Cells.AutoFilter

            If vColumn = "AW" Then

            bFound = True

            'Filtering of WWID takes place
            With ws.Columns(vColumn)

                .AutoFilter AW, rFound.Value

             End With
Exit Sub

                Else

            End If

                Cells.AutoFilter

            If vColumn = "AY" Then

            bFound = True

            'Filtering of WWID takes place
            With ws.Columns(vColumn)

                .AutoFilter AY, rFound.Value

             End With

             'Exit if no value is found
Exit Sub

                Else

            End If

                Cells.AutoFilter

            If vColumn = "BA" Then

            bFound = True

            'Filtering of WWID takes place
            With ws.Columns(vColumn)

                .AutoFilter BA, rFound.Value

             End With

             'Exit if no value is found
Exit Sub

                Else

            End If

                Cells.AutoFilter

            If vColumn = "BC" Then

            bFound = True

            'Filtering of WWID takes place
            With ws.Columns(vColumn)

                .AutoFilter BC, rFound.Value

             End With

             'Exit if no value is found
Exit Sub

                Else

            End If

                Cells.AutoFilter

            If vColumn = "BE" Then

            bFound = True

            'Filtering of WWID takes place
            With ws.Columns(vColumn)

                .AutoFilter BE, rFound.Value

             End With

             'Exit if no value is found
Exit Sub

                Else

            End If

                Cells.AutoFilter

            If vColumn = "BG" Then

            bFound = True

            'Filtering of WWID takes place
            With ws.Columns(vColumn)

                .AutoFilter BG, rFound.Value

            End With

            'Exit if no value is found
Exit Sub

                Else

            End If

                Cells.AutoFilter

            If vColumn = "BI" Then

            bFound = True

            'Filtering of WWID takes place
            With ws.Columns(vColumn)

                .AutoFilter BI, rFound.Value

            End With

            'Exit if no value is found
Exit Sub

                Else

            End If

                Cells.AutoFilter

            If vColumn = "BK" Then

            bFound = True

            'Filtering of WWID takes place
            With ws.Columns(vColumn)

                .AutoFilter BK, rFound.Value

            End With

            Exit Sub

            End If

        End If

    Next vColumn

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

Unload DistrUserForm

Application.ScreenUpdating = True

End Sub

提交到测试环境的文件:easyupload.io/1p2yoi

excel vba userform
1个回答
0
投票

我只是FYI的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
© www.soinside.com 2019 - 2024. All rights reserved.