Option Explicit
Const folder As String = "d:\goo\data2" '元データの格納フォルダ
Public Sub 割増時間設定()
Dim ssh As Worksheet '祝日シート
Dim msh As Worksheet '集計シート複数
Dim tsh As Worksheet '元データシート
Dim wrow As Long '行 作業用
Dim wrow2 As Long '行 作業用
Dim wcol2 As Long '列 作業用
Dim maxrow1 As Long '祝日の最大行
Dim maxrow2 As Long '元データの最大行
Dim dicT As Object '祝日の記憶用
Dim dicM As Object '社員コードの記憶用
Dim sheet_no As Long 'シート番号
Dim book_path As String '元データのパス名
Dim twb As Workbook '元データのブック
Dim wdate As Variant '日付
Dim bango As Variant '社員番号
Dim wtime As Variant '割増時間
Dim week_day As Long '1週間の番号1:日、7:土
Dim wday As Long '年月日の日
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義
Set dicM = CreateObject("Scripting.Dictionary") ' 連想配列の定義
'祝日の記憶
Set ssh = Worksheets("祝日")
maxrow1 = ssh.Cells(Rows.Count, "A").End(xlUp).Row '祝日 A列 最終行を求める
For wrow = 2 To maxrow1
dicT(ssh.Cells(wrow, "A").Value) = True
Next
'全集計シートの社員コードとシートを記憶する
For sheet_no = 1 To Worksheets.Count
Call GetSheetInfo(sheet_no, dicM)
Next
'元データを読み込み割増時間を設定する
book_path = folder & "\" & "元データ.xlsx"
Set twb = Workbooks.Open(book_path)
Set tsh = twb.Worksheets("元データ")
maxrow2 = tsh.Cells(Rows.Count, "A").End(xlUp).Row '元データ A列 最終行を求める
For wrow = 2 To maxrow2
wdate = tsh.Cells(wrow, "A").Value '日付
bango = tsh.Cells(wrow, "B").Value '社員番号
week_day = weekday(wdate)
wday = Day(wdate)
'祭日又は日曜又は土曜ならY列採用、左記以外はX列採用
If dicT.exists(wdate) = True Or week_day = 1 Or week_day = 7 Then
wtime = tsh.Cells(wrow, "Y").Value
Else
wtime = tsh.Cells(wrow, "X").Value
End If
'但し、シフト勤務のみ、X列を無条件に採用する
If dicM.exists(bango) = True Then
If dicM(bango)(2) = True Then 'シフト勤務の場合
wtime = tsh.Cells(wrow, "X").Value
End If
End If
If dicM.exists(bango) = True Then
sheet_no = dicM(bango)(0) '社員番号対応の集計シートのシート番号
wrow2 = dicM(bango)(1) '社員番号対応の集計シートの行番号
wcol2 = 7 + wday '割増時間設定の列
ThisWorkbook.Worksheets(sheet_no).Cells(wrow2, wcol2).Value = wtime
End If
Next
twb.Close
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
MsgBox ("完了")
End Sub
'シート情報の記憶(シート番号と社員番号)
Private Sub GetSheetInfo(ByVal sheet_no As Long, ByVal dicM As Object)
Dim ws As Worksheet
Dim wno As Long
Dim wrow As Long '社員番号の行番号
Dim wrow2 As Long '時間の行番号
Dim bango As Variant
Dim flag As Boolean
flag = False
Set ws = Worksheets(sheet_no)
'処理対象外のシートはスキップする
If ws.Name = "祝日" Or ws.Name = "フォーマット" Or ws.Name = "時間外" Then Exit Sub
If ws.Range("A1").Value = "シフト勤務" Then
flag = True
End If
'10人分繰り返す
For wno = 1 To 10
wrow = (wno - 1) * 6 + 5
wrow2 = wrow + 2
bango = ws.Cells(wrow, "A").Value
'社員番号が登録されていれば、シート番号と行番号を記憶する
If bango <> "" Then
dicM(bango) = Array(sheet_no, wrow2, flag) 'シート番号と行番号とシフト勤務を記憶
End If
ws.Range("H" & wrow2 & ":AL" & wrow2).Value = "" '時間クリア
Next
End Sub