[[20230729110354]] 『法定休日の判定』(お米) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『法定休日の判定』(お米)

勤怠情報を入力する出勤簿を作成しています。
法定休日の判定を自動でしたいのですが、どういった式orマクロを組めば良いでしょうか?

当社の規定は
日曜日〜土曜日を1週間とするシフト制
1週間のうちに休日が複数ある場合は休日出勤していない日を法定休日とし、
全て休日出勤している場合は最初の休日を法定休日として0.35割増して計算します。
シフト制なので決まった曜日ではない、休日出勤したかどうかで法定休日が変わる、の条件という複雑な規程なのでいい案が浮かびません。

現在作っている形式は

A列  B列  C列   D列    E列
日付  曜日  シフト  出勤時間  残業時間
(シフトには早遅休)

略式ですがこんな感じです。
希望はC列の隣に作業列として「法休」と出れば良いなと思います。

よろしくお願いします。

< 使用 Excel:Excel2019、使用 OS:Windows10 >


>現在作っている形式
質問内容をデータとして提示できないのですか。

(わからん) 2023/07/29(土) 12:01:56


すいません、これデータを添付できるのですか?
ちょっと分からないのでそれっぽく入力してみます。
今の状態が上の表です。理想の状態が下の表です。
先の質問でD列を空けて質問すればよかったです。申し訳ございません。

   A列 B列 C列 D列    E列
1行 日付 曜日 シフト 出勤時間  残業時間
2行 1  日  遅  8:00  1:30
3行 2  月  早  8:00  0:00
4行 3  火  休  0:00  3:00 ←シフトが「休」で残業(休日出勤)をしている
5行 4  水  遅  8:00  0:00
6行 5  木  早  8:00  0:00
7行 6  金  遅  8:00  0:00
8行 7  土  休  0:00  0:00
9行 8  日  遅  8:00  0:00

上記の場合は

   A列 B列 C列 D列  E列   F列
1行 日付 曜日 シフト  判定 出勤時間  残業時間
2行 1  日  遅     8:00  1:30
3行 2  月  早     8:00  0:00
4行 3  火  休     0:00  3:00
5行 4  水  遅     8:00  0:00
6行 5  木  早     8:00  0:00
7行 6  金  遅     8:00  0:00
8行 7  土  休  法定 0:00  0:00
9行 8  日  遅     8:00  0:00

D8に法定と出るようにしたいです。
(日〜土曜日の間に休日出勤の無い休日)

また、

   A列 B列 C列 D列    E列
1行 日付 曜日 シフト 出勤時間  残業時間
2行 1  日  遅  8:00  1:30
3行 2  月  早  8:00  0:00
4行 3  火  休  0:00  3:00←シフトが「休」で残業(休日出勤)をしている
5行 4  水  遅  8:00  0:00
6行 5  木  早  8:00  0:00
7行 6  金  遅  8:00  0:00
8行 7  土  休  0:00  4:00←シフトが「休」で残業(休日出勤)をしている
9行 8  日  遅  8:00  0:00

上記の場合は

   A列 B列 C列 D列  E列   F列
1行 日付 曜日 シフト  判定 出勤時間  残業時間
2行 1  日  遅     8:00  1:30
3行 2  月  早     8:00  0:00
4行 3  火  休  法定 0:00  3:00
5行 4  水  遅     8:00  0:00
6行 5  木  早     8:00  0:00
7行 6  金  遅     8:00  0:00
8行 7  土  休     0:00  4:00
9行 8  日  遅     8:00  0:00

D4に法定と出るようにしたいです。
(日〜土曜日の間の休日どちらも休日出勤している為早い方)

わかりにくくて申し訳ございません。
よろしくお願いします。

(お米) 2023/07/29(土) 12:53:40


>勤怠情報を入力する出勤簿を作成しています。
何故退勤時間がないのですか。
(yasai) 2023/07/29(土) 15:07:17

申し訳ございません、間違えました。
×出勤時間
○勤務時間
です。
本当は出勤時間と退勤時間を入れて勤務時間が出る式がありますがここでは必要ないと思い割愛しています。

この様な場での質問は初めてで何かと不備があり申し訳ございません。
(お米) 2023/07/29(土) 15:25:13


 出勤時間が勤務時間だとして、

 >8行 7  土  休     0:00  4:00

 勤務時間が「0:00」なのに、残業時間が「4:00」なんてことがあるんですか?

 一体、休日出勤とは何を基に判断するんですか?
 (残業しなければ、休日出勤とは言わないのですか?)

(半平太) 2023/07/29(土) 16:08:21


E列の「勤務時間」は所定勤務時間のみが出るようになっています。
休日出勤は割増が同じ関係で残業時間に入力するようになっています。
休日出勤はC列「シフト」が「休」のときF列「残業時間」が入っている場合に休日出勤という扱いになります。

本当に色々割愛していて申し訳ないのですが、当社24時間オンコールがありまして1日に何度も出勤することがあります。
休日に4回出勤した社員もおりますので、職員が分かりやすいように所定労働以外は全て残業時間に入れる様に分けております。
(集計の際はSUMIFで残業と休日出勤を分けて集計しているのでこれは問題ございません。)

