【问题标题】:My autofilter filtered the wrong criteria我的自动过滤器过滤了错误的标准
【发布时间】:2021-09-21 18:23:17
【问题描述】:

我是 VBA 的初学者,我有一个自动过滤宏,可以根据用户输入进行过滤。将生成一个新的电子表格,过滤后的数据将粘贴到新的电子表格中。

但我遇到的问题是这样的:

-------------------------------------------------
Example of data:

Name     Model       PO Number
Kevin    Winon       3000     
Billy    Kent        3001
Esther   Kent        3000
Tom      Master      3005

For example if the filtered criteria = 3000

Output receive is:
 
Name     Model       PO Number     
Billy    Kent        3001
Tom      Master      3005

Desired output

Name     Model       PO Number
Kevin    Winon       3000     
Esther   Kent        3000
---------------------------------------------------------------
My Code :

Sub po_finder()
Dim po_num As String

Sheets("Analysis").Unprotect "mech_eng_123"
po_num = UserForm_PO.TextBox1.Value

Sheets("Analysis").Select
ActiveSheet.Range("W1").AutoFilter Field:=23, Criteria1:=po_number
ActiveSheet.Range("A1:AW500").Select
Selection.Copy
Sheets.Add After:=ActiveSheet
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("Analysis").AutoFilterMode = False

End Sub

【问题讨论】:

  • 您声明了一个名为 po_num 的变量,但随后您执行了 Criteria1:=po_number。注意它们是不同的。始终使用Option Explicit 来避免此错误。另外,我认为您需要的是Criteria1:="=" & po_num

标签: excel vba


【解决方案1】:

您的条件将应用于列AS,因为ActiveSheet.Range("W1").AutoFilter Field:=23, Criteria1:=po_number 中的字段=1 将是列W。条件是“”,因为值 3000 位于 po_num 而不是 po_number

Sub po_finder()
    Dim po_num As String, ws As Worksheet, wsNew As Worksheet

    Set ws = Sheets("Analysis")
    ws.Unprotect "mech_eng_123"
    po_num = UserForm_PO.TextBox1.Value
    
    Set wsNew = Sheets.Add(After:=ws)
    With ws.Range("A1:AW500")
         .AutoFilter Field:=23, Criteria1:=po_num
         .Copy wsNew.Range("A1")
    End With
    ws.AutoFilterMode = False
    MsgBox "Data copied to " & wsNew.Name & " " & wsNew.UsedRange.Address, vbInformation

End Sub

【讨论】:

    【解决方案2】:

    过滤数据时,问题似乎出在“po_number”引用上。以前,您将该变量称为 po_num。试试这个:

    Sub po_finder()
    Dim po_num As String
    
    Sheets("Analysis").Unprotect "mech_eng_123"
    po_num = UserForm_PO.TextBox1.Value
    
    Sheets("Analysis").Select
    ActiveSheet.Range("W1").AutoFilter Field:=23, Criteria1:=po_num
    ActiveSheet.Range("A1:AW500").Select
    Selection.Copy
    Sheets.Add After:=ActiveSheet
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Sheets("Analysis").AutoFilterMode = False
    
    End Sub
    

    【讨论】:

    • 阅读此article 冷杉以避免选择。
    • 是的,我知道有更好的方法来做 AHMAD 试图做的事情;但是, po_number 是代码中的错误。避免选择、ActiveSheet 和硬编码范围(如“A1:AW500”)是最佳实践,但对于初学者来说可能会很困难。从这段代码的外观来看,一个简单的数据透视表就足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多