【问题标题】:Filtering a range in VBA在 VBA 中过滤范围
【发布时间】:2013-08-30 12:49:37
【问题描述】:

我在 VBA 中使用过滤范围时遇到问题。 如果我使用宏来过滤范围,然后使用另一个来调用小计工作表函数以在第一列中找到最小值,我会得到过滤范围的预期最小值;这就是我要的。此处显示:

Sub TestFilterTrans()
    Call FilterTrans("111Wall")
End Sub

Sub TestMinDate()
    MsgBox MinTransDate()
End Sub

Sub FilterTrans(Inv As String)
    Range("TransLabels").Select
    Selection.AutoFilter
    ActiveSheet.Range("Trans").AutoFilter Field:=2, Criteria1:=Inv
End Sub

Function MinTransDate()
    MinTransDate = Application.WorksheetFunction.Subtotal(5,     Worksheets("Transactions").Range("TransDates"))
End Function

但是,如果从工作表中,我调用一个函数首先调用过滤过程,然后调用一个函数来查找最小值,它会选择整个范围内的最小值,就像未过滤一样,如下所示:

Function IncepDate(Inv As String)
    Dim d As String
    Call FilterTrans(Inv)
    d = MinTransDate()
    Call FilterOff
    IncepDate = d
End Function

谁能告诉我为什么过滤器在第二种情况下似乎不起作用?

【问题讨论】:

  • 通常一个函数只返回一个值并且不对工作表进行其他更改。您可能需要使用 Sub 而不是 Function 来操作过滤器。
  • 我认为 "from a sheet" 是这个问题的根源。请参阅下面的答案:)

标签: excel vba filtering


【解决方案1】:

函数不应操作工作表对象。这里有几个关于该主题的问题,但一致认为从工作表函数中调用子例程来操作工作表对象是一个坏主意。

我通过一些类似的代码来尝试复制它。

代码执行没有错误,但如果你单步执行,你会发现自动过滤器从未真正应用过。

我有理由确定这是设计使然,尽管错误/警告消息会很好。

我之前对类似问题的评论:

Cells reference not working in Excel VBA 2010 Function

无法从工作表调用的 UDF 中操作工作表单元格。

更多信息在这里:

https://stackoverflow.com/a/15647054/1467082

这里:

http://www.excel-it.com/UDF.htm

一般来说,子程序可以操作工作表,而函数不能。

例外情况是从子例程中调用的函数(有时)可以,但是将函数用于除向子例程返回值之外的任何事情可能是一个坏习惯。

而且,Microsoft 提供了大量关于此的文档:

http://support.microsoft.com/kb/170787

工作表单元格中的公式调用的用户定义函数不能 更改 Microsoft Excel 的环境。这意味着这样一个 函数不能执行以下任何操作:

  • 在电子表格中插入、删除或格式化单元格。
  • 更改另一个单元格的值。
  • 向工作簿移动、重命名、删除或添加工作表。
  • 更改任何环境选项,例如计算模式或屏幕视图。
  • 为工作簿添加名称。
  • 设置属性或执行大多数方法。

用户定义函数的目的是允许用户创建一个 未包含在随附函数中的自定义函数 微软 Excel。 Microsoft Excel 中包含的功能也不能 改变环境。函数可以执行计算 将值或文本返回到输入它们的单元格。 任何环境变化都应通过使用视觉 基本子程序。

在计算过程中,Excel 会检查单元格的先例 包含用户定义的函数。如果不是所有的先例都是 计算过程中计算到目前为止,Excel最终 调用用户定义的函数并将 Null 或 Empty 单元格传递给 功能。 Excel 然后确保发生足够的计算传递 用于计算所有先例。在最终计算期间 传递,用户定义的函数被传递的当前值 细胞。这可能会导致用户定义的函数被调用更多 经常出乎意料,并且有意想不到的争论。所以, 用户定义的函数可能会返回意外的值。

为了正确计算,计算中使用的所有范围 应该作为参数传递给函数。如果你没有通过 计算范围作为参数,而不是引用范围 在函数的 VBA 代码中,Excel 无法解释它们 在计算引擎中。因此,Excel 可能无法充分 计算工作簿以确保计算所有先例 在计算用户定义函数之前。

【讨论】:

  • 根据上面的回答,我把调用从函数改成了子程序,这样就解决了问题。
  • 请考虑将此答案标记为“已接受”,因为它已经解决了您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多