3

VBA でフィルター範囲を使用すると問題が発生します。マクロを使用して範囲をフィルター処理し、別のマクロを使用して Subtotal ワークシート関数を呼び出して最初の列の最小値を見つけると、フィルター処理された範囲の期待される最小値が得られます。これは私が欲しいものです。これを次に示します。

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

2 番目のケースでフィルタが機能していないように見える理由を誰か教えてもらえますか?

4

1 に答える 1

1

関数は、ワークシート オブジェクトを操作することは想定されていません。このトピックについていくつか質問がありますが、ワークシート関数内からサブルーチンを呼び出してワークシート オブジェクトを操作するのは良くないというのがコンセンサスです。

これを再現するために、いくつかの同様のコードを実行しました。

コードはエラーなしで実行されますが、ステップスルーすると、オートフィルターが実際には適用されていないことがわかります。

エラー/警告メッセージがあればいいのですが、これは設計によるものであると確信しています。

同様の質問に対する私の以前のコメント:

Excel VBA 2010関数でセル参照が機能しない

ワークシートから呼び出された 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 Basic サブルーチンを使用して行う必要があります。

計算中、Excel はユーザー定義関数を含むセルの参照元を調べます。計算プロセス中にすべての参照元が計算されていない場合、Excel は最終的にユーザー定義関数を呼び出し、Null または空のセルを関数に渡します。次に、Excel は、計算されるすべての参照元に対して十分な計算パスが発生することを確認します。最後の計算パスで、ユーザー定義関数にセルの現在の値が渡されます。これにより、ユーザー定義関数が予想よりも頻繁に呼び出され、予期しない引数で呼び出される可能性があります。したがって、ユーザー定義関数は予期しない値を返す場合があります。

正しく計算するには、計算で使用されるすべての範囲を引数として関数に渡す必要があります。関数の VBA コード内で範囲を参照する代わりに、計算範囲を引数として渡さない場合、Excel は計算エンジン内で範囲を考慮することができません。したがって、Excel は、ユーザー定義関数を計算する前に、すべての参照元が計算されることを確認するために、ブックを適切に計算しない場合があります。

于 2013-08-28T02:59:00.753 に答える