我有一个值列表,我正在尝试对其应用自动过滤器。 所有这些都设置在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,代码就可以了。对我来说,这更像是一个错误。
提前致谢 杰罗姆
答案 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
应该可以! :)