运行-time Error '1004'-- 范围 Class 的自动筛选方法失败
Run-time Error '1004'-- AutoFilter Method of Range Class Failed
我正在提取一份工作组织报告,并希望按唯一 ID 值查找和过滤。要过滤的唯一 ID 由通过用户表单中的文本框输入的 public 属性(此数字在其他场合使用,因此是 public 的原因)指定。正在使用的文件是用户从打开的文件对话框中选择的动态命名的报告。
- 用户输入他们想要过滤的经理的唯一 ID
- 使用唯一 ID 查找具有唯一 ID 的经理级别列
- 如果找不到 ID,请移至下一栏
- 找到 ID 后,过滤列
我筛选了 9 个不同的经理级别,AU、AW、AY、BA、BC、BE、BG、BI 和 BK 列,它们都位于第 3 行。因此我有列 'A3:BK3' 但我只在 'AU3:BK3' 之间过滤以提取较早列中的数据。
问题:我继续收到 "Run-time error '1004': AutoFilter method of Range class failed" 并且我不知道为什么,即使在尝试调试之后也是如此。当使用贯穿 9 列的测试 ID 时,它适用于某些列,但不适用于其他列。
代码:
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
我是 VBA 的新手,仅供参考,我解决问题是为了学习,但我的回答可能并不完美。
TLDR:
使用:With ws.Range(rFound.Address(False, False))
不是 With ws.Columns(vColumn)
你有一堆重复的代码,我试图 trim 下来,但由于我不是 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
我正在提取一份工作组织报告,并希望按唯一 ID 值查找和过滤。要过滤的唯一 ID 由通过用户表单中的文本框输入的 public 属性(此数字在其他场合使用,因此是 public 的原因)指定。正在使用的文件是用户从打开的文件对话框中选择的动态命名的报告。
- 用户输入他们想要过滤的经理的唯一 ID
- 使用唯一 ID 查找具有唯一 ID 的经理级别列
- 如果找不到 ID,请移至下一栏
- 找到 ID 后,过滤列
我筛选了 9 个不同的经理级别,AU、AW、AY、BA、BC、BE、BG、BI 和 BK 列,它们都位于第 3 行。因此我有列 'A3:BK3' 但我只在 'AU3:BK3' 之间过滤以提取较早列中的数据。
问题:我继续收到 "Run-time error '1004': AutoFilter method of Range class failed" 并且我不知道为什么,即使在尝试调试之后也是如此。当使用贯穿 9 列的测试 ID 时,它适用于某些列,但不适用于其他列。
代码:
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
我是 VBA 的新手,仅供参考,我解决问题是为了学习,但我的回答可能并不完美。
TLDR:
使用:With ws.Range(rFound.Address(False, False))
不是 With ws.Columns(vColumn)
你有一堆重复的代码,我试图 trim 下来,但由于我不是 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