
1. ワークシート内の「数式」が再計算された場合に Calculate イベントは発生するが、対象のセルは判らない
2. セルの数式が再計算され表示が変わっても、 Change イベントは発生しない
「広告」
(26) Excelワークシートの Change と Calculate イベントの違いを理解する!
Excel メニューバーの [ヘルプ] - [更新プログラムのチェック] にて、適用されていないアップデートがあれば行ってください。Excel 2016 for Mac 環境での説明となりますので、 Mac版 Excel 2011 では( VBA が利用できますが )同じ結果にならない場合があるかもしれません。
現状、 VBE 内で日本語を記述すると(貼り付けのみ可能な場合あり)乱れたり、保存時にクラッシュすることが多いため、 VBAコード は「未変換の英数字のみ」で記述してください。(テキストエディタからの貼り付けは可能)
( ユーザー定義関数 のVBAコードを含んだ)前回使用した XLSM ファイルを、「マクロを有効」にして開きます。

(1) VBAコードを入力する前に、「C2」セルに数式 =A2*B2 を入力
(2) 「C2」セルを [command] + [C] 等でコピー後、「C3:C11」セルを選択して [command] + [V] 等で貼り付け
(3) 1行めの見出しの入力と、「A2:A11」「B2:B11」「E2」セルの背景色を見易いように変更

[ alt ] + [ F11 ] にて VBE を開き、(上記画面赤枠の) SheetN を選択後、末尾に以下の VBAコードを入力するかコピーして貼り付け。
( SheetN は、追加した2つめのワークシートで、 2 以外もありえる )
赤枠の Else 以降の コードを(修正)入力するか、以下からコピーして貼り付ける。
'----------------------------------------
' Event: Worksheet_Change()
'----------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
Rem If Application.Intersect(Target, Range("B2:B11")) Is Nothing Then
Rem Else
If Not Application.Intersect(Target, Range("B2:B11")) Is Nothing Then
If IsNumeric(Target.Value) Then
Application.EnableEvents = False
Target.Offset(0, -1).Value = Target.Value
Rem ' 通貨型丸め処理(丸めた結果が偶数になるように、丸められる)
Rem Target.Value = Round(Target.Value, 0) ' 5捨6入 の場合あり
Target.Value = Int(Target.Value + 0.5) ' 4捨5入
Application.EnableEvents = True
End If
Else
MsgBox ActiveSheet.Name & " Event : " & Target.Address(False, False)
End If
End Sub
'----------------------------------------
' Event: Worksheet_Calculate()
'----------------------------------------
Private Sub Worksheet_Calculate()
MsgBox "ワークシート内の「数式」が再計算されました!"
End Sub
1. ワークシート内の「数式」が再計算された場合に Calculate イベントは発生するが、対象のセルは判らない

「B2〜B11」セルに、100.1 100.2 100.3 〜 100.9 101 などと入力して結果を確認する。
そして、「B2〜B11」範囲内の任意のセルの値を変更して、再度「Calculate イベントの発生」を確認する。
Calculate イベントプロシージャには「引数 Target」が無いのにお気付きだろうか?
これが Change イベントとの決定的な違いで、自シート内の数式のどれか1つでも再計算されると Calculate イベントが発生するが、どのセルが再計算されたのかは判らない。
今回「C2:C11」の範囲内でセルの再計算が実行される対象は、数式から逆算すると「B2:C11」「A2:A11」セルだ。
「B2:C11」「A2:A11」セルの値がどれか一つでも変更されると、対応する行の C列が 再計算される!
つまり、 Change イベントを適切に処理すれば、どの(範囲の)セルが再計算されるか判るはずだ。
なお、 Calculate イベントの発生は [ Excel 環境設定 ] - [計算方法] も関係しているので、再計算されない場合は [ 計算方法の設定 ] を確認する必要がある。
Windows版だが、「手動」に勝手に変更されることがよくあったので…

また、 Calculate イベントは 数式の対象となるセルの値 が変更されなくても、何らかのタイミングで発生する場合があるようだ。( Excel が自動計算を必要と判断した場合 )
2. セルの数式が再計算され表示が変わっても、 Change イベントは発生しない
これを確認するため、 Worksheet_Change イベントプロシージャ を一部修正(コード追加)した!
「B2:B11」以外のセルの値が変更された場合、 MsgBox でそのセルの場所を表示する。
「C2:C11」も「B2:B11」以外だが、「C2:C11」のセルのどれかが再計算されても Change イベントが発生しないことが判るはずだ。
これはよく考えると判ることで、再計算され表示が変わっても 「C2:C11」のセルの値(数式)が一切変更されないからだ。
次回も、ワークシートのイベントプロシージャを学習します!
お疲れ様でした!
[command] + [Q] にてExcel を終了時、「作業中のブック」を保存するか確認のダイアログ画面が表示されるため 「保存」しましょう。
現状、 VBE 内で日本語を記述すると(貼り付けのみ可能な場合あり)乱れたり、保存時にクラッシュすることが多いため、 VBAコード は「未変換の英数字のみ」で記述してください。(テキストエディタからの貼り付けは可能)
「B2:B11」以外のセルの値が変更された場合、 MsgBox でそのセルの場所を表示する。
「C2:C11」も「B2:B11」以外だが、「C2:C11」のセルのどれかが再計算されても Change イベントが発生しないことが判るはずだ。
試しに、「E2」セルに a 等と入力すると、MsgBox でそのセルの場所が表示される。
これはよく考えると判ることで、再計算され表示が変わっても 「C2:C11」のセルの値(数式)が一切変更されないからだ。
次回も、ワークシートのイベントプロシージャを学習します!
お疲れ様でした!
[command] + [Q] にてExcel を終了時、「作業中のブック」を保存するか確認のダイアログ画面が表示されるため 「保存」しましょう。
現状、 VBE 内で日本語を記述すると(貼り付けのみ可能な場合あり)乱れたり、保存時にクラッシュすることが多いため、 VBAコード は「未変換の英数字のみ」で記述してください。(テキストエディタからの貼り付けは可能)
「広告」amazon WINTER SALE
12月14日 (月) までAmazon「サイバーマンデーセール」実施中
最後まで読んでいただき、ありがとうございます。12月14日 (月) までAmazon「サイバーマンデーセール」実施中
ぜひ、右側の「人気ブログランキング」投票に ご協力ください。
また、お越しくださいませ。
// アタル
「広告」
コメント