- ベストアンサー
VBAユーザー関数の外部制御
- VBAユーザー関数の外部制御について解説します。
- ExcelのVBAで、ユーザー関数を外部から制御する方法について説明します。
- ユーザー関数の再計算時間を短縮するための方法を紹介します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ご質問の直接の回答としては application.calculation = xlcalculationmanual で一旦再計算を手動に止めておき、一渡りの処理を終えたら application.calculation = xlcalculationautomatic で再計算させます。 ただし。 >組み込みのワークシート関数と同様にするため、 Application.Volatile (True) で自動再計算するようにしており ごく一般論でいうと、ワークシートのセルを引数に取るユーザー定義関数で作成しておき、通常はvolatileは制御しません。 例: public function test(byval target as range) as variant test = 引数として渡されたセルの値を元に何某の計算を行う end function といった具合に工夫して作成することで、引数として与えたセルに変更を加えた(=再計算チェーンに載ってくる)場合のみ適切に再計算され、シート上の全部の当該関数が毎度毎度一斉に再計算されるみたいな事態は回避します。
その他の回答 (2)
- keithin
- ベストアンサー率66% (5278/7941)
再掲: >引数として与えたセルに変更を加えた(=再計算チェーンに載ってくる)場合のみ適切に再計算され 引数として与えたセルに変更を加えて無ければ、再計算チェーンに載らず放置されます。引数とせずコードの中で独自にどこかのセルの値を計算に使ってるだけでは、もちろん引数にはなりません。 どの値(変数)が変更された場合に再計算が必要なのか分析して、適切に引数として設計してください。
お礼
たびたびありがとうございます。 よく考えてみれば、ユーザー定義関数内で参照しているセルを変更しても、引数を変更しなければ関数が起動するはずはありませんね。 Application.Volatile (True) がなければ再計算しない理由がわかりました。
- WindFaller
- ベストアンサー率57% (465/803)
こんばんは。 > Application.Volatile (True) 基本的には、Volatile で、不揮発性を変更しても、無意味です。引数を入力の際に、再計算イベントが走りますから、多くを使う場合は不要です。要するに、入力するたびに、一斉に、再計算イベントが走ってしまって、処理が遅くなっているものだと思います。 実際、ワークシート関数で作れないものは、特殊な場合を除き、ほとんどありません。 >数百カ所以上のセルに使用しています。 ふつうは、VBAのユーザー定義関数を多用するのでしたら、プロシージャで処理したほうがよいです。 >他のVBAモジュールから、一時的にユーザー関数の処理内容を変更するようなことは可能でしょうか。 意味がよく分かりませんが、VBAでコードの内容を変えるという意味でしょうか。 もしそうなら、ユーザー定義関数の処理内容を変更することは、裏ワザとしてはあったとしても、VBAプログラマーとしては、それは禁じ手だと思います。
お礼
ありがとうございます。 > VBAでコードの内容を変えるという意味でしょうか。 その通りです。 30年以上前、Z80やMC6809のマシン語で処理速度を高めるため、処理内容に応じて自分自身のオペランドどころか、オペコードも書き換えるという裏技をよく使っていました。 当時から「禁じ手」であることは認識していましたが、ひょっとしたらVBAでもできるかもしれない、と思いました。
お礼
ありがとうございます。 application.calculation による制御で、自動計算による速度低下が回避できました。 > public function test(byval target as range) as variant ただ、ユーザー定義関数を上記のように変更しても、Application.Volatile (True)を入れなければ再計算しません。 私が作成したユーザー関数は、引数として渡されたセルだけでなく、引数に応じた、引数とは別のセルも参照して結果を返します。 これが関係しているのでしょうか。