Excel VBA自动过滤器内部功能

时间:2012-08-03 09:54:50

标签: excel vba excel-vba

Sub TurnAutoFilterOn()
'check for filter, turn on if none exists
  If Not ActiveSheet.AutoFilterMode Then
    ActiveSheet.Range("A1").AutoFilter
  End If
End Sub

运行良好并打开AutoFilter。

Function Req(ByVal MCode As String) As Integer
    TurnAutoFilterOn
End Function

不起作用。

Function Req(ByVal MCode As String) As Integer
'check for filter, turn on if none exists
  If Not ActiveSheet.AutoFilterMode Then
    ActiveSheet.Range("A1").AutoFilter
  End If
End Function

不起作用。

excel vba自动过滤器应该只在SUBs下工作而不在函数中吗?

1 个答案:

答案 0 :(得分:1)

上述评论者对于从单元格调用的函数更新工作簿(即任何单元格)是正确的 - 不允许/不支持它。

Excel提供了一个工作簿重新计算模型,在该模型中,它可以根据单元格公式预先计算单元间依赖关系。这允许(相对)有效地将变化从其原始源传播到依赖于它们的单元。当工作簿重新关闭完成时,它重复地(即递归地)传播变化,直到它们已经传播到其他公式中未被引用的单元格。它不允许单元格公式修改工作簿中的任何单元格;如果它支持它将有效地使预先计算的基于公式的依赖性分析无效(或至少显着削弱),并且需要另一种计算模型(可能效率低得多)。 (圆形单元格引用(直接或间接)对于此方法也存在问题,这使得历史函数有点棘手。)

但是,您可以做的是将一些数据记录在VBA数据结构中以供以后使用(在下面的示例中,非常简单的公共gx,但这种数据结构几乎可以是任何复杂性)。然后,您可以在使用事件重新计算工作簿后使用该记录的数据。工作表更改事件是计算后运行一些代码的方法(您编写子例程Worksheet_Calculate并将其放在工作表中),此时可以修改单元格。还有一个Workbook_SheetCalculation,它包含在ThisWorkbook的代码中,可能很有用。

在“ThisWorkbook”中:

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
    MsgBox "gx=" & gx
    Application.Worksheets("Sheet1").Range("A1") = gx
End Sub

在“Module1”中:

Public gx As Long

Function MyFormula(x As Long) As String
   gx = x
   MyFormula = "hello"
End Function

在Sheet1中,单元格A5:

= MyFormula(A4)

您将在上下文中弹出窗口,其中gx设置为A4中的数字(显示存储公式运行中的数据),以及修改工作表。现在,使用另一个数字修改A4,您将看到结果,因为更改A4会触发重新计算。

(请注意,您可能还对Workbook_SheetChange事件感兴趣,以替代SheetCalculate事件。)