始業と終業の時間を入力し勤務時間を計算しております。
時間は時:分:秒まで入力します。
例えば始業時間はA1に8:30:25 、終業時間はB1に17:00:45と入れております。
コロン(:)を省略できるととても楽になります。8:30:25は83025と入力、17:00:45は170045と入力して、
表示にはコロンが入り、セルの書式としては時刻と認識し時間差を(時間:分:秒)と計算出来ればありがたいです。
よろしくお願い致します。
VBAを使った(時間:分)のコロンを入力しないで、かつ表示にはコロンが入り、セルの書式としては時刻と認識し時間計算が出来る例は検索できました。
下記です。 t****さんありがとうございました。
ですがそれを秒まで拡大し(時間:分:秒)に対応できるVBAに変更できず困っております。
何卒よろしくお願い致します。
-----------------------------------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range) 'この行から
If Intersect(Target, Range("A:B")) Is Nothing Or Target.Count > 1 Then Exit Sub
With Target
If .Value <> "" Then
If IsNumeric(.Value) Then
If .Value < 2400 And .Value Mod 100 < 60 Then
Application.EnableEvents = False
.Value = TimeSerial(Int(.Value / 100), .Value Mod 100, 0)
.NumberFormatLocal = "h:mm"
Application.EnableEvents = True
Else
MsgBox "入力値が不正です"
.Select
.ClearContents
End If
End If
End If
End With
End Sub 'この行まで
-----------------------------------------------------------------------------
No.5ベストアンサー
- 回答日時:
変換ロジックを関数化して実装してみました。
「8:30:25」「83025」どちらの入力でも対応できているはずです。
ちなみに、2未満を入力すると日とみなし、2以上を入力すると秒とみなして表示されます(この辺はやってみて下さい)。
Private Sub Worksheet_Change(ByVal Target As Range) 'この行から
If Intersect(Target, Range("A:B")) Is Nothing Or Target.Count > 1 Then Exit Sub
With Target
If .Value <> "" Then
Application.EnableEvents = False
.Value = MyTimeValue(.Value)
If .Value = "" Then
MsgBox "入力値が不正です"
.Select
Else
.NumberFormatLocal = "[h]:mm:ss"
End If
Application.EnableEvents = True
End If
End With
End Sub 'この行まで
Function MyTimeValue(MyTime As Variant) As Variant
Dim t As Variant
Dim d As Variant
If IsNumeric(MyTime) And MyTime < 2 Then
MyTimeValue = MyTime
Exit Function
End If
On Error GoTo Fin
t = Split(Format(MyTime, "000:00:00"), ":")
d = Int(t(0) / 24)
t(0) = t(0) Mod 24
MyTimeValue = d + TimeSerial(t(0), t(1), t(2))
Fin:
End Function
No.4
- 回答日時:
>勤務時間の計算をする場合、終了時刻を30:36:25と入力できれば
それは、アップした後に気づきました。以下は、#3と基本構造は変わっていません。昔、一度やったことがあったことも思い出し、日付を足せばできます。
一旦、.Value = 文字の時間 で貼り付けて、再変換する方法か、どちらかだと思います。こちらは、あえてVBAらしくしました。
#3 には間違いがありましたので、ここでお詫びします。
> .NumberFormatLocal = "h:mm"
>日付値はどちらでもよいですが、時間値は、入力の前に入れるのが良いようです。
今回、この方式では、まったく別な数字が出ることが分かりました。発言の訂正をいたします。
書式は統一して使うようにしました。
.NumberFormatLocal = "[h]:mm:ss" '書式
'//
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myTime1 As Variant, myTime2 As Variant, myDay As Variant
If Intersect(Target, Range("A:B")) Is Nothing Then Exit Sub
If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
If Not IsNumeric(Target.Value) Then Exit Sub
With Target
myValue = .Text
If Len(.Value) = 3 Or Len(.Value) = 4 Then
myTime = Format(.Value, "0:00")
ElseIf Len(.Value) > 4 And Len(.Value) <= 6 Then
myTime = Format(.Value, "0:00:00")
Else
MsgBox "文字長が範囲外で時間に変換できません。", vbExclamation
Exit Sub
End If
End With
'-------主な変更部分----
myTime1 = Left(myTime, 2) '時間
myTime2 = Mid(myTime, 4) '分・秒
myDay = Int(myTime1 / 24) '日付を取り出す
myTime1 = CLng(myTime1) - myDay * 24 '残りの時間
myTime = myTime1 & ":" & myTime2 '元に戻す
With Target
If IsDate(myTime) Then
Application.EnableEvents = False
.Value = myDay + TimeValue(myTime)
.NumberFormatLocal = "[h]:mm:ss" '書式
Application.EnableEvents = True
Else
MsgBox "その数値は正しくありません。", vbExclamation
.ClearContents
End If
End With
End Sub
No.3
- 回答日時:
私も考えてみました。
秒まで入れる時と、時間・分までの時、両方が入ることができるように考えてみました。
時間・分が不要なら、その部分は、取り去ればよいです。
If Len(.Value) = 3 Or Len(.Value) = 4 Then
myTime = Format(.Value, "0:00") '分まで入力
ElseIf
上二行を削除して、ElseIf ->If に変える
それから、
.NumberFormatLocal = "h:mm"
日付値はどちらでもよいですが、時間値は、入力の前に入れるのが良いようです。
'//
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myTimee As Variant
If Intersect(Target, Range("A:B")) Is Nothing Then Exit Sub
If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
If Not IsNumeric(Target.Value) Then Exit Sub
With Target
myValue = .Text
If Len(.Value) = 3 Or Len(.Value) = 4 Then
myTime = Format(.Value, "0:00") '分まで入力
ElseIf Len(.Value) > 4 And Len(.Value) <= 6 Then
myTime = Format(.Value, "0:00:00") '秒まで入力
Else
Exit Sub
End If
If IsDate(myTime) Then
Application.EnableEvents = False
.NumberFormatLocal = "h:mm:ss" '秒までに変更
.Value = TimeValue(myTime)
Application.EnableEvents = True
Else
MsgBox "その数値は時間値として正しくありません。", vbExclamation
.ClearContents
End If
End With
End Sub
No.2
- 回答日時:
No.1 の修正です
.Value = TimeSerial(Int(.Value / 100), .Value Mod 100, 0)
.NumberFormatLocal = "h:mm"
上の2行を
.Value = CDate(Format(Target.Value, "00:00:00"))
.NumberFormatLocal = "h:mm:ss"
に変更するだけではダメですか?
ご回答ありがとうございます。上記変更と6行目にある2400を240000に変更することにより解決しました。誠にありがとうございました。
No.1
- 回答日時:
.Value = TimeSerial(Int(.Value / 100), .Value Mod 100, 0)
.NumberFormatLocal = "h:mm"
上の2行を
.Value = CDate(Format(Target.Value, "00:00:00"))
.NumberFormatLocal = "hh:mm:ss"
に変更するだけではダメですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【再投稿】VBAで動作しなくて困っています 2 2022/10/11 11:05
- Visual Basic(VBA) VBAのトグルボタンでのマクロについて質問です 3 2022/10/10 17:23
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- Visual Basic(VBA) [Excel VBA] このコードでは行の挿入や行の消去をすると13のエラーが出てしまう。 3 2022/12/09 00:29
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) エクセル VBAで複数セル選択時エラーになる問題 3 2022/10/04 02:40
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/02/02 09:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルのセル内に全角数字を...
-
Excelで全角の数字が半角になっ...
-
エクセルで文字列としての指数...
-
エクセルのセルや文字を点滅表...
-
エクセルで文字入力してEnterキ...
-
エクセルで時間入力10:30の:...
-
Excelで時間順で並べ替えしたい
-
WORD2010 差し込み印刷の時間...
-
EXCELで特定の文字列を入力→エ...
-
入力規則でスペース入力を禁止...
-
EXCELで勝手に予測入力される
-
エクセルの「○分○秒」の表示形...
-
文字の上にバーをつけるには?
-
エクセル関数で在庫数の増減を...
-
エクセルで【0.5日と1日】を表...
-
Excelで【1-1】【1-2】【1-3】...
-
エクセルで自動的にイコール(...
-
セルの書式設定が勝手に変わっ...
-
Excelで入力した数値を対応した...
-
エクセル 100メートル競争のタ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルのセル内に全角数字を...
-
Excelで全角の数字が半角になっ...
-
エクセルで文字入力してEnterキ...
-
Excelで時間順で並べ替えしたい
-
エクセルのセルや文字を点滅表...
-
EXCELで勝手に予測入力される
-
WORD2010 差し込み印刷の時間...
-
コクヨのリーフ仕入帳等にパソ...
-
エクセルの「○分○秒」の表示形...
-
EXCELで特定の文字列を入力→エ...
-
エクセルで文字列としての指数...
-
エクセルで自動的にイコール(...
-
エクセルで時間入力10:30の:...
-
セルに数字を入れると×1000にな...
-
Excelで【1-1】【1-2】【1-3】...
-
関数CONCATENATEの表示で
-
エクセルで分や秒の合計や平均...
-
平方センチメートルの入力の仕方
-
エクセル関数で在庫数の増減を...
-
入力規則でスペース入力を禁止...
おすすめ情報
ご回答ありがとうございます。 上記2点の変更だけでは駄目のようです。
すみません、追加の質問をさせてください。
下記の理由ため、
朝6時の場合30:00:00と入力することも可能としたいのですが、
御教授いただければ幸いです。よろしくお願い致します。
日をまたいだ勤務時間の場合
例えば開始時刻が22:35:20、終了時刻が6:36:25の時に
勤務時間の計算をする場合、終了時刻を30:36:25と入力できれば
計算が楽になるので。
以上よろしくお願いします。