記事キャッチ画像
 (25) イベント発生の停止と再開をVBAで行ない、イベント発生を制御する! 

 1. 四捨五入と、通貨(銀行)型丸め処理 

 2. イベント発生の停止と再開を、VBAで制御する 

  「広告」  
 

 (25)  イベント発生の停止と再開をVBAで行ない、イベント発生を制御する! 

Excel メニューバーの [ヘルプ] - [更新プログラムのチェック] にて、適用されていないアップデートがあれば行ってください。 

Excel 2016 for Mac 環境での説明となりますので、 Mac版 Excel 2011 では( VBA が利用できますが )同じ結果にならない場合があるかもしれません。

現状、 VBE 内で日本語を記述すると(貼り付けのみ可能な場合あり)乱れたり、保存時にクラッシュすることが多いため、 VBAコード は「未変換の英数字のみ」で記述してください。(テキストエディタからの貼り付けは可能)

( ユーザー定義関数 のVBAコードを含んだ)前回使用した XLSM ファイルを、「マクロを有効」にして開きます。

05

 [ alt ] + [ F11 ] にて VBE を開き、(上記画面赤枠の) SheetN を選択後、末尾に以下の VBAコードを入力するかコピーして貼り付け。
( SheetN は、2つ目に追加したワークシートで、 2 以外もありえる )

'----------------------------------------
'    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
    End If

End Sub

 1. 四捨五入と、通貨(銀行)型丸め処理 

Worksheet_Change イベントプロシージャは、セルの値が変更された時に実行される!
Application.Intersect( Range1, Range2 )
は、Range1 が Range2 に含まれない場合に Nothing を返す。
〜 Is Nothing と記述し、含まれる場合は Not 〜 Is Nothing と記述する。

空行を利用して、以下のように記述しても良い。
If 〜 Is Nothing then
Else
( 処理 )
End If

今回の場合、値が変更されたセルが「B2:B11」の範囲に含まれない場合は何も行わない。

復習となるが、IsNumeric 関数は 数値を示す場合に True を返し、Offset(y, x) は相対的に移動したセルを示す。

VB の Round 関数は4捨5入ではなく「通貨(銀行)型丸め処理」のため、5捨6入となる場合がある。
10.5 は 1011.5 は 12 といったように、偶数に丸められるからだ。
これに対し、馴染みのある4捨5入は「算術型丸め処理」と呼ばれ、 Excel のワークシート関数の ROUND() は4捨5入のため注意が必要!

さて、4捨5入は、0.5 を加算後に切り捨てれば良い。
Int 関数は、整数化(切り捨て)するためのVB関数。
セルに数値を格納した場合、デフォルトでは 倍精度浮動小数点型 ( Double 型 ) の値となる。


 2. イベント発生の停止と再開を、VBAで制御する 

説明を敢えて省略したが、セルの値を変更する箇所が EnableEvents の行で囲まれている。

これを忘れると、無限ループに陥ることになる!

なぜなら、 セルの値が変更された時 に、今回のイベントが発生するからだ。
以前説明したとおり、VBAコード操作でもイベントは発生する。
セルの値を VBAコードで変更したら、再度イベントが発生し 今回のイベントプロシージャの繰り返しとなってしまう。

よって、余分なイベントを処理しなくても良いように、イベントの発生を一時的に停止する必要がある。
そして、 VBAコードによるセルの値の変更が終了したら、イベントの発生を必ず再開させなければならない。
忘れたら、以降のイベントは一切発生しなくなるので、以下のようにサンドイッチする。

Application.EnableEvents = False
(余分なイベントを発生させてしまう処理)
Application.EnableEvents = True

なお、VBAコードの実行途中でストップした場合や何らかのアクシデントでイベントが無効になったままの場合は、イミディエイトウィンドウから 以下の行を実行する。( [return] キー要で、Events注意)
Application.EnableEvents = True


47
「B2〜B11」セルに数値入力前

57
「B2〜B11」セルに数値入力後



次回も、ワークシートのイベントプロシージャを学習します!


お疲れ様でした!
[command] + [Q] にてExcel を終了時、「作業中のブック」を保存するか確認のダイアログ画面が表示されるため 「保存」しましょう。
現状、 VBE 内で日本語を記述すると(貼り付けのみ可能な場合あり)乱れたり、保存時にクラッシュすることが多いため、 VBAコード は「未変換の英数字のみ」で記述してください。(テキストエディタからの貼り付けは可能)


「広告」
12月14日 (月) までAmazon「サイバーマンデーセール」実施中
最後まで読んでいただき、ありがとうございます。
ぜひ、右側の「人気ブログランキング」投票に ご協力ください。
また、お越しくださいませ。
// アタル


  「広告」