Worksheet_Change 数値を時間として表示

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

リンクユニット


イベントマクロ 10回

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

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

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