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 Change Event は、セルを変更しても問題ないときに、計算 (サブルーチン Worksheet_Calculate を作成してワークシートに配置) 後にコードを実行する方法です。ThisWorkbook のコードに入る Workbook_SheetCalculation もありますが、これは興味深いかもしれません。

「このワークブック」で:

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:

=マイフォーミュラ(A4)

gx が A4 の数値に設定されたコンテキストでポップアップが表示され (数式の実行からのデータの保存を示します)、ワークシートも変更されます。ここで、A4 を別の数値で変更すると、A4 を変更すると再計算がトリガーされるため、結果が表示されます。

(SheetCalculate イベントの代わりに、Workbook_SheetChange イベントにも関心があるかもしれません。)

于 2012-08-06T21:08:29.483 に答える