|
えっとですね・・。まず、かみちゃんさんとしては
「ユーザー定義関数の作り方を知っているような人なら、イベントマクロ
ぐらい知っているはず」と憶測して、"なのになぜ関数にこだわるのか"を
連発したのだと思います。でもVBAの知識などは、私でも何でも知っている
わけではないので、たぶん質問者さんも「目的とする処理はイベントマクロ
で全てやってしまえる」ということを知らなかったのだと思います。
それをもう少し早く察知していれば、関数を捨ててイベントマクロの適当な
サンプルを提示し、解決へ導くことができたのではないかと思います。
そのようなわけで、遅ればせながら私がマクロを提示してみます。
以下のコードをシートモジュールに入れ、必ず"C1→D1"の順で"時刻"
(:で時間と分を区切る形)を入力してみて下さい。つまりC1には始業時刻、
D1には終業時刻を入れるのです。すると"あたかも関数で計算したかのごとく"
A1に就労時間、B1に残業時間が表示されます。もちろん、規定の就業時間は
8時間ということにしています。お試しください。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Atm As Variant, Btm As Variant
Dim Stm As Variant, Etm As Variant
Dim Flg As Boolean
With Target
If .Address <> "$D$1" Then Exit Sub
If .Count > 1 Then Exit Sub
If WorksheetFunction.Count(Range("C1:D1")) < 2 Then
MsgBox "C1:D1には時刻を入力して下さい", 48
Flg = True: GoTo ReLine
End If
On Error Resume Next
Stm = TimeValue(.Offset(, -1).Text)
Etm = TimeValue(.Text)
End With
If Err.Number = 13 Then
MsgBox "C1:D1には時刻を入力して下さい", 48
Flg = True: GoTo ReLine
End If
On Error GoTo 0
If Stm > Etm Then
MsgBox "始業時刻が終業時刻より後になっています", 48
Flg = True: GoTo ReLine
End If
Atm = Etm - Stm
If Hour(Atm) > 8 Then
Btm = Atm - TimeValue("08:00:00")
Atm = TimeValue("08:00:00")
End If
ReLine:
Application.EnableEvents = False
If Flg Then
Target.Offset(, -1).Resize(, 2).Clear
Else
Range("A1").Value = Format(Atm, "h:mm")
Range("B1").Value = Format(Btm, "h:mm")
End If
Application.EnableEvents = True
End Sub
|
|