Worksheet_Change 数値を時間として表示

Worksheet_Change 数値を時間として表示
Worksheet_Change 数値を時間として表示

イベントマクロ 10回

入力したり、変更したりした時にWorksheet_Changeイベントを利用

この記事で学べる内容

  • Worksheet_Changeイベントを利用して、セルの値を変更時に自動処理を実行する方法を理解する
  • Targetオブジェクトを使って、変更されたセルを特定する仕組みを学ぶ
  • If Target.Column = 3 Then の構文で、特定列(C列など)だけを処理対象に限定する方法を習得する
  • セルに入力された数値を自動的に時間形式に変換するマクロを作成できるようになる
  • イベントの再帰発生による「無限ループ」を理解し、その原因を学ぶ
  • Application.EnableEvents = False / True の正しい使い方を身につけ、イベントの一時停止と再開を制御する方法を学ぶ
  • NumberFormatLocal プロパティを使って、時間表示形式「[h]時間」に自動設定する方法を理解する
  • 実務で役立つ「入力値の自動変換マクロ」の仕組みを習得する
  • EnableEventsを使った安全なイベント制御の設計手法を学ぶ

数値を入力してそれを時間として使いたい場合に、イベントを利用して変換してみましょう。

ChangeイベントでTargetを処理する

1. 今回時間を入力するセル範囲は、C2:C10 ですが、C列なので、Columns(3)とすることもできます。
9回では Intersect(Target, Columns(3)) のように使いました。 今回は、Intersect関数を使わずに、If Target.Column = 3 Then としましょう。
数値で値を入力したら、それをX時間と表示することにします。ここまでの、操作をコードで表します。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 3 Then
        Target.Value = Target.Value / 24
    End If
End Sub

これで時間を表示できそうですが、ひとつ致命的な問題があります。それはイベントが起きた時にする処理が、Targetセルに対して行われることです。
つまりイベントが起きたら実行するコードで、再びイベントが起り、処理を実行する、そして再びイベント・・・という無限ループに入ってしまうのです。


Worksheet_Change 数値を時間として表示-1

Application.EnableEvents

2. この無限ループを避けるためのコードが Application.EnableEvents です。 はじめに、Application.EnableEvents = False とすることで、プロシージャ実行中のイベントを止めます。 つぎに、処理をします。最後にイベントを実行できるように、Application.EnableEvents = True として元の状態にもどします。


Worksheet_Change 数値を時間として表示-2
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 3 Then
        Application.EnableEvents = False
        Target.Value = Target.Value / 24
        Target.NumberFormatLocal = "[h]""時間"""
        Application.EnableEvents = True
    End If
End Sub

3. C列に数値を入力すると、時間として表示されます。


Worksheet_Change 数値を時間として表示-3

こちらもおすすめ