VBA Excel中使用高级筛选方法,筛选日期条件的表格无效。

3

首先,我很高兴能加入这个很好的社区,这是我的第一篇帖子,所以提前为我在文章中可能出现的任何错误表示歉意。

我有一个名为example的表格,通过从Access文件导入数据生成,因此行数会动态变化...我正试图通过VBA将AdvancedFilter方法应用于该表格。
我使用工作表的第一行来复制表头,并在第二行设置过滤器的参数,因此在A1:D2范围内我得到了条件。从第5行开始,我有表格example:它从标题行开始,并继续包括所有的数据行,全部从Access文件导入,例如范围A5:D20
如果我手动应用高级筛选(单击高级筛选按钮并填写表单),指定表格A5:D30和条件范围A1:D2,它可以正常工作...但是,如果我使用表格名example而不是指定数据范围,结果就会不同,只有一行而不是我期望的五行(正确)...为什么?!
现在,如果上面的问题只是出于好奇(但我确信它与我的问题有关),那么主要问题是我正在尝试通过VBA代码做同样的事情。 我尝试过

 Worksheets("name").Range("example[#All]").AdvancedFilter _  
 Action:=xlFilterInPlace, CriteriaRange:=Range("A1:D2"), Unique:=False

并且

Worksheets("name").ListObjects("example").Range.AdvancedFilter _
Action:=xlFilterInPlace, CriteriaRange:=Range("A1:D2")

但两者都没有起作用:过滤操作未返回任何行。即使我尝试。
Worksheets("name").Range("A5:D30").AdvancedFilter _  
Action:=xlFilterInPlace, CriteriaRange:=Range("A1:D2"), Unique:=False

手动指定范围(不是我的问题的解决方案,因为范围会动态变化,但是出于测试目的...)问题仍然存在,代码没有返回任何行。

注意:如果我在上面的代码中选择 range而不是AdvancedFilter,则选择是正确的:整个带有标题的表格

第一个代码是自动编写的,如果我开始录制宏,手动进行过滤,然后停止录制宏(使用表格引用完全编写的代码)...奇怪的是,当我手动执行操作时(同时记录宏),它可以正确地进行筛选,但是如果我启动刚刚记录的宏...什么也没有,与运行上面编写的代码相同.

如果我打开公式->名称选项卡,我可以找到example表格,但是指定的范围不是从第5行开始而是从第6行开始...似乎没有考虑标题,不知道为什么...但是它是通过导入数据自动生成的,所以我不知道如何更改范围并保持对导入数据的引用...也许这就是问题所在?!?

不知道如何解决这个问题,请帮帮我 :)

编辑:
我正在使用的过滤条件中有两个日期条件,具体来说是:date <= xx/yy/zzzzdate >= aa/bb/cccc问题就在这里...如果我尝试用上面三种代码使用字符串条件进行筛选,它们可以工作,但如果我使用日期条件,则不行。所以我猜问题取决于VBA如何处理日期数据类型。有什么建议吗?

用于条件的单元格包含此公式("SE"是“IF”的意大利版本):

=SE(filtro!F2="";"";">="&filtro!F2)
=SE(filtro!F3="";"";"<="&filtro!F3)

我从另一个工作表 ("filtro") 获取条件,如果单元格已填充,则使用 <= 或 >= 报告插入的数据以满足该条件,否则,该单元格保持为空以不设置任何条件。
谢谢,Ettore。

我无法重现您在使用VBA编程高级筛选时出现的表名问题。就命名而言,您看到的行为是正常的。表名只会引用数据范围。如果您想包括标题范围(应该这样做),请使用“Table1[#All]”格式。可能是您的数据或您设置的条件有问题。 - Ron Rosenfeld
我猜如果问题取决于数据或条件的问题,过滤器在“手动”模式下不应该工作...但是在同一张表格中,同一张表格,相同的数据,相同的条件,如果我通过单击按钮并填写与我编写的第三个代码中使用的相同范围的表单来启动高级过滤器...它可以工作...也许这取决于表_example_是通过导入数据自动生成的? - EttoreP
有时候,使用日期作为条件或者使用本地分隔符作为条件,在VBA中处理起来会与手动处理不同。由于根据您提供的信息我无法重现您的问题,因此我能做的也就不多了。如果您愿意,可以上传一个演示问题的工作簿(请删除敏感信息),并将其发布到某个公共共享网站上,然后在这里发布链接。 - Ron Rosenfeld
@RonRosenfeld 您是正确的!我试图过滤日期条件...如果我尝试更改条件并使用字符串,则可以运行我发布的所有三个代码...该死,我没有尝试。因此,问题取决于VBA如何处理日期数据。我将编辑问题并加入这一点...但问题仍然存在 ;) - EttoreP
准则具体是什么样子?例如,标准单元格中显示的确切内容是什么?如果filtro!F2包含实际日期,则它仍应该起作用。正如我所写的那样,试图在无法重现您的问题的情况下进行故障排除非常繁琐且没有回报。您不能设计一个能够重现问题的工作簿吗? - Ron Rosenfeld
3个回答

0

在日期格式字段中,通过使用等号 = 来填充空单元格的 CRITERIA。

Excel 高级筛选会将其理解为空白单元格。


0

请尝试以下步骤。这对我有效。

首先,我们应该创建一个命名区域(定义名称)(称为Table),使用公式=OFFSET(Sheet1!A5,0,0,COUNTIF(Sheet1!$ A $ 5:$ A $ 100,“<>”),4)动态地给出范围。

在创建名称范围 - Table时,粘贴此偏移公式。

此公式将动态更改范围。

编写以下VBA代码

Sub Advanfil() ' ' Advanfilt Macro '

' Range("Table").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _ Range("A1:D2"), Unique:=False End Sub

我认为以上内容应该能够帮助您解决困难。


子程序 Advanfil() 范围("表格").高级筛选 操作:=xlFilterInPlace, 条件范围:= 范围("A1:D2"), 唯一:=False 结束子程序 - Naresh R
谢谢您的回复,但我不能按照您建议的设置动态范围,因为表格可能会有超过100行,这种情况下偏移量将是错误的。我可以使用类似_Sheet1!$A$5:$A$10000_的东西来扩展范围,但这看起来不是一个好主意,因为如果表格只有10行(维度动态变化),Excel将检查10000行...如果我的表格增长超过10000行,问题仍然存在。无论如何,我已经有一个保存精确范围的表格,那么为什么不使用它呢?无论如何,问题似乎在于VBA处理日期数据类型的方式。 - EttoreP

0

好的,最终我解决了这个问题并想分享解决方案。
正如我在问题编辑中提到的那样,筛选器的两个条件是日期,我发现了两个问题,它们都与此有关:

当我从其他来源(访问文件)导入数据并填充要过滤的表时,我没有为字段设置适当的格式,而是将所有内容留给Excel决定,这是一个问题。正确的方法是设置:
  1. 表中的字段(包含要过滤的数据)为预格式化的日期格式(对我来说不简单,因为它们在访问中存储为文本,所以我必须制作一个SQL字符串以提取正确类型和格式的数据)。
  2. 用于存储过滤条件的字段为通用(在我的情况下,此字段包含我在编辑问题时提到的公式)。
  3. 插入用于过滤的日期的字段(公式中引用的字段)为日期,格式与表格字段相同(第1点)。
我在编辑问题中提到的公式查看一个单元格(我在其中插入日期),如果该单元格已填写,则返回类似于<=data-inserted>=data-inserted的内容(这没问题),但是当单元格中没有插入任何内容时,返回""。对于筛选器中的字符串条件,这没问题,但对于日期条件则不行,这会导致筛选器在填有日期的表字段中找不到任何内容。我尝试使用null值或其他类似的,但我找不到日期条件下的nothing是什么...所以我使用的解决方法是在我不想限制更大或更小日期时返回<=31/12/2100>=01/01/1900

希望这能帮到某个人。
Ettore


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接