Execl2002ユーザ関数でApplication.Volatileを使うと毎回、再計算に時間がかかるので一回だけ再計算する方法を教えてください。
●[ツール]→[オプション]→計算方法:手動→[OK]で、
[F9]を押したときのみ再計算となります。
●マクロの最中に自動計算されるのを防ぐ目的ならば、
マクロの先頭に
Application.Calculation = xlManual
マクロの末尾に
Application.Calculation = xlAutomatic
を書けばいいと思います。
下記ページの最後の方に書いてあるように、
Application.Volatileでは時間が掛かりすぎる場合があり、
別の方法を選択すべき場合があります。
参考
http://www.relief.jp/itnote/archives/001873.php
具体的に何をしたいかを書いて頂けると、
具体的に回答できる可能性があります。
マクロでデータをあるセルに書き終えたときに
(Rangeなどで2000個近くのデータを書き換える)それに応じてユーザ関数が再計算処理したいのです
●やりたいこと
(ア)2000個近くのデータをマクロで書き換え
(イ)書き換えたデータに基づいてユーザ定義関数で計算する
(ア)の作業をやっている間は、
(イ)の作業をさせないようにしたい
というわけですよね。
●解決方法1
(イ)もマクロでやる。
※ただし、マクロをつくるのが大変ですね。
●解決方法2
(ア)と(イ)を2つのエクセルファイルに分ける。
(ア)をやっている間は、(イ)のファイルを閉じておけば
(イ)の再計算に悩まされることはありません。
分ける方法を具体例で説明します。
マクロでA1に値が書き込まれ
B1セルに =MyFunc(A1)というユーザー定義関数を使用しているとします。
先ず、このシートのタブ(見出し)を右クリックして
→[移動またはコピー]をクリック
→移動先ブック名:で[新しいブック]を選択
→[コピーを作成する]にチェックを入れる
→[OK]ボタンをクリック
コピーされたエクセルファイルのA1セルから、
元のエクセルファイルのA1セルを参照する。
すなわち、
元のエクセルファイルの名前が、Book1.xls
元のエクセルファイルのシート名が、Sheet1だとすると
=[Book1.xls]Sheet1!$A$1
とコピーされたエクセルファイルのA1セルに書き込むわけです。
次に、
元のエクセルファイルの標準モジュールにユーザー定義関数が書いてありますね。
その記述をコピーしたエクセルファイルの標準モジュールにコピーして下さい。
そして、
元のエクセルファイルのB1セルの記述を消去します。
ここで、一旦2つのファイルを保存して閉じて下さい。
次に、元のファイルだけ立ち上げて、
マクロを実行します。
ユーザー定義関数は消しましたので、処理スピードに影響しません。
マクロの処理が終わったら、
コピーしたエクセルファイルを開きます。
ユーザー定義関数が再計算を始めます。
もし始めなかったら、[F9]を押して下さい。
以上です。
なお、失敗すると大変ですので、
必ずもとのエクセルファイルのバックアップをとってから
やって下さい。
わかりにくいところがあるかも知れませんが、
2回までの回答の設定になっているようですので、
後は、他の方のアドバイスを参考にして下さい。
頑張って下さい。
ファイルを分割するのは、容量など負荷が多く検討できません。
●[ツール]→[オプション]→計算方法:手動→[OK]で、
[F9]を押したときのみ再計算となります。
●マクロの最中に自動計算されるのを防ぐ目的ならば、
マクロの先頭に
Application.Calculation = xlManual
マクロの末尾に
Application.Calculation = xlAutomatic
を書けばいいと思います。
ずばり問題なく正常な動作しました。当方の意図した質問に、的確で簡潔な回答ありがとうございます。
ずばり問題なく正常な動作しました。当方の意図した質問に、的確で簡潔な回答ありがとうございます。