プロが教えるわが家の防犯対策術!

前回も質問させて頂き回答をもらいましたが上手く出来ません。
再度教えて頂きたいです。
詳細は
A,D,F,H列に文字が入るとB,E,G,I列に文字を入れた時間が入るようになっており、
作業開始、中断、再開、終了時間と言うようになっております。
VBAで
Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("A:A,D:D,F:F,H:H")) Is Nothing Then Exit Sub

If Target.Count > 1 Then Exit Sub

If Target.Value = "" Then

Target.Offset(, 1).Value = ("")
Exit Sub

End If

Target.Offset(, 1).Value = Time()

End Sub
を入れています。
休憩時間を中断としていましたが作業者が何人もいて一つのPCなので休憩ごとの入力の手間を省くために休憩時間をまたぐ作業時間に対し自動で終了時間に休憩時間を差し引いた時間が出るようにしたく
Sub TEST1()

a = "10:37:0"

'7分引く
b = DateAdd("n", -7, a)

MsgBox b

End Sub
Sub TEST2()

a = "12:45:0"

'45分引く
b = DateAdd("n", -45, a)

MsgBox b

End Sub
Sub TEST3()

a = "15:08:0"

'8分引く
b = DateAdd("n", -8, a)

MsgBox b

End Sub
Sub TEST4()

a = "17:45:0"

'15分引く
b = DateAdd("n", -15, a)

MsgBox b

End Sub
を入れましたがVBAを教えて頂きそのままコピペしただけで私自身内容の理解もできてないのでこれが正解なのかも分かりません。
長文になりましたがどなたか教えて頂けないでしょうか?
宜しくお願い致します。

A 回答 (4件)

こんにちは。



マクロの件、どこまでご存知なのでしょうか?

分からなくても、ネットで検索すれば、色々と情報は出て来るかと。
例えば、下記で検索すると、色々とヒットすると思います。
Excel VBA Worksheet_Change(ByVal Target As Range)

マクロの内容を理解しないと、次に変更が必要になった場合など、修正が
 できないので、質問者さん自身が困る事になるかと思います。

No.3で載せたのが全てです。 最初から、色々と変わっていますが。
D列、F列は、使っていないという事で合っていますよね?

ただ、動作確認していないので、エラーになるかも知れませんが、
 その際は、少し調べて対応してみて下さい。
それでもダメなら、再度質問すれば、誰かは回答して貰えるかと思います。
    • good
    • 0
この回答へのお礼

分かりにくい説明で申し訳ありません。
本当にその通りだと思います。
自分でも勉強します。
ありがとうございました。

お礼日時:2021/08/29 13:55

おはようございます。



A列=10:00、B列=10:00 ここは、B列に表示だけ
H列=12:30、I列=???  休憩時間の最中の場合は?
 → ここの返信が欲しかったのですが、この様な場合はないでしょうか?

全て手入力で、動作確認していません。 また、エラーになるかも
 知れませんが、適宜修正してみて下さい。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim BreakTime As Long

If Target.Count > 1 Then Exit Sub
if Target.Column <> 1 And Target.Column <> 8 then Exit sub

Application.EnableEvents = False

If Target.Value = "" Then
Target.Offset(, 1).Value = ("")
Application.EnableEvents = True
Exit Sub
End If

BreakTime = 0
If Target.Column = 1 Then
Target.Offset(, 1).Value = Time()
Else
If Target.Value >= "10:37" Then BreakTime = 7
If Target.Value >= "12:45" Then ​BreakTime = BreakTime + 45
If Target.Value >= "15:38" Then ​BreakTime = BreakTime + 8
If Target.Value >= "17:45" Then ​BreakTime = BreakTime + 45
Target.Offset(, 1).Value = DateAdd("n", -BreakTime, Time())

End If

Application.EnableEvents = True

End Sub
    • good
    • 0
この回答へのお礼

有難うございます!
申し訳ありません。
H列→終了と表示I列に終了時刻
休憩時間に作業開始をする事はありません。
Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("A:A,D:D,F:F,H:H")) Is Nothing Then Exit Sub

If Target.Count > 1 Then Exit Sub

If Target.Value = "" Then

Target.Offset(, 1).Value = ("")
Exit Sub

End If

Target.Offset(, 1).Value = Time()

End Sub
この後に貼り付けたらよろしいでしょうか?

お礼日時:2021/08/29 12:21

おはようございます。



直接の回答ではありませんが、考え方は下記で合っているでしょうか?

A列と、H列は、バーコードリーダーでの読み取りで、時間入力になっているとゆう事でしょうか?
(例)
A列=10:00、B列=10:00 ここは、B列に表示だけ
H列=11:00、I列=10:53 I列は、休憩時間を差し引いた値 7分

A列=10:00、B列=10:00 ここは、B列に表示だけ
H列=13:00、I列=12:08 I列は、休憩時間を差し引いた値 7+45分

A列=10:00、B列=10:00 ここは、B列に表示だけ
H列=12:30、I列=???  休憩時間の最中の場合は?


あと、個人的な意見になりますが、現状の表示だと解り難いと思います。
I列は、そのままの時間を入れて、J列に休憩のTotal時間を入れ、
 K列に、実際に働いた時間を入れた方が良い様な気がします。

A列=10:00、B列=10:00 ここは、B列に表示だけ
H列=11:00、I列=11:00 I列は、H列に表示するだけ
J列=00:07、K列=00:53 J列は、Total休憩、K列は実際に働いた時間
もし、今までのフォーマットでなければ仕方ないですが。。。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
説明不足で申し訳ありません。
A,D,F,H列は全てバーコード読み込みです。
A列には作業に取り掛かる品番が入力されます。B列に取り掛かり始めた時刻が入力されます。C列に詳細、他の業務に移った場合D列に中断E列に中断した時刻、再度取り掛かったらF列に再開G列に再度取り掛かった時間そしてH列に終了I列に終了した時刻、別シートに中断、再開、を引いたトータルの合計を出しています。今までですと休憩開始も中断→再開をしていたのですがその手間を省きたくB列に時刻が入り休憩をまたぐ場合、終了時刻が入るI列に休憩時間を差し引いた時間を出したいのです。1作業にかかる工数時間を履歴としてとっています。
説明不足で申し訳ありませんが宜しくお願い致します。

お礼日時:2021/08/29 10:11

こんばんは。



質問者さんがどの様な動作を希望していて、どううまくいかないのかを
 説明して貰えないと、コードだけ見ても良く分かりません。

コードは、A、D、F、H列のどこかに文字を入れると、右隣のセルに、
 現状の時間を入れている? 様に見えますが。


あと直接は関係ありませんが、下記コードは追加した方が良いと思います。

If Target.Count > 1 Then Exit Sub
Application.EnabeleEvents = False  これを入れた方が良いと思います。
If Target.Value = "" Then


Target.Offset(, 1).Value = Time()
Application.EnabeleEvents = Ture  これを入れた方が良いと思います。
End Sub

理由は、マクロでセルに文字を入れると、また、Worksheet_Change(
 のコードが走ります。 まあ、先頭のif文で、Exit Subで抜けますが、
 少し間違えると、永久ループに陥る可能性があります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
説明不足で申し訳ありません。
休憩時間が10:30~10:37・12:00~12:45・15:00~15:38・
17:00~17:45となっています。
例えばA列:作業開始をバーコードでスキャンし開始時刻が10:00だったとするとB列に10:00と自動ででますH列:作業終了をスキャンし11:00だったとするとI列に終了時間の11:00がでます。この時に10:30~10:37の間の休憩時間7分間を終了時間から差し引いてI列に10:53と出るようにしたいのです。他の休憩時間もまたぐ場合もそのようにしたいのですが可能でしょうか?
説明が下手で伝わりにくいとは思いますが教えて頂けないでしょうか?

お礼日時:2021/08/29 08:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!