エクセルで時間計算を行いたいと思っています。
具体的には、総時間と開始時間を入れると、ある特定の時間(休憩時間)を考慮して終了時間を自動算出するというものです。
なるべく関数でやりたいと思っています。
例
総時間 開始時間 終了時間
180 13:30 16:40 (下記③の休憩時間を総時間に追加)
540 8:30 19:50 (下記①、②、③、④の休憩時間を総時間に追加)
60 11:00 12:00 (休憩時間追加無し)
300 23:00 4:20 (下記⑥の休憩時間を総時間に追加)
休憩時間
①10:30~10:40
②12:00~13:00
③15:30~15:40
④17:30~18:30
⑤22:00~23:00
⑥2:30~2:50
⑦5:30~6:00
No.8ベストアンサー
- 回答日時:
No7です。
>時刻表示に関しては特にこだわりはありませんので、アドバイス頂きました内容でも大丈夫です。
>マクロが簡単になるとの事ですが、№5のマクロから更に簡単に出来るという事でしょうか?
もし、時刻表示を25:00のようにしても問題ないなら、マクロは以下のようになります。
前回のは破棄してください。
又、8時前の開始にも対応しています。(添付図の赤線で囲んだところ)
(添付図の青線は従来の24時を超えたときの休憩開始時刻です)
添付図の例では
C2へ
=EndTime(A2,B2,$E$2:$F$10)
と入力し、オートフィルで下へコピーしています。(休憩時間テーブルの範囲が2行増えています)
-------------------------------------------------------------------
Option Explicit
'TTime:総時間(単位:分)
'STime:開始時間(HH:MM形式)
'TTable:休憩時間テーブルの範囲(開始時間の先頭セル:終了時間の最後のセル)
'上記の情報から終了時間(HH:MM)を算出する
'終了時間=開始時間+総時間+休憩時間テーブルの該当休憩時間の和
Public Function EndTime(ByVal TTime As Variant, ByVal STime As Variant, ByRef TTable As Range) As Variant
Dim i As Long
Dim etime As Variant
Application.Volatile
EndTime = ""
'総時間と開始時刻が空白なら、終了時間は空白
If TTime = "" And STime = "" Then Exit Function
EndTime = CVErr(xlErrValue)
'総時間と開始時刻の何れかが空白なら、終了時間は#VALUE
If TTime = "" Or STime = "" Then Exit Function
'総時間と開始時刻の何れかが不正なら、終了時間は#VALUE
If IsNumeric(TTime) = False Or IsNumeric(STime) = False Then Exit Function
'休憩時間テーブルが2列でないなら、終了時間は#VALUE
If TTable.Columns.Count <> 2 Then Exit Function
etime = STime + (TTime / 1440)
For i = 1 To TTable.Rows.Count
If TTable.Cells(i, 1).Value > STime And TTable.Cells(i, 1).Value < etime Then
'開始時間<休憩開始時間かつ休憩開始時間<終了時間なら、休憩時間を終了時間に加算
etime = etime + (TTable.Cells(i, 2).Value - TTable.Cells(i, 1).Value)
End If
Next
EndTime = etime
End Function
No.12
- 回答日時:
No.2です。
作ってみました。こんな感じです。提示されている要件では、休憩時間を指定していますが、これを稼働時間に変更しています。稼働時間は、セル範囲で指定するようにしています。ちなみに、添付画像のB9セルは、翌日の0:00なので注意してください。
基本的に日を跨ぐような総時間でも対応できるようにしていますが、無限ループを防止するために10日を超えるような場合はエラーにしています。
Function 終了時刻(総時間 As Variant, 開始時刻 As Variant, 実働範囲 As Range) As Variant
Dim a As Variant
Dim i As Long
Dim d As Long
Dim f As Boolean
Dim s As Variant
Dim t As Variant
a = 実働範囲
s = 総時間 / (24 * 60)
Do
For i = LBound(a) To UBound(a)
If f Then
t = t + a(i, 2) - a(i, 1)
Else
If 開始時刻 < a(i, 2) Then
f = True
If 開始時刻 < a(i, 1) Then
t = a(i, 2) - a(i, 1)
Else
t = a(i, 2) - 開始時刻
End If
End If
End If
If t >= s Then
終了時刻 = d + a(i, 2) - (t - s)
Exit Function
End If
Next i
d = d + 1
If d > 10 Then Err.Raise 1000
Loop
End Function
No.11
- 回答日時:
何度もごめんなさい。
No.6・9・10です。
前回は勘違いしていました。
終了時刻が休憩時間内にかかった場合は、休憩時間分をその休憩時刻終了以降に回す必要があるのですね。
前回のコードは消去し、↓のコードに変更してみてください。
Sub Sample3()
Dim i As Long, k As Long, myTime
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
myTime = Cells(i, "B") + Cells(i, "A") / 24 / 60
For k = 2 To Cells(Rows.Count, "E").End(xlUp).Row
If Cells(k, "E") > Cells(i, "B") Then Exit For
Next k
Do
If Cells(k, "F") > myTime Or Cells(k, "F") = "" Then Exit Do
myTime = myTime + Cells(k, "G") / 24 / 60
k = k + 1
Loop
If myTime > Cells(k, "E") And myTime < Cells(k, "F") Then
myTime = Cells(k, "F") + (myTime - Cells(k, "E"))
End If
Cells(i, "C") = myTime
Next i
End Sub
今度はどうでしょうか?m(_ _)m
No.10
- 回答日時:
No.6・9です。
>例えば、11:30開始時間で総時間60分としたら、終了時間は13:30になりますが、12:30の結果になりました。
すなわち、C列表示の時刻が休憩時間内になった場合は、休憩時間の最終までにすれば良いのですかね?
↓のコードにしたらどうなりますか?
Sub Sample2()
Dim i As Long, k As Long, myTime
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
myTime = Cells(i, "B") + Cells(i, "A") / 24 / 60
For k = 2 To Cells(Rows.Count, "E").End(xlUp).Row
If Cells(k, "E") > Cells(i, "B") Then Exit For
Next k
Do
If Cells(k, "F") > myTime Or Cells(k, "F") = "" Then Exit Do
myTime = myTime + Cells(k, "G") / 24 / 60
k = k + 1
Loop
If myTime > Cells(k, "E") And myTime < Cells(k, "F") Then
myTime = Cells(k, "F")
End If
Cells(i, "C") = myTime
Next i
End Sub
今回も細かい検証はしていません。m(_ _)m
No.9
- 回答日時:
No.6です。
>例えばですが、
>総時間300 開始時間2:00にするとエラーになります。
前回のコードの
>If Cells(k, "F") > myTime Then Exit Do
を
>If Cells(k, "F") > myTime Or Cells(k, "F") = "" Then Exit Do
に変更したらどうなりますか?
「2:00」はどちらの「2:00」になるのでしょうか?
AMの2:00の場合か26:00の場合なのか?
それによって結果が変わると思います。
仮に26:00の場合、B列には26:00と入力していますよね?
B列が30:00を超えた場合と「B列+A列(分)」の時刻が0:00~8:30までの場合、
休憩時間は全く考慮されませんが、それで良いのでしょうか?m(_ _)m
ありがとうございます!
30:00超えても休憩時間反映されていそうな感じです。
上記とは別に、12:00~13:00の60分だけ、なぜか反映されていないようです。
例えば、11:30開始時間で総時間60分としたら、終了時間は13:30になりますが、12:30の結果になりました。
No.7
- 回答日時:
No5です。
老婆心からですが、時刻の表示は24:00を超えた場合、25:30のように表示したほうが良いのではないでしょうか。24:00以降を25:00の用に表示するには、
セルの書式設定で、ユーザー定義の[h]:mmを指定します。添付図参照(赤線の部分)
私がNo5で提示したものは、8時前の開始はないという前提でしたが、
このように表示してあれば、8時前の開始も可能になります。
追加①2:30~2:50
追加②5:30~6:00
①10:30~10:40
②12:00~13:00
③15:30~15:40
④17:30~18:30
⑤22:00~23:00
⑥26:30~26:50
⑦29:30~30:00
のように定義します。
追加①②が、8時前の開始に対応します。
もし、このようにされるなら、マクロも簡単になります。
No5のマクロは、8時前の開始があると誤動作の可能性があります。
ありがとうございます!
時刻表示に関しては特にこだわりはありませんので、アドバイス頂きました内容でも
大丈夫です。
マクロが簡単になるとの事ですが、№5のマクロから更に簡単に出来るという事でしょうか?
No.6
- 回答日時:
こんにちは!
A列は「分」の数値ですよね。
VBAになりますが、一例です。
↓の画像のE~G列のように対応表を作成しておきます。
E・F列のセルの表示形式は h:mm としておき
E7 → 26:30
E8 → 29:30
F7 → 26:50
F8 → 30:00
のように入力しています。
(G列は単に整数だけの入力)
以上の下準備ができたうえで・・・
Sub Sample1()
Dim i As Long, k As Long, myTime
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
myTime = Cells(i, "B") + Cells(i, "A") / 24 / 60
For k = 2 To Cells(Rows.Count, "E").End(xlUp).Row
If Cells(k, "E") > Cells(i, "B") Then Exit For
Next k
Do
If Cells(k, "F") > myTime Then Exit Do
myTime = myTime + Cells(k, "G") / 24 / 60
k = k + 1
Loop
Cells(i, "C") = myTime
Next i
End Sub
※ 当然C列の表示形式は「時刻」にしておいてください。
※ 細かい検証はしていませんので
不具合が出たらごめんなさい。m(_ _)m
ありがとうございます!
例えばですが、
総時間300 開始時間2:00にするとエラーになります。
6:00(30:00)を超える時間が終了時間になるとエラーになってしまうでしょうか?
No.5
- 回答日時:
No4です。
前回のマクロは破棄してください。
一部誤りがありましたので、訂正します。
------------------------------------------------------
Option Explicit
'TTime:総時間(単位:分)
'STime:開始時間(HH:MM形式)
'TTable:休憩時間テーブルの範囲(開始時間の先頭セル:終了時間の最後のセル)
'上記の情報から終了時間(HH:MM)を算出する
'終了時間=開始時間+総時間+休憩時間テーブルの該当休憩時間の和
Public Function EndTime(ByVal TTime As Variant, ByVal STime As Variant, ByRef TTable As Range) As Variant
Dim i As Long
Dim etime As Variant
Application.Volatile
EndTime = ""
'総時間と開始時刻が空白なら、終了時間は空白
If TTime = "" And STime = "" Then Exit Function
EndTime = CVErr(xlErrValue)
'総時間と開始時刻の何れかが空白なら、終了時間は#VALUE
If TTime = "" Or STime = "" Then Exit Function
'総時間と開始時刻の何れかが不正なら、終了時間は#VALUE
If IsNumeric(TTime) = False Or IsNumeric(STime) = False Then Exit Function
'休憩時間テーブルが2列でないなら、終了時間は#VALUE
If TTable.Columns.Count <> 2 Then Exit Function
etime = STime + (TTime / 1440)
For i = 1 To TTable.Rows.Count
If TTable.Cells(i, 1).Value > STime And TTable.Cells(i, 1).Value < etime Then
'開始時間<休憩開始時間かつ休憩開始時間<終了時間なら、休憩時間を終了時間に加算
etime = etime + (TTable.Cells(i, 2).Value - TTable.Cells(i, 1).Value)
ElseIf TTable.Cells(i, 1).Value + 1 > STime And TTable.Cells(i, 1).Value + 1 < etime Then
'開始時間<休憩開始時間かつ休憩開始時間<終了時間なら、休憩時間を終了時間に加算(休憩開始時間は24H以降を考慮)
etime = etime + (TTable.Cells(i, 2).Value - TTable.Cells(i, 1).Value)
End If
Next
EndTime = etime
End Function
No.4
- 回答日時:
No3です。
補足ありがとうございました。
1.休憩時間の
⑥2:30~2:50
⑦5:30~6:00
については、翌日の2:30、5:50と理解しました。
2.又、開始時間ですが、日勤が8:30ということなので開始時間4:00のようなケースもないという前提です。
もし、あるとすると、⑦を休憩時間の範囲に含めるかどうかも検討の余地がありますが、このようなケースはないものとします。
3.以下のマクロを標準モジュールに登録してください。
---------------------------------------------------------------
Option Explicit
'TTime:総時間(単位:分)
'STime:開始時間(HH:MM形式)
'TTable:休憩時間テーブルの範囲(開始時間の先頭セル:終了時間の最後のセル)
'上記の情報から終了時間(HH:MM)を算出する
'終了時間=開始時間+総時間+休憩時間テーブルの該当休憩時間の和
Public Function EndTime(ByVal TTime As Variant, ByVal STime As Variant, ByRef TTable As Range) As Variant
Dim i As Long
Dim etime As Variant
Application.Volatile
EndTime = ""
'総時間と開始時刻が空白なら、終了時間は空白
If TTime = "" And STime = "" Then Exit Function
EndTime = CVErr(xlErrValue)
'総時間と開始時刻の何れかが空白なら、終了時間は#VALUE
If TTime = "" Or STime = "" Then Exit Function
'総時間と開始時刻の何れかが不正なら、終了時間は#VALUE
If IsNumeric(TTime) = False Or IsNumeric(STime) = False Then Exit Function
'休憩時間テーブルが2列でないなら、終了時間は#VALUE
If TTable.Columns.Count <> 2 Then Exit Function
etime = STime + (TTime / 1440)
For i = 1 To TTable.Rows.Count
If etime < 1 Then '終了時刻が24H以前なら
If TTable.Cells(i, 1).Value > STime And TTable.Cells(i, 1).Value < etime Then
'開始時間<休憩開始時間かつ休憩開始時間<終了時間なら、休憩時間を終了時間に加算
etime = etime + (TTable.Cells(i, 2).Value - TTable.Cells(i, 1).Value)
End If
Else '終了時刻が24H以降なら
If TTable.Cells(i, 1).Value + 1 > STime And TTable.Cells(i, 1).Value + 1 < etime Then
'開始時間<休憩開始時間かつ休憩開始時間<終了時間なら、休憩時間を終了時間に加算(休憩開始時間は24H以降を考慮)
etime = etime + (TTable.Cells(i, 2).Value - TTable.Cells(i, 1).Value)
End If
End If
Next
EndTime = etime
End Function
--------------------------------------------------
4.添付図のようなレイアウトの場合ですが、
C2へ
=EndTime(A2,B2,$E$2:$F$8)
と入力し、オートフィルで下へコピーしてください。
EndTimeはユーザー定義関数です。
第1パラメータ:総時間のセル
第2パラメータ:開始時間のセル
第3パラメータ:休憩時間テーブルの範囲(見出しは含めない)
となっています。
5.なお、以下のようなケースは特別な結果を返します。
①総時間と開始時間が空白の場合、結果は空白(添付図の赤線で囲んだところ)
②総時間と開始時間の何れかが空白の場合、結果はエラー(添付図の赤線で囲んだところ)
③総時間と開始時間の何れかが不正の場合、結果はエラー(添付図の赤線で囲んだところ)
④休憩時間テーブルの範囲が2列でない場合、結果はエラー
以上、不明点があれば補足してください。
ありがとうございます!
VBAはマクロ実行しなければ動作しないと思っていましたが、このような事も
出来るという事初めて知りました。頑張って勉強致します。
No.3
- 回答日時:
1.入力される総時間の最大値はいくつでしょうか。
(極端な話ですが2日間=2880などもありえますか)2.今後、休憩時間が24時をまたがることもありますか。
23:30~0:30のようなケースです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルで勤務時間の計算をしています。 下記図でstartは勤務開始時間、endは勤務終了時間です。 5 2022/06/07 13:51
- Excel(エクセル) エクセル2019の関数を教えてください。 8 2022/12/16 12:45
- Excel(エクセル) エクセルで休憩時間を引いての作業計画予定表の作成の仕方 2 2023/07/24 14:11
- 飲食業・宿泊業・レジャー 休憩・残業時間の自動算出 1 2023/01/07 22:58
- Excel(エクセル) エクセルで休憩時間を引く時と、引かない時の数式 3 2022/11/05 11:48
- 会社・職場 リモート会議の休憩について… 販売員ですが、月に何回か在宅でのリモート会議や研修があります。 8:3 6 2022/07/21 11:09
- 労働相談 アルバイトと労働基準法。 4 2022/08/21 17:59
- その他(学校・勉強) 浪人中の過ごし方について こんばんは。現在、大学受験の浪人生をしています。 1日のスケジュールを立て 3 2023/04/12 21:38
- 大学受験 浪人中の過ごし方について こんばんは。現在、大学受験の浪人生をしています。 1日のスケジュールを立て 6 2023/04/12 19:20
- 仕事術・業務効率化 出勤時間10時から11時は休憩入り12時 出勤時間12時から13時は休憩入り14時 休憩時間をエクセ 3 2023/04/18 20:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【関数】スペースがいくつ入っ...
-
西暦や和暦の表示をyyyymmdd表...
-
Excelのセルを飛ばして入力する
-
Excelのオートフィル
-
別シートからの文字を変更
-
Excel 2019 のピボットテーブル...
-
エクセルの行の抽出について質...
-
【マクロ】エクセルにかいてあ...
-
スプレッドシート クエリ関数 1...
-
エクセルでセルに「氏名を入力...
-
MOS365 Excel Expert / Excel R...
-
excelの不要な行の削除ができな...
-
EXACT関数とIF関数の組み合わせ...
-
スプレッドシートの関数VLOOKUP...
-
Excelで全角を半角にしたいので...
-
Excel初心者です。 詳しい方、...
-
エクセルの数式で教えてください。
-
4つのパターンを表示するEXACT...
-
スマートな関数を教えて下さい。
-
【Excel】セル内の時間帯が特定...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル内にある数字の出現回...
-
Excel関数の先頭に「@」が入っ...
-
エクセルの気味悪い不思議
-
Excel VBAで、実行時にsheet上...
-
表示されている人数だけを数え...
-
他人が作ったマクロの理解
-
Excelの関数について質問です。
-
Excel 集計表
-
エクセル 日時の計算式について
-
Excelの関数に関して質問です。...
-
エクセル:セル内の文字列の下...
-
絞り込み検索
-
エクセルの関数で
-
エクセルの書式設定について教...
-
余分なEXCELファイルに印刷され...
-
VBA 同一シート内での転記の仕方
-
長期休みの関数はありますか
-
Excelの空のセル
-
エクセルで入力してある文を別...
-
Excelのマクロで、セルを結合し...
おすすめ情報
関数が困難であれば、VBAでも大丈夫です。
(総時間と開始時間を入れておいて、実行すると終了時間が入力されている。
空白の行までの処理とする。ただし初めに総時間/開始時間どちらか片一方しか入力されて
いない場合はエラー表示させて終了させる・・・みたいな感じで)
開始時間は例みたいにばらばらです。
ありがとうございます。
開始時間が固定であればよかったのですが、例のようにバラバラになってしまいます。
(ちなみに、人の出勤時間ではなく、工場の生産開始時間になりますので、それぞれ開始時間が
異なってしまう感じです。
ただし、休憩時間には開始することはありません。←この場合エラーです)
すみません、この内容を実現できる関数かコードを作って頂きたいです。
1.総時間の最大値は700です。
2.休憩時間が24時をまたぐケースはありません。(0:00~0:10とかはあり得ます)
補足の総時間について、具体的に下記となります。
①8:30~22:00
②22:00~8:30
上記がそれぞれの勤務区切り(日勤と夜勤です)となるので、例えば
8:30以降で22:00までの開始時間の場合は、休憩時間を追加しても22:00を超える事が無い総時間になります。
22:00以降で8:30までの開始時間の場合は、休憩時間を追加しても8:30を超える事が無い総時間になります。