在VBA中过滤一个范围

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

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 

但是,如果从表中调用一个函数来首先调用filter过程,然后调用一个函数来查找最小值,那么它将在整个范围内select最小值,就像未过滤一样,如下所示:

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

谁能告诉我为什么filter似乎不能在第二种情况下工作?

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

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

代码执行没有错误,但如果你通过,你会看到,自动filter从来没有实际应用。

我相当肯定这是devise,虽然错误/警告信息会很好。

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

单元格引用在Excel VBA 2010函数中不起作用

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

更多信息在这里:

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

和这里:

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

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

例外情况是在子程序(有时)中调用的函数可以,但是这可能是一个坏的习惯,除了将值返回给子程序之外,其他任何东西都可以使用该函数。

而且,来自微软的大量文档:

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

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

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

用户定义函数的目的是允许用户创build一个自定义函数不包含在Microsoft Excel附带的函数中。 Microsoft Excel中包含的function也不能更改环境。 函数可以执行计算,将值或文本返回到所input的单元格中。任何环境更改都应通过使用Visual Basic子例程来完成。

在计算过程中,Excel将检查包含用户定义函数的单元格的先例。 如果在计算过程中到目前为止还没有计算所有的先例,Excel最终将调用用户定义的函数,并将一个空或空单元格传递给该函数。 然后,Excel将确保计算所有先例的计算通过量。 在最后的计算过程中,用户定义的函数传递单元格的当前值。 这可能会导致用户定义的函数被调用的次数比预期的要多,并且带有意外的参数。 因此,用户定义的函数可能会返回意外的值。

为了正确计算,计算中使用的所有范围都应作为parameter passing给函数。 如果您没有将计算范围作为parameter passing,而不是引用该函数的VBA代码中的范围,Excel将无法在计算引擎中对它们进行计算。 因此,Excel可能无法充分计算工作簿以确保在计算用户定义函数之前计算所有先例。