excel VBA使用从筛选列表中提取的数据筛选列表

dgenwo3n  于 2023-05-19  发布在  其他
关注(0)|答案(2)|浏览(459)

我有一个Excel文件,我根据三列中的标准进行过滤,这意味着从13 K行下降到100(99 +标题),这部分工作正常。
接下来我需要做的是从列F中提取一个值列表,但不能开始工作(这些值是包含字母、数字和连字符的字符串-不知道这是否重要),删除所有过滤并再次过滤同一文件基于从列F提取的列表(其然后将向我示出99个原始行+包含针对所有这些行的附加信息的附加行)来计算(通过列F)。下面是我无法使用的代码部分。
有人知道我哪里做错了吗?

Dim LR As Long, ws As Worksheet, Criteria As Variant
       
Set ws = ActiveSheet
LR = ws.Range("A" & Rows.Count).End(xlUp).Row
  
Criteria = ws.Range("F2:F" & LR).SpecialCells(xlCellTypeVisible).Value
    
Cells.AutoFilter
    
LR = ws.Range("A" & Rows.Count).End(xlUp).Row
   
ActiveSheet.Range("A1:BY" & LR).AutoFilter Field:=6, Criteria1:=Application.Transpose(Criteria), _ 
Operator:=xlFilterValues

我的过滤只包括我想从F列中提取的值列表中的第一个值。
MsgBox (Criteria)似乎确认它只拾取了第一个值。

n53p2ov0

n53p2ov01#

所以我找到了一个解决方法,我只是将F列的值列表复制到新创建的第二个工作表(我的文件最初只有一个工作表),然后从那里定义我的变体,称为criteria。

Range("F2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
    
Sheets.Add After:=Worksheets(1)
    
Worksheets(2).Activate
    
Range("A1").Select
ActiveSheet.Paste
   
Dim LR As Long, ws As Worksheet, Criteria As Variant
Set ws = ActiveSheet
LR = ws.Range("A" & Rows.Count).End(xlUp).Row
    
Criteria = Worksheets(2).Range("A1:A" & LR)
    
Worksheets(1).Activate
    
Cells.AutoFilter
    
LR = ws.Range("A" & Rows.Count).End(xlUp).Row
    
ActiveSheet.Range("A1:BY" & LR).AutoFilter Field:=6, _ 
criteria1:=Application.Transpose(Criteria), Operator:=xlFilterValues

但是,如果有人有想法的话,我仍然会对我在原始代码中做错了什么感兴趣。

kq4fsx7k

kq4fsx7k2#

在过滤数据之前,请确保它尚未被过滤。如果已经过滤,代码将添加一个额外的过滤器,而不替换现有的过滤器。在第一个过滤器之前添加此选项以删除任何现有的过滤器:If ws.AutoFilterMode Then ws.AutoFilterMode = False
尝试将过滤后的数据复制到单独的工作表中,这样管理可能更容易。

'Create a temp sheet    
If Not SheetExists("TempSheet") Then ThisWorkbook.Sheets.Add _
    (After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)).Name = "TempSheet"
Dim TempSheet As Worksheet
Set TempSheet = ThisWorkbook.Worksheets("TempSheet")

'Copy your values to the temp sheet
Dim lastRow As Long
With ws
    lastRow = (.Range("A65536").End(xlUp).Row)
    .Range("F2" & ":F" & lastRow).SpecialCells(xlCellTypeVisible).Copy _
    TempSheet.Range("A1")
End With

'Now you create a string array with the results:
Dim lastTempRow As Long
lastTempRow = (TempSheet.Range("A65536").End(xlUp).Row)
Dim paramsArr() As String
ReDim paramsArr(lastTempRow - 1) As String
Dim i As Long
For i = 0 To lastTempRow - 1
    paramsArr(i) = TempSheet.Range("A" & (i + 1)).Value
Next i

'use the array as your criteria
ws.Range("A1:BY" & lastRow).AutoFilter Field:=6, Criteria1:=paramsArr, _
    Operator:=xlFilterValues

Application.DisplayAlerts = False
If SheetExists("TempSheet") Then TempSheet.Delete
Application.DisplayAlerts = True
  • SheetExists是一个关于HERE的函数:*
  • ETA:我在我意识到你回答之前发布了我的答案。我们的答案是相似的,但我会在我的答案中列出差异。

一些变化:

  • 提供了更多描述性变量名称
  • 为了提高效率,去掉了SelectActivate
  • .Copy方法中使用了Destination:=参数。这绕过了剪贴板,效率更高。
  • 命名添加的工作表。这使我能够在代码结束时轻松删除它,当它不再需要时。
  • Criteria而不是Variant指定了特定类型。这样更有描述性和效率。

相关问题