VBA通过广泛列范围内的关键字自定义过滤

时间:2015-12-29 12:26:46

标签: excel vba filter

我正在尝试在各种Excel列上编写过滤选项。我试图通过输入框和If / Then-sequence像bellow一样,但由于某种原因它会贯穿到最后的Else语句"不存在"。它似乎没有认出我的意见。

  Sub MultipleColumnsFilter()

  Range("N:N,U:U").ClearContents

  Application.ScreenUpdating = False

  Dim myValue1 As String
  Dim myValue2 As String


  myValue1 = InputBox("Enter desired Column")
  myValue2 = InputBox("Enter Keyword in selected column")


If myValue1 = c Then

With Worksheets("pump").Range("C:C")
    .AutoFilter
     '** Use temporary column 1
    .AutoFilter Field:=1, Criteria1:=myValue2
End With
Application.ScreenUpdating = True

ElseIf myValue1 = d Then

 With Worksheets("pump").Range("D:D")
    .AutoFilter
     '** Use temporary column 1
    .AutoFilter Field:=1, Criteria1:=myValue2
End With
Application.ScreenUpdating = True

ElseIf myValue1 = E Then
 With Worksheets("pump").Range("E:E")
    .AutoFilter
     '** Use temporary column 1
    .AutoFilter Field:=1, Criteria1:=myValue2
End With
Application.ScreenUpdating = True


ElseIf myValue1 = I Then
 With Worksheets("pump").Range("I:I")
    .AutoFilter
     '** Use temporary column 1
    .AutoFilter Field:=1, Criteria1:=myValue2
End With
Application.ScreenUpdating = True

Else

MsgBox (" does not exist ")

End If

当然,放弃If-else结构并使用某种Range函数(包括所需过滤区域的多列)会更好,但是当我尝试它时,它也没有工作。 有线索吗?

编辑:此外我想扩展功能并使用相同的结构来过滤OUT项,具体取决于一些键(myValue2)。 这怎么可行?我按如下方式更改了过滤部分

 .AutoFilter Field:=1, Criteria1:="<>myValue2"

但这似乎不起作用,它只是在没有错误的情况下运行脚本,但对单元格没有任何影响。 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

不确定这是唯一的问题,但

If myValue1 = c Then

c被认为是未声明的变量,因此c =“”,所以这一行实际上意味着:

If myValue1 = "" Then

这也适用于你所有的elseif语句。

只需使用引号:

If myValue1 = "c" Then

请记住,默认情况下,VBA在字符串比较中区分大小写。所以你要么必须添加:

Option Compare Text

位于您的模块顶部,位于您的第一个Sub之上,或者您可以使用以下格式:

If UCase(myValue1) = "C" Then

答案 1 :(得分:1)

以下是针对未知文本字符串过滤未知列的更通用的解决方案。

Dim myValue1 As String, myValue2 As String, myColumn As Long

myValue1 = InputBox("Enter desired Column")
myValue2 = InputBox("Enter Keyword in selected column")

If IsNumeric(myValue1) Then
    myColumn = Range("R1C" & myValue1).Column
Else
    myColumn = Range(myValue1 & 1).Column
End If

With Worksheets("pump")
    If .AutoFilterMode Then .AutoFilterMode = False
    With .Columns(myColumn)
        .AutoFilter Field:=1, Criteria1:=myValue2
    End With
End With
Application.ScreenUpdating = True

用户可以输入数字列索引或列字母标签,代码将确定要过滤的正确列。