fork download
  1. Option Explicit
  2. Const folder As String = "d:\goo\data2" '元データの格納フォルダ
  3. Public Sub 割増時間設定()
  4. Dim ssh As Worksheet '祝日シート
  5. Dim msh As Worksheet '集計シート複数
  6. Dim tsh As Worksheet '元データシート
  7. Dim wrow As Long '行 作業用
  8. Dim wrow2 As Long '行 作業用
  9. Dim wcol2 As Long '列 作業用
  10. Dim maxrow1 As Long '祝日の最大行
  11. Dim maxrow2 As Long '元データの最大行
  12. Dim dicT As Object '祝日の記憶用
  13. Dim dicM As Object '社員コードの記憶用
  14. Dim sheet_no As Long 'シート番号
  15. Dim book_path As String '元データのパス名
  16. Dim twb As Workbook '元データのブック
  17. Dim wdate As Variant '日付
  18. Dim bango As Variant '社員番号
  19. Dim wtime As Variant '割増時間
  20. Dim week_day As Long '1週間の番号1:日、7:土
  21. Dim wday As Long '年月日の日
  22. Application.ScreenUpdating = False
  23. Application.Calculation = xlCalculationManual
  24.  
  25. Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義
  26. Set dicM = CreateObject("Scripting.Dictionary") ' 連想配列の定義
  27. '祝日の記憶
  28. Set ssh = Worksheets("祝日")
  29. maxrow1 = ssh.Cells(Rows.Count, "A").End(xlUp).Row '祝日 A列 最終行を求める
  30. For wrow = 2 To maxrow1
  31. dicT(ssh.Cells(wrow, "A").Value) = True
  32. Next
  33. '全集計シートの社員コードとシートを記憶する
  34. For sheet_no = 1 To Worksheets.Count
  35. Call GetSheetInfo(sheet_no, dicM)
  36. Next
  37. '元データを読み込み割増時間を設定する
  38. book_path = folder & "\" & "元データ.xlsx"
  39. Set twb = Workbooks.Open(book_path)
  40. Set tsh = twb.Worksheets("元データ")
  41. maxrow2 = tsh.Cells(Rows.Count, "A").End(xlUp).Row '元データ A列 最終行を求める
  42. For wrow = 2 To maxrow2
  43. wdate = tsh.Cells(wrow, "A").Value '日付
  44. bango = tsh.Cells(wrow, "B").Value '社員番号
  45. week_day = weekday(wdate)
  46. wday = Day(wdate)
  47. '祭日又は日曜又は土曜ならY列採用、左記以外はX列採用
  48. If dicT.exists(wdate) = True Or week_day = 1 Or week_day = 7 Then
  49. wtime = tsh.Cells(wrow, "Y").Value
  50. Else
  51. wtime = tsh.Cells(wrow, "X").Value
  52. End If
  53. '但し、シフト勤務のみ、X列を無条件に採用する
  54. If dicM.exists(bango) = True Then
  55. If dicM(bango)(2) = True Then 'シフト勤務の場合
  56. wtime = tsh.Cells(wrow, "X").Value
  57. End If
  58. End If
  59. If dicM.exists(bango) = True Then
  60. sheet_no = dicM(bango)(0) '社員番号対応の集計シートのシート番号
  61. wrow2 = dicM(bango)(1) '社員番号対応の集計シートの行番号
  62. wcol2 = 7 + wday '割増時間設定の列
  63. ThisWorkbook.Worksheets(sheet_no).Cells(wrow2, wcol2).Value = wtime
  64. End If
  65. Next
  66. twb.Close
  67. Application.Calculation = xlCalculationAutomatic
  68. Application.ScreenUpdating = True
  69. MsgBox ("完了")
  70. End Sub
  71. 'シート情報の記憶(シート番号と社員番号)
  72. Private Sub GetSheetInfo(ByVal sheet_no As Long, ByVal dicM As Object)
  73. Dim ws As Worksheet
  74. Dim wno As Long
  75. Dim wrow As Long '社員番号の行番号
  76. Dim wrow2 As Long '時間の行番号
  77. Dim bango As Variant
  78. Dim flag As Boolean
  79. flag = False
  80. Set ws = Worksheets(sheet_no)
  81. '処理対象外のシートはスキップする
  82. If ws.Name = "祝日" Or ws.Name = "フォーマット" Or ws.Name = "時間外" Then Exit Sub
  83. If ws.Range("A1").Value = "シフト勤務" Then
  84. flag = True
  85. End If
  86. '10人分繰り返す
  87. For wno = 1 To 10
  88. wrow = (wno - 1) * 6 + 5
  89. wrow2 = wrow + 2
  90. bango = ws.Cells(wrow, "A").Value
  91. '社員番号が登録されていれば、シート番号と行番号を記憶する
  92. If bango <> "" Then
  93. dicM(bango) = Array(sheet_no, wrow2, flag) 'シート番号と行番号とシフト勤務を記憶
  94. End If
  95. ws.Range("H" & wrow2 & ":AL" & wrow2).Value = "" '時間クリア
  96. Next
  97. End Sub
  98.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty