我正在提取工作组织的报告,并希望通过唯一的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
我只是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