どなたか知識をお貸し頂けないでしょうか?
作業時間を把握する為に
「H列」に日付けを入力すると開始時刻が同じ行の「V列」に自動入力され
「J列」に日付けを入力すると終了時刻が同じ行の「W列」に自動入力され
同じ行の「X列」に(終了時刻)-(開始時刻)=(作業時間)が自動入力される
VBAは作成できたのですが、1点問題がでてきました。
休み時間を跨いで作業する場合「X列」に自動入力される(作業時間)から休み時間分を自動で引く
VBAを作成する事は可能でしょうか?
休み時間帯は
10:00~10:15の(15分間)
12:00~12:55の(55分間)
15:00~15:15の(15分間)
になります。
大変申し訳御座いませんが
どなたか、教えて頂けないでしょうか?
宜しくお願いいたします。
No.7ベストアンサー
- 回答日時:
どうもごめんなさい。
実はこちらで検証すると完全でないところがありました。
もう一つ分岐を追加する必要があります。
前回のコードの分岐の最後の部分の
>End If
と
>End Select
の間に
Case Is < TimeSerial(15, 0, 0)
If myEnd > TimeSerial(15, 15, 0) Then
.Value = .Value - TimeSerial(0, 15, 0)
End If
の4行を追加してください。
※ ほとんどないとは思いますが、上記コードがないと
出勤時刻が 15:00~15:15 の場合にお望みの結果にならないと思います。m(_ _)m
度々のご回答有難うございます。
教えて頂いたコードで先ほどじっくり検証させていただきました。
「パーフェクト」です。
すべて私の思っていた通りの結果が完璧に得られました。
明日から実務で使わせて頂きます。
大変助かりました。有難うございました。
No.8
- 回答日時:
またまた顔を出してしまいました。
コード内の
>Cells(i, "Y") = myStart
>Cells(i, "Z") = myEnd
の2行は消去してください。
こちらで検証するときに、休憩時間内の出勤・退勤がある場合の確認の意味でY・Z列に
計算する開始時刻と終了時刻を表示するようにしていました。
質問に対するしては必要ないものです。m(_ _)m
No.6
- 回答日時:
続けてお邪魔します。
すこし分岐を増やしてみました。
前回のSample1のコードは消去し、↓のコードにしてみてください。
Sub Sample2()
Dim i As Long
Dim myStart, myEnd
For i = 2 To Cells(Rows.Count, "V").End(xlUp).Row
If WorksheetFunction.CountBlank(Cells(i, "V").Resize(, 2)) = 0 Then
Select Case Cells(i, "V")
Case Is < TimeSerial(10, 0, 0)
myStart = Cells(i, "V")
Case Is < TimeSerial(12, 0, 0)
myStart = WorksheetFunction.Max(Cells(i, "V"), TimeSerial(10, 15, 0))
Case Is < TimeSerial(15, 0, 0)
myStart = WorksheetFunction.Max(Cells(i, "V"), TimeSerial(12, 55, 0))
Case Is < TimeSerial(15, 15, 0)
myStart = TimeSerial(15, 15, 0)
Case Else
myStart = Cells(i, "V")
End Select
Select Case Cells(i, "W")
Case Is <= TimeSerial(10, 15, 0)
myEnd = WorksheetFunction.Min(Cells(i, "W"), TimeSerial(10, 0, 0))
Case Is <= TimeSerial(12, 55, 0)
myEnd = WorksheetFunction.Min(Cells(i, "W"), TimeSerial(12, 0, 0))
Case Is <= TimeSerial(15, 15, 0)
myEnd = WorksheetFunction.Min(Cells(i, "W"), TimeSerial(15, 0, 0))
Case Else
myEnd = Cells(i, "W")
End Select
With Cells(i, "X")
.Value = myEnd - myStart
Select Case myStart
Case Is < TimeSerial(10, 0, 0)
If myEnd > TimeSerial(15, 15, 0) Then
.Value = .Value - TimeSerial(1, 25, 0)
ElseIf myEnd > TimeSerial(12, 55, 0) Then
.Value = .Value - TimeSerial(1, 10, 0)
ElseIf myEnd > TimeSerial(10, 15, 0) Then
.Value = .Value - TimeSerial(0, 15, 0)
End If
Case Is < TimeSerial(12, 0, 0)
If myEnd > TimeSerial(15, 15, 0) Then
.Value = .Value - TimeSerial(1, 10, 0)
ElseIf myEnd > TimeSerial(12, 55, 0) Then
.Value = .Value - TimeSerial(0, 55, 0)
ElseIf myEnd > TimeSerial(10, 15, 0) Then
.Value = .Value - TimeSerial(0, 15, 0)
End If
End Select
End With
Cells(i, "Y") = myStart
Cells(i, "Z") = myEnd
End If
Next i
End Sub
※ V・W列に色々時刻を手入力し、上記マクロを検証してみてください。
V・W列にデータを直接入力してもChangeイベントのマクロは実行されませんので
色んなケースを想定して時刻を入力してください。
※ 余計なお世話かもしれませんが・・・
労働時間を算出し、給与計算等に利用する場合は、例えば15分刻みで切り捨て!
といった操作が必要になるのではないでしょうか?m(_ _)m
度々のご回答有難うございます。
教えて頂いたコードで試行いたしました。
完璧です。
私の望んでいた通りの動きをしてくれました。
年明けから、実際に業務で使用させていただきたいと思っております。
やはり、ここまでの素晴らしいコードを組むとなるとそれなりに
熟練しないとできませんよね?
今回は大変助かりました。
有難うございました。
No.4
- 回答日時:
続けてお邪魔します。
>「X列だけマクロをご自身で実行する」とは・・・
前回のマクロを実行すると、X列に計算結果が表示されます。
今回はシートモジュールでも構わないと思いますので
前回のコード Sub Sample1()~End Sub までをこの画面上をドラッグ → 右クリック → コピー!
次にExcel画面の左下の表が入っているシート見出し上で右クリック → コードの表示 → VBE画面の空白部分
(Changeイベントのコードが入っていればその下でも構いません)、に貼り付け!
Excel画面に戻り、マクロを実行してみてください。
(Alt+F8キー → マクロ → マクロ実行です)
VBE画面にチェンジイベントのコード(No.1のコード)がある場合はすべて消去し
No.1の二つのコード
チェンジイベントのコードとSub・・・のコードの両方をコピー&ペーストしてください。
尚、前回投稿後気づいたのですが、
出勤時間・退勤時間が休憩時間の範囲内の場合はお望みの結果とは異なると思います。
もっと細かく分岐する必要があると思います。
※ 時間があるとき、ゆっくり考えさせてください。m(_ _)m
No.3
- 回答日時:
続けてお邪魔します。
X列の時間計算がお望みどおりにならない!というコトですが、
前回のコードはすべてChangeイベントで処理していますので、その辺でうまく動作しないのかもしれませんね。
ただこちらで今すぐ確認!というわけにはいかないので、
一案ですが、X列だけの操作はご自身でマクロを実行されてみてはどうでしょうか?
チェンジイベントはV・W列だけの操作にして・・・
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("H:H, J:J")) Is Nothing Or Target.Count > 1 Then Exit Sub
With Target
If .Value <> "" Then
If .Column = 8 Then
Cells(.Row, "V") = Now()
Else
Cells(.Row, "W") = Now()
End If
End If
End With
End Sub
だけにします。
次に↓のコードのマクロをご自身で実行してみてください。
Sub Sample1()
Dim i As Long
For i = 2 To Cells(Rows.Count, "V").End(xlUp).Row
If WorksheetFunction.CountBlank(Cells(i, "V").Resize(, 2)) = 0 Then
With Cells(i, "X")
.Value = Cells(i, "W") - Cells(i, "V")
Select Case Cells(i, "V")
Case Is < TimeSerial(10, 0, 0)
If Cells(i, "W") >= TimeSerial(15, 15, 0) Then
.Value = .Value - TimeSerial(1, 25, 0)
ElseIf Cells(i, "W") >= TimeSerial(12, 55, 0) Then
.Value = .Value - TimeSerial(1, 10, 0)
ElseIf Cells(i, "W") >= TimeSerial(12, 0, 0) Then
.Value = .Value - TimeSerial(0, 15, 0)
End If
Case Is < TimeSerial(12, 0, 0)
If Cells(i, "W") >= TimeSerial(15, 15, 0) Then
.Value = .Value - TimeSerial(1, 10, 0)
ElseIf Cells(i, "W") >= TimeSerial(12, 55, 0) Then
.Value = .Value - TimeSerial(0, 55, 0)
End If
Case Is < TimeSerial(15, 0, 0)
If Cells(i, "W") >= TimeSerial(15, 15, 0) Then
.Value = .Value - TimeSerial(0, 15, 0)
End If
End Select
End With
End If
Next i
End Sub
これで画像のような感じになります。
おそらくお示しの休憩時間は差し引かれていると思います。
※ 何度マクロを繰り返し実行しても構いません。
V・W列にデータが入っていればX列に結果が表示されるはずです。
尚、上記コードは前回のコードそのままで
>.Row
を
> i
に書き換えただけです。m(_ _)m
度々のご回答有難うございます。
大変、感謝しております。
申し訳ございませんが、あと1点だけご教授いただけませんでしょうか?
「X列だけマクロをご自身で実行する」とは
どのようにすれば宜しいでしょうか?
(勉強不足でスミマセン。これから、ちょくちょく勉強していくつもりです・・・)
No.2
- 回答日時:
No.1です。
投稿後、気づきました。
H・I列ではなく、H・J列でしたね。
前回のコードの
>If Intersect(Target, Range("H:I")) Is Nothing Or Target.Count > 1 Then Exit Sub
の1行を
>If Intersect(Target, Range("H:H,J:J")) Is Nothing Or Target.Count > 1 Then Exit Sub
に変更してください。
どうも失礼しました。m(_ _)m
早速のご返答ありがとうございます。
本日、実務中に教えて頂いたコードで実際に検証させていただきました。
下記内容以外は完璧でした。
休み時間を跨ぐ場合、「X列」の作業時間から下記休み時間分が差し引きされないようです。
10:00~10:15の(15分間)
12:00~12:55の(55分間)
15:00~15:15の(15分間)
お忙しい中、大変申し訳ございませんが
あと、どこを変更すれば完璧に実行できますでしょうか?
何かお気付きの点 等があれば教えて頂けませんでしょうか?
お力(知識)をお貸しいただけないでしょうか?
宜しくお願いいたします。
No.1
- 回答日時:
こんばんは!
一例です。
各列の表示形式はこのみの「時間(時刻)」にしておいてください。
シートモジュールです。
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("H:I")) Is Nothing Or Target.Count > 1 Then Exit Sub
With Target
If .Value <> "" Then
If .Column = 8 Then
Cells(.Row, "V") = Now()
Else
Cells(.Row, "W") = Now()
End If
End If
If WorksheetFunction.CountBlank(Cells(.Row, "V").Resize(, 2)) = 0 Then
With Cells(.Row, "X")
.Value = Cells(.Row, "W") - Cells(.Row, "V")
Select Case Cells(.Row, "V")
Case Is < TimeSerial(10, 0, 0)
If Cells(.Row, "W") >= TimeSerial(15, 15, 0) Then
.Value = .Value - TimeSerial(1, 25, 0)
ElseIf Cells(.Row, "W") >= TimeSerial(12, 55, 0) Then
.Value = .Value - TimeSerial(1, 10, 0)
ElseIf Cells(.Row, "W") >= TimeSerial(12, 0, 0) Then
.Value = .Value - TimeSerial(0, 15, 0)
End If
Case Is < TimeSerial(12, 0, 0)
If Cells(.Row, "W") >= TimeSerial(15, 15, 0) Then
.Value = .Value - TimeSerial(1, 10, 0)
ElseIf Cells(.Row, "W") >= TimeSerial(12, 55, 0) Then
.Value = .Value - TimeSerial(0, 55, 0)
End If
Case Is < TimeSerial(15, 0, 0)
If Cells(.Row, "W") >= TimeSerial(15, 15, 0) Then
.Value = .Value - TimeSerial(0, 15, 0)
End If
End Select
End With
End If
End With
End Sub
※ 未検証なので、お望みどおりにならなかったらごめんなさい。m(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【初歩】エクセルでのマクロ(...
-
【エクセル】無作為抽出
-
エクセルで行挿入した際、自動...
-
エクセルで反転コピー
-
エクセル VBA 指定の範囲内をコ...
-
EXCELにて複数列を同条件(色)...
-
シート保護の状態で行の追加を...
-
Excelの非表示列も含めてコピー
-
エクセルの複数のセルを一括で...
-
A1セルに入力したら、入力時間...
-
EXCELで○ヶ月を○年○ヶ月に変換...
-
Excelの入力規則で2列表示したい
-
お肉の下のシートを煮込んでし...
-
リンク元の日付が空白の時リン...
-
Excelで同じセルに箇条書きをし...
-
excelでSUBTOTAL関数を設定した...
-
複数の文字列のいずれかが含ま...
-
エクセル ボタンを押すとセルの...
-
Excelの条件付き書式で、計算式...
-
エクセルのセルが縦方向にのびる
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELにて複数列を同条件(色)...
-
シート保護の状態で行の追加を...
-
一行おきにコピーするマクロが...
-
Excelの非表示列も含めてコピー
-
エクセルで行挿入した際、自動...
-
エクセルの関数について(日付で...
-
エクセル マクロ 貼り付け先が...
-
エクセルで空白以外のセルの値...
-
エクセルで表示された値だけ行...
-
[Excel VBA]空白セル以外に連番...
-
エクセルVBA 複数列をコピーす...
-
エクセルで反転コピー
-
エクセル VBA 指定の範囲内をコ...
-
行数が不規則な一週間ごとの合...
-
特定の桁数を抽出
-
マクロで値がある列までコピー
-
【Excel-マクロ】グループとア...
-
Excel VBAで日にちを入力して線...
-
エクセルでA列セルが空白の時そ...
-
エクセルVBA 並び替え セルの...
おすすめ情報