Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2757 / 13646 ツリー ←次へ | 前へ→

【66134】どのプロシージャが一番早いのでしょうか・・・ hoully 10/8/3(火) 17:05 質問[未読]
【66136】Re:どのプロシージャが一番早いのでしょう... UO3 10/8/3(火) 17:19 発言[未読]
【66142】Re:どのプロシージャが一番早いのでしょう... hoully 10/8/4(水) 16:43 お礼[未読]
【66139】Re:どのプロシージャが一番早いのでしょう... teian 10/8/3(火) 19:11 発言[未読]
【66143】Re:どのプロシージャが一番早いのでしょう... hoully 10/8/4(水) 16:45 お礼[未読]
【66140】Re:どのプロシージャが一番早いのでしょう... 通り魔 10/8/4(水) 1:30 発言[未読]
【66144】Re:どのプロシージャが一番早いのでしょう... hoully 10/8/4(水) 16:46 お礼[未読]
【66141】Re:どのプロシージャが一番早いのでしょう... teian 10/8/4(水) 16:30 発言[未読]
【66145】Re:どのプロシージャが一番早いのでしょう... hoully 10/8/4(水) 17:02 お礼[未読]

【66134】どのプロシージャが一番早いのでしょうか...
質問  hoully  - 10/8/3(火) 17:05 -

引用なし
パスワード
   B2〜B51に入るDDEでリアルタイムに更新されるデータの最大値をそれぞれC2〜C51に、最小値をそれぞれD2〜D51に記録するために以下の3つのプロシージャを考えています。

1つ目)
Private Sub Worksheet_Calculate()

If Range("B2").Value > Range("C2").Value Then Range("C2").Value = Range("B2").Value
If Range("B2").Value < Range("D2").Value Then Range("D2").Value = Range("B2").Value

If Range("B3").Value > Range("C3").Value Then Range("C3").Value = Range("B3").Value
If Range("B3").Value < Range("D3").Value Then Range("D3").Value = Range("B3").Value
・・・省略・・・(これがあと48組続きます)
End Sub

2つ目)
上記1つ目をforループを使って作る。

3つ目)
Private Sub Worksheet_Calculate()

If Range("B2").Value > Range("C2").Value Then Range("C2").Value = Range("B2").Value
If Range("B2").Value < Range("D2").Value Then Range("D2").Value = Range("B2").Value
End Sub

Private Sub Worksheet_Calculate()
If Range("B3").Value > Range("C3").Value Then Range("C3").Value = Range("B3").Value
If Range("B3").Value < Range("D3").Value Then Range("D3").Value = Range("B3").Value
End Sub

・・・省略・・・(これをあと48組作る)

上記3つのプロシージャに関して2つ質問があります。
1つ目)上記3つのプロシージャは全く同じ動作をするのでしょうか?3つ目だけ違う気がするのですが・・・。
2つ目)上記3つのプロシージャで一番メモリの消費量が少ない(動作が速い)のはどれなのでしょうか?
どなたか教えてください。
よろしくお願いいたします。

【66136】Re:どのプロシージャが一番早いのでしょ...
発言  UO3  - 10/8/3(火) 17:19 -

引用なし
パスワード
   ▼hoully さん:

こんにちは

やろうとしてられることがわからず、コードとしてこれがいいのかどうかは
わかりませんが、3つの比較だけでいえば 【早いのは】1です。
2は1と同じコード実行になり、かつループ制御の部分だけ余計に実行。
コード量としては2が少ないわけですが、これぐらいでプログラムメモリーが
どうこうというレベルではないですから。
(でも、私が書くなら、保守性も考慮すれば2のような形でしょうけど)
3は、それ以前というか、コンパイルエラーになっていませんか?

【66139】Re:どのプロシージャが一番早いのでしょ...
発言  teian  - 10/8/3(火) 19:11 -

引用なし
パスワード
   セルの数値の比較は、Max関数やMin関数に任せてしまってはどうでしょうか?
つまり、やってることは、
  Dim r As Range
  For Each r In Range("B2:D51").Rows
    With r.Cells
      .Item(2).Value = WorksheetFunction.Max(.Item(1), .Item(2))
      .Item(3).Value = WorksheetFunction.Min(.Item(1), .Item(3))
    End With
  Next
って感じで纏められそうですけどね。
早いかどうかは知りませんけどね。

なお、「メモリー消費量が少ない=動作が早い」ではないような気がします。

【66140】Re:どのプロシージャが一番早いのでしょ...
発言  通り魔  - 10/8/4(水) 1:30 -

引用なし
パスワード
   かかった時間ならTimer関数で調べられます

sub aaa()
dim a
a = Timer()

〜いろいろな処理〜

msgbox Timer - a
end sub

ただしTimerは午前0時を挟むとうまく測れません
APIのgettickcountやtimegettimeでも時間の取得ができます

【66141】Re:どのプロシージャが一番早いのでしょ...
発言  teian  - 10/8/4(水) 16:30 -

引用なし
パスワード
   まず、50行程度のセルの更新で処理スピードを気にしていることが、
よく分からないのです。

少し気になったのは、当該プロシージャはCalculateイベントですね。
このシート上の数式セルに、C2:D51の範囲のどこかを参照しているセルが
あるんじゃないでしょうか?
もしかして、単にイベント連鎖で処理遅延を起こしており、
処理スピードが気になったということではないですか?

であれば、Application.EnableEvents = False / True
でサンドイッチすれば気にならなくなるかもしれませんね。

とっても勝手な解釈なので、外れかもしれませんけど。

【66142】Re:どのプロシージャが一番早いのでしょ...
お礼  hoully  - 10/8/4(水) 16:43 -

引用なし
パスワード
   ▼UO3 さん:

ご回答ありがとうございます。

>3は、それ以前というか、コンパイルエラーになっていませんか?

3は実際に動かす前に質問したのですが、おっしゃるとおりでした。シートを50枚作って1つずつcalculateを記述してやれば大丈夫みたいです。
ありがとうございました。

【66143】Re:どのプロシージャが一番早いのでしょ...
お礼  hoully  - 10/8/4(水) 16:45 -

引用なし
パスワード
   ▼teian さん:

ご回答ありがとうございます。
初心者の私はItemを知りませんでした。これからItemを勉強して試してみます。
ありがとうございました。

【66144】Re:どのプロシージャが一番早いのでしょ...
お礼  hoully  - 10/8/4(水) 16:46 -

引用なし
パスワード
   ▼通り魔 さん:

親切にご回答ありがとうございました。

【66145】Re:どのプロシージャが一番早いのでしょ...
お礼  hoully  - 10/8/4(水) 17:02 -

引用なし
パスワード
   ▼teian さん:

再びのご回答ありがとうございます。
私の説明不足でご迷惑をおかけしました。
50行のセルの最大値・最小値を15分毎に記録して50枚のグラフを作っているのですが、これがとっても重くって。15分毎にエクセルが5〜10分非常に重くなって他の操作を受け付けなくなってしまうのです。そこで、重くなっている原因として考えたのがcalculateイベントだったのです。
しかし、今日偶然気がついたのですが、15分毎のデータを記録する直前にグラフを表示していないシートをアクティブにし、30秒ほど待ってからグラフを表示しているシートをアクティブにすると、以前の重さが気にならなくなるほど他の操作を受け付けるようになりました。
VBAやPCの素人の私には、なぜなのか理由はわかりませんが。
この度は本当にありがとうございました。

2757 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free