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

运行良好并打开自动过滤器。

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 自动过滤器是否应该只在 SUB 下工作而不是在函数中工作?

4

1 回答 1

1

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

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

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

在“这个工作簿”中:

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

在“模块1”中:

Public gx As Long

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

在 Sheet1 中,单元格 A5:

=我的公式(A4)

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

(请注意,您可能还对 Workbook_SheetChange 事件作为 SheetCalculate 事件的替代方法感兴趣。)

于 2012-08-06T21:08:29.483 回答