• ベストアンサー

VBA 超初心者

下のプロシージャーを実行すると20秒ぐらい処理にかかります。 ステップインで見ても何度もこのプロシージャーを実行しているようです。 どうしてでしょうか? Private Sub Worksheet_Calculate()   Cells(30, 2).Value = 13 End Sub

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

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度だけの実行となるように思います。

hanesanxxx
質問者

お礼

参考になりました。ありがとうございました

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

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)
回答No.3

特定のセルに変更が加えられた時だけ計算を実行するなら こんな感じでどうでしょうか? 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)
回答No.1

ワークシート上で何か計算があったら、このマクロが実行されるの ですから、ワークシート上に何か変更がある場合=何か計算がある 場合に何度も実行されるのは、ある意味アタリマエなんですけど。 回避の方法は色々とあるのですが、最終的に何を実行したいのか 分からないので、アドバイスが難しいです。

関連するQ&A