情報が多すぎると逆に混乱させてしまうかと思い割愛したことが裏目に出ました。
申し訳ございません。
(お米) 2023/07/29(土) 16:22:57


一度整理して質問しなおした方が良いでしょうか…?
(お米) 2023/07/29(土) 16:24:51

>(日〜土曜日の間の休日どちらも休日出勤している為早い方)
会社の規則はどうなっているんでしょうか。
(yasai) 2023/07/29(土) 17:17:02

会社の規定が
「土〜日曜日の1週間のうちに休日が複数ある場合は休日出勤していない日を法定休日とし、
全て休日出勤している場合は出勤した最初の休日を法定休日として0.35割増して計算する。」
となっています。
シフト制の為固定された休みはありません。
また、週に1日しか所定休日が無かったり(この場合これが法定休日)、逆に3日以上の所定休日があったりもします。
(お米) 2023/07/29(土) 17:41:02

 >会社の規定が
 >「土〜日曜日の1週間のうちに休日が複数ある場合は休日出勤していない日を法定休日とし、
 >全て休日出勤している場合は出勤した最初の休日を法定休日として0.35割増して計算する。」

 あれー? 「日〜土曜日」ですよね?
 まぁ、土から日では2日間しかないから明らかだろうとは思いますけども)

 カレンダーはいつも日曜から始まっていますね(=2行目は必ず日曜であり、7行でワンサイクルになっている)

 休日が複数ある場合は、休日出勤していない日が法定休日と言うことですが、
 どれか1日(一番早い日)だけですね?
 (休日出勤していない日全てを法定休日にする訳じゃないですね。念の為、確認)

(半平太) 2023/07/29(土) 18:41:05


 上の解釈が正しい場合

 1.出勤簿シートの「シート見出し」を右クリックして
   「コードの表示(V)」を選ぶと 画面中央に白いエリアが出ます。

 2.その白いエリアに下のマクロコードを貼り付ける。

 3.その後、ALT+F11を押下してエクセルに戻る

 4.実行するには
  「作業列」と項目名が書いてあるセルを右クリックする。(例では、D1セルを右クリックする)

 ※なお、コード冒頭の以下の部分は、そちらの実際の表に合わせて、列番号を修正してください。
  
  >Enum ColPos’項目の列番号
  >    シフト = 3  
  >    作業列 = 4
  >    勤務時間 = 5
  >    残業時間 = 6
  >End Enum

 ’シートモジュールに貼り付けるマクロ
 ’  ↓
 Enum ColPos
     シフト = 3 '列目
     作業列 = 4
     勤務時間 = 5
     残業時間 = 6
 End Enum

 Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
     Dim App As Application
     Dim Scope As Range, r As Range
     Dim i As Long, k As Long, firstCounter As Long, Processed As Boolean

     If Target.Address <> Cells(1, 作業列).Address Then
         Exit Sub
     Else
         Cancel = True
     End If

     Set App = Application
     Set Scope = Range("A2", Cells(Rows.Count, 残業時間).End(xlUp))
         Scope.Columns(作業列) = ""

     For k = 1 To Scope.Rows.Count Step 7
         Set r = Scope.Rows(k).Resize(7)

         Processed = False
         firstCounter = 0

         Select Case App.CountIf(r.Columns(シフト), "休")
             Case 0  '休が無ければスルー
                 Exit Sub

             Case 1  '即確定
                 r.Cells(App.Match("休", r.Columns(シフト), 0), 作業列) = "法休"

             Case Else
                 For i = 1 To 7
                     If r.Cells(i, シフト).Value = "休" Then
                         firstCounter = IIf(firstCounter = 0, i, firstCounter)

                         If r.Cells(i, 残業時間) = 0 Then
                             r.Cells(i, 作業列) = "法休"
                             Processed = True
                             Exit For
                         End If
                     End If
                 Next i

                 If Processed = False Then
                     r.Cells(firstCounter, 作業列) = "法休"
                 End If
         End Select
     Next k
 End Sub

(半平太) 2023/07/29(土) 19:00:03


コードの作成有難うございます。

>>会社の規定が
>>「土〜日曜日の1週間のうちに休日が複数ある場合は休日出勤していない日を法定休日とし、
>>全て休日出勤している場合は出勤した最初の休日を法定休日として0.35割増して計算する。」
>あれー? 「日〜土曜日」ですよね?
>まぁ、土から日では2日間しかないから明らかだろうとは思いますけども)
その通りです。失礼しました。

>カレンダーはいつも日曜から始まっていますね(=2行目は必ず日曜であり、7行でワンサイクルになっている)
2行目は必ずしも日曜日ではありません。
TEXT(DATE(年,月,A列(日付)),"aaa")を入れて曜日が自動で変わるようにしてあります。

>休日が複数ある場合は、休日出勤していない日が法定休日と言うことですが、
>どれか1日(一番早い日)だけですね?
>(休日出勤していない日全てを法定休日にする訳じゃないですね。念の為、確認)
その通りです。

日付を基準に曜日をずらしていましたが、曜日を基準に日付をずらしてコードを利用できるようにしてみます。
(お米) 2023/07/31(月) 09:01:01


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.