在VBA中过滤范围

时间:2013-08-27 16:37:38

标签: excel vba filtering

我在使用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

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

1 个答案:

答案 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可能不够充分   计算工作簿以确保计算所有先例   在计算用户定义的函数之前。