自动过滤器似乎无法应用

时间:2018-02-21 13:31:52

标签: vba excel-vba excel

我有一个值列表,我正在尝试对其应用自动过滤器。 所有这些都设置在while循环中。虽然过滤器值似乎正确,但我必须输入Excel单击过滤器菜单并再次单击“确定”。

Dim zaehlerHeights As Double

zaehlerHeights = 0.4
While zaehlerHeights <= 25
    Sheets("Rohdaten WG22").Select

        Columns("S:S").Select
        Range("Tabelle13[[#Headers],[HOEHE_VON]]").Activate
        ActiveSheet.ListObjects("Tabelle13").Range.AutoFilter Field:=19, Criteria1 _
        :="<" & zaehlerHeights, Operator:=xlAnd

        Columns("T:T").Select
        Range("Tabelle13[[#Headers],[HOEHE_BIS]]").Activate
        ActiveSheet.ListObjects("Tabelle13").Range.AutoFilter Field:=20, Criteria1 _
        :=">" & zaehlerHeights, Operator:=xlAnd
    ActiveSheet.AutoFilter.ApplyFilter

不确定为什么会这样。有什么想法吗?

修改 所以,多亏Mike和Peh,我们缩小了问题范围。似乎小数分隔符是问题所在。 我使用德语版的Excel,而迈克,他的解决方案适用于他,可能使用英语/美国版本。 我的分隔符是逗号,而迈克则是点。 VBA虽然将我的点翻译成逗号,却不能正确应用过滤器。 我们为变量尝试了replace(),但这也不起作用。 如果我通过足够的循环来达到整数值(例如1.0),过滤器就可以正常工作。

所以,仍然没有解决方案,但更好地了解错误。 我假设,如果我使用英文版的Excel,代码就可以了。对我来说,这更像是一个错误。

提前致谢 杰罗姆

4 个答案:

答案 0 :(得分:1)

您的代码中有很多您不需要的代码。您不希望过滤器中的所有.Select字段编号已经说明要过滤Field:=19的哪一列。

Dim zaehlerHeights As Double

zaehlerHeights = 0.4
While zaehlerHeights <= 25
    With Worksheets("Rohdaten WG22")
        .ListObjects("Tabelle13").Range.AutoFilter Field:=19, Criteria1 _
        :="<" & zaehlerHeights, Operator:=xlAnd

        .ListObjects("Tabelle13").Range.AutoFilter Field:=20, Criteria1 _
        :=">" & zaehlerHeights, Operator:=xlAnd
    End With

甚至更短

    With Worksheets("Rohdaten WG22").ListObjects("Tabelle13").Range
        .AutoFilter Field:=19, Criteria1:="<" & zaehlerHeights, Operator:=xlAnd
        .AutoFilter Field:=20, Criteria1:=">" & zaehlerHeights, Operator:=xlAnd
    End With

所以这应该已经过滤,并立即应用过滤器。

注意
,逗号为数字分隔符的非英语Excel版本中,使用= "=" & zaehlerHeights时可能会遇到问题,因为zaehlerHeights = 0.4是一个点(无法更改) )但Excel可能需要在过滤条件中使用,,因此您可能需要将.替换为,(例如使用replace()函数)。

但奇怪的是,在使用><<=>=时,Excel等待.

例:
例如。在德国Excel上,其值为例如。 0,3; 0,4;在Field19中0,5(注意逗号)

'these work …
.AutoFilter Field:=19, Criteria1:="<0.4"
.AutoFilter Field:=19, Criteria1:="<=0.4"
.AutoFilter Field:=19, Criteria1:=">0.4"
.AutoFilter Field:=19, Criteria1:=">=0.4"

'this doesn't work …
.AutoFilter Field:=19, Criteria1:="=0.4"

'but this works …
.AutoFilter Field:=19, Criteria1:="=0,4"

所以这可能就是为什么它不能与VBA一起使用,但是当你手动点击应用过滤器时它会起作用。

答案 1 :(得分:0)

也许您需要先清除过滤器:

Dim zaehlerHeights As Double
zaehlerHeights = 0.4
Sheets("Rohdaten WG22").Select
ActiveSheet.Range("Tabelle13").AutoFilter Field:=19
ActiveSheet.Range("Tabelle13").AutoFilter Field:=20
While zaehlerHeights <= 25

    ActiveSheet.ListObjects("Tabelle13").Range.AutoFilter Field:=19, Criteria1 _
    :="<" & zaehlerHeights, Operator:=xlAnd

    ActiveSheet.ListObjects("Tabelle13").Range.AutoFilter Field:=20, Criteria1 _
    :=">" & zaehlerHeights, Operator:=xlAnd

我还删除了一些不需要的代码。您不需要选择或激活您要过滤的内容,即过滤行中的内容。

修改

试试这段代码,我做了一些细微的修改

Dim zaehlerHeights As Double
zaehlerHeights = 0.4
Sheets("Rohdaten WG22").Select
ActiveSheet.Range("Tabelle13").AutoFilter Field:=19
ActiveSheet.Range("Tabelle13").AutoFilter Field:=20
While zaehlerHeights <= 25

    ActiveSheet.Range("Tabelle13").AutoFilter Field:=19, Criteria1 _
    :="<" & zaehlerHeights, Operator:=xlAnd

    ActiveSheet.Range("Tabelle13").AutoFilter Field:=20, Criteria1 _
    :=">" & zaehlerHeights, Operator:=xlAnd

答案 2 :(得分:0)

已经过去了一段时间,但是要解决这个问题:

实际上,这不是代码错误(最好通过更好的代码可以避免),而是MS Excel如何处理德语版本中的小数点分隔符的问题。

短期解决方案:通过将值读入数组来绕行。

我已将问题发布到Microsoft,但找不到该帖子了。在此期间,我转为英语客户,所以对我来说问题不再重要。

感谢所有帮助 杰罗姆(Jerome)

答案 3 :(得分:0)

如果您仍然需要基于逗号的Excel版本(例如德语)的解决方案:

Dim minDateString as String
minDateString = Replace(CStr(CDbl([minDate])), ",", ".")
Debug.Print minDateString

... [minDate]指的是命名范围,您可以用任何想要的值替换。

基本上,它会做什么:

1)以整数形式获取正确的值=> CDbl([minDate])

2)从整数转换为字符串=> CStr ()

3)用点=> Replace

替换逗号

之后,您可以这样称呼它:

.AutoFilter Field:=11, Criteria1:=">=" & minDateString, Operator:=xlFilterValues

应该可以! :)