- ベストアンサー
VBA 超初心者
下のプロシージャーを実行すると20秒ぐらい処理にかかります。 ステップインで見ても何度もこのプロシージャーを実行しているようです。 どうしてでしょうか? Private Sub Worksheet_Calculate() Cells(30, 2).Value = 13 End Sub
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Cells(30, 2) (=> B30) に13を代入した結果、 B30を参照しているセルの計算のし直しが必要となり 計算が発生します。 計算が発生すると、Worksheet_Calculateは ワークシートの計算終了時に呼び出されるものと 性質が決まっているので自然と呼び出されてしまいます。 これを回避するのは、計算終了時に、この呼び出しを しないように指示する必要があり、 Private Sub Worksheet_Calculate() Application.EnableEvents = False '呼び出し禁止 Cells(30, 2).Value = 13 Application.EnableEvents = True '呼び出し許可に復帰 End Sub とすると、1度だけの実行となるように思います。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
Worksheet_Calculate()をテストでやってみると B3に=A2+1と式を入れて、C3に=B3+1を入れる。 A2に数値2をいれる。 Private Sub Worksheet_Calculate() MsgBox "計算した " End Sub が実行され、1回だけ「計算した」が出る。 B3,C3の2回計算しているはずだが、1回しか出ない。 ですから、このVBAのため遅くなるのでなく、質問でのB30セルを使って計算しているセル(*)の割り出しと、その計算と、そのセル(*)をさらに使った計算式を入れているセルが、それ以下も連鎖的に波及するセルが、多く、セルの計算式も、複雑なためではないでしょうか。 VBAのコードの適・不適の問題でなく関数式でも起こることではないですか。 ーーーー 普通の事務処理で Private Sub Worksheet_Calculate() イベントを使うべきケースは 余りないと思う。 ーーーー ですから、自分の今のコード等を離れて、どういうときに、どういうことをしたいのかを示して、識者のアドバイスを受けた方が良いと思う。 ーーー 質問者がそうではないとは思うが、初心者は何かへんちくりんな方法で、複雑に処理していることがあるので。
- soaikats
- ベストアンサー率58% (14/24)
特定のセルに変更が加えられた時だけ計算を実行するなら こんな感じでどうでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) If (Target.Address <> "$E$2") Then Exit Sub Cells(30, 2).Value = 13 End Sub
- FEX2053
- ベストアンサー率37% (7991/21371)
ワークシート上で何か計算があったら、このマクロが実行されるの ですから、ワークシート上に何か変更がある場合=何か計算がある 場合に何度も実行されるのは、ある意味アタリマエなんですけど。 回避の方法は色々とあるのですが、最終的に何を実行したいのか 分からないので、アドバイスが難しいです。
お礼
参考になりました。ありがとうございました