我在使用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
有人能告诉我为什么过滤器在第二种情况下似乎不起作用吗?
答案 0 :(得分:0)
函数不应该操纵工作表对象。这里有关于该主题的几个问题,但共识是从工作表函数中调用子例程来操作工作表对象是一个坏主意。
我介绍了一些类似的代码,试图复制它。
代码执行时没有错误,但如果您单步执行,您将看到自动过滤器从未实际应用过。
我有理由相信这是设计的,虽然错误/警告信息会很好。
我之前对类似问题的评论:
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的环境。这意味着这样的 功能不能执行以下任何操作:
- 在电子表格中插入,删除或格式化单元格。
- 更改另一个单元格的值。
- 移动,重命名,删除或向工作簿添加工作表。
- 更改任何环境选项,例如计算模式或屏幕视图。
- 将名称添加到工作簿。
- 设置属性或执行大多数方法。
用户定义函数的目的是允许用户创建 自定义函数,不包含在附带的函数中 Microsoft Excel。 Microsoft Excel中包含的功能也不能 改变环境。函数可以执行计算 将值或文本返回到输入它们的单元格。 任何环境变化都应该通过使用Visual来实现 基本子程序。
在计算过程中,Excel会检查单元格的先例 包含用户定义的函数。如果不是所有的先例都是 计算过程中到目前为止计算,Excel最终 调用用户定义的函数并将Null或Empty单元格传递给 功能。 Excel然后确保发生足够的计算过程 对于所有先例都要计算。在最后的计算中 传递,用户定义的函数传递的当前值 细胞。这可能导致更多地调用用户定义的函数 经常超出预期,并有意想不到的论点。因此, 用户定义的函数可能会返回意外的值。
为了正确计算,计算中使用的所有范围 应该作为参数传递给函数。如果你没有通过 计算范围作为参数,而不是引用范围 在函数的VBA代码中,Excel无法解释它们 在计算引擎内。因此,Excel可能不够充分 计算工作簿以确保计算所有先例 在计算用户定义的函数之前。