Option Explicit
Const Shift_str As String = "1,1,1,1,定休,2,2,2,2,定休,3,3,3,3,定休,定休"
Const A_stx As Long = 6 'Aグループの2020年1月1日のインデックス
Const B_stx As Long = 2 'Bグループの2020年1月1日のインデックス
Const C_stx As Long = 14 'Cグループの2020年1月1日のインデックス
Const D_stx As Long = 10 'Dグループの2020年1月1日のインデックス
Dim ws As Worksheet
Dim cs As Worksheet
Dim shift_p As Variant
Dim dicT As Object '祝日カレンダーの祝日を記憶
Public Sub 週間シフト表作成()
Dim sdate As Variant
Dim wdate As Variant
Dim flag As Boolean
Dim i As Long
Dim wx As Long
Dim maxrow As Long
Dim wrow As Long
Dim wcol As Long
Dim diff As Long
Dim aix As Long
Dim bix As Long
Dim cix As Long
Dim dix As Long
Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義
shift_p = Split(Shift_str, ",")
Set ws = Worksheets("週間シフト表")
Set cs = Worksheets("祝日")
sdate = ws.Cells(4, "B").Value
flag = False
If IsDate(sdate) = True Then
If Year(sdate) >= 2020 And Year(sdate) <= 2099 Then
flag = True
End If
End If
If flag = False Then
MsgBox ("2020年~2099年の日付を指定してください")
Exit Sub
End If
ws.Cells(3, "B").Value = Year(sdate) & "年"
ws.Cells(3, "C").Value = Month(sdate) & "月"
maxrow = cs.Cells(Rows.Count, 1).End(xlUp).row '最終行を求める
'祝日カレンダーを記憶
For wrow = 2 To maxrow
dicT(cs.Cells(wrow, "A").Value) = True
Next
'日付設定
For i = 0 To 6
wdate = sdate + i
wrow = 4
wcol = 2 + i
ws.Cells(wrow, wcol).Value = wdate
wx = Weekday(wdate, vbSunday)
'祝日か日曜日なら赤
ws.Cells(wrow, wcol).Font.ColorIndex = xlAutomatic
If dicT.exists(wdate) = True Or wx = 1 Then
ws.Cells(wrow, wcol).Font.Color = -16776961
'土曜日なら青
ElseIf wx = 7 Then
ws.Cells(wrow, wcol).Font.Color = -1003520
End If
Next
'シフト設定
diff = sdate - DateSerial(2020, 1, 1)
aix = (diff + A_stx) Mod 16
bix = (diff + B_stx) Mod 16
cix = (diff + C_stx) Mod 16
dix = (diff + D_stx) Mod 16
For i = 0 To 6
wrow = 6
wcol = 2 + i
ws.Range(ws.Cells(wrow, wcol), ws.Cells(wrow + 4, wcol)).Value = shift_p(aix) 'Aのシフト
wrow = wrow + 5
ws.Range(ws.Cells(wrow, wcol), ws.Cells(wrow + 4, wcol)).Value = shift_p(bix) 'Bのシフト
wrow = wrow + 5
ws.Range(ws.Cells(wrow, wcol), ws.Cells(wrow + 4, wcol)).Value = shift_p(cix) 'Cのシフト
wrow = wrow + 5
ws.Range(ws.Cells(wrow, wcol), ws.Cells(wrow + 4, wcol)).Value = shift_p(dix) 'Dのシフト
aix = next_shift(aix)
bix = next_shift(bix)
cix = next_shift(cix)
dix = next_shift(dix)
Next
End Sub
'次のシフトを取得
Private Function next_shift(ByVal shift_ix As Long) As Long
next_shift = shift_ix + 1
If next_shift > 15 Or next_shift < 0 Then
next_shift = 0
End If
End Function
T3B0aW9uIEV4cGxpY2l0CkNvbnN0IFNoaWZ0X3N0ciBBcyBTdHJpbmcgPSAiMSwxLDEsMSzlrprkvJEsMiwyLDIsMizlrprkvJEsMywzLDMsMyzlrprkvJEs5a6a5LyRIgpDb25zdCBBX3N0eCBBcyBMb25nID0gNiAgICAgICAgICdB44Kw44Or44O844OX44GuMjAyMOW5tDHmnIgx5pel44Gu44Kk44Oz44OH44OD44Kv44K5CkNvbnN0IEJfc3R4IEFzIExvbmcgPSAyICAgICAgICAgJ0LjgrDjg6vjg7zjg5fjga4yMDIw5bm0MeaciDHml6Xjga7jgqTjg7Pjg4fjg4Pjgq/jgrkKQ29uc3QgQ19zdHggQXMgTG9uZyA9IDE0ICAgICAgICAnQ+OCsOODq+ODvOODl+OBrjIwMjDlubQx5pyIMeaXpeOBruOCpOODs+ODh+ODg+OCr+OCuQpDb25zdCBEX3N0eCBBcyBMb25nID0gMTAgICAgICAgICdE44Kw44Or44O844OX44GuMjAyMOW5tDHmnIgx5pel44Gu44Kk44Oz44OH44OD44Kv44K5CkRpbSB3cyBBcyBXb3Jrc2hlZXQKRGltIGNzIEFzIFdvcmtzaGVldApEaW0gc2hpZnRfcCBBcyBWYXJpYW50CkRpbSBkaWNUIEFzIE9iamVjdCAgICAgICAgICAn56Wd5pel44Kr44Os44Oz44OA44O844Gu56Wd5pel44KS6KiY5oa2ClB1YmxpYyBTdWIg6YCx6ZaT44K344OV44OI6KGo5L2c5oiQKCkKICAgIERpbSBzZGF0ZSBBcyBWYXJpYW50CiAgICBEaW0gd2RhdGUgQXMgVmFyaWFudAogICAgRGltIGZsYWcgQXMgQm9vbGVhbgogICAgRGltIGkgQXMgTG9uZwogICAgRGltIHd4IEFzIExvbmcKICAgIERpbSBtYXhyb3cgQXMgTG9uZwogICAgRGltIHdyb3cgQXMgTG9uZwogICAgRGltIHdjb2wgQXMgTG9uZwogICAgRGltIGRpZmYgQXMgTG9uZwogICAgRGltIGFpeCBBcyBMb25nCiAgICBEaW0gYml4IEFzIExvbmcKICAgIERpbSBjaXggQXMgTG9uZwogICAgRGltIGRpeCBBcyBMb25nCiAgICBTZXQgZGljVCA9IENyZWF0ZU9iamVjdCgiU2NyaXB0aW5nLkRpY3Rpb25hcnkiKSAgICAnIOmAo+aDs+mFjeWIl+OBruWumue+qQogICAgc2hpZnRfcCA9IFNwbGl0KFNoaWZ0X3N0ciwgIiwiKQogICAgU2V0IHdzID0gV29ya3NoZWV0cygi6YCx6ZaT44K344OV44OI6KGoIikKICAgIFNldCBjcyA9IFdvcmtzaGVldHMoIuelneaXpSIpCiAgICBzZGF0ZSA9IHdzLkNlbGxzKDQsICJCIikuVmFsdWUKICAgIGZsYWcgPSBGYWxzZQogICAgSWYgSXNEYXRlKHNkYXRlKSA9IFRydWUgVGhlbgogICAgICAgIElmIFllYXIoc2RhdGUpID49IDIwMjAgQW5kIFllYXIoc2RhdGUpIDw9IDIwOTkgVGhlbgogICAgICAgICAgICBmbGFnID0gVHJ1ZQogICAgICAgIEVuZCBJZgogICAgRW5kIElmCiAgICBJZiBmbGFnID0gRmFsc2UgVGhlbgogICAgICAgIE1zZ0JveCAoIjIwMjDlubTvvZ4yMDk55bm044Gu5pel5LuY44KS5oyH5a6a44GX44Gm44GP44Gg44GV44GEIikKICAgICAgICBFeGl0IFN1YgogICAgRW5kIElmCiAgICB3cy5DZWxscygzLCAiQiIpLlZhbHVlID0gWWVhcihzZGF0ZSkgJiAi5bm0IgogICAgd3MuQ2VsbHMoMywgIkMiKS5WYWx1ZSA9IE1vbnRoKHNkYXRlKSAmICLmnIgiCiAgICBtYXhyb3cgPSBjcy5DZWxscyhSb3dzLkNvdW50LCAxKS5FbmQoeGxVcCkucm93ICAgICfmnIDntYLooYzjgpLmsYLjgoHjgosKICAgICfnpZ3ml6Xjgqvjg6zjg7Pjg4Djg7zjgpLoqJjmhrYKICAgIEZvciB3cm93ID0gMiBUbyBtYXhyb3cKICAgICAgICBkaWNUKGNzLkNlbGxzKHdyb3csICJBIikuVmFsdWUpID0gVHJ1ZQogICAgTmV4dAogICAgJ+aXpeS7mOioreWumgogICAgRm9yIGkgPSAwIFRvIDYKICAgICAgICB3ZGF0ZSA9IHNkYXRlICsgaQogICAgICAgIHdyb3cgPSA0CiAgICAgICAgd2NvbCA9IDIgKyBpCiAgICAgICAgd3MuQ2VsbHMod3Jvdywgd2NvbCkuVmFsdWUgPSB3ZGF0ZQogICAgICAgIHd4ID0gV2Vla2RheSh3ZGF0ZSwgdmJTdW5kYXkpCiAgICAgICAgJ+elneaXpeOBi+aXpeabnOaXpeOBquOCiei1pAogICAgICAgIHdzLkNlbGxzKHdyb3csIHdjb2wpLkZvbnQuQ29sb3JJbmRleCA9IHhsQXV0b21hdGljCiAgICAgICAgSWYgZGljVC5leGlzdHMod2RhdGUpID0gVHJ1ZSBPciB3eCA9IDEgVGhlbgogICAgICAgICAgICB3cy5DZWxscyh3cm93LCB3Y29sKS5Gb250LkNvbG9yID0gLTE2Nzc2OTYxCiAgICAgICAgICAgICflnJ/mm5zml6XjgarjgonpnZIKICAgICAgICBFbHNlSWYgd3ggPSA3IFRoZW4KICAgICAgICAgICAgd3MuQ2VsbHMod3Jvdywgd2NvbCkuRm9udC5Db2xvciA9IC0xMDAzNTIwCiAgICAgICAgRW5kIElmCiAgICBOZXh0CiAgICAn44K344OV44OI6Kit5a6aCiAgICBkaWZmID0gc2RhdGUgLSBEYXRlU2VyaWFsKDIwMjAsIDEsIDEpCiAgICBhaXggPSAoZGlmZiArIEFfc3R4KSBNb2QgMTYKICAgIGJpeCA9IChkaWZmICsgQl9zdHgpIE1vZCAxNgogICAgY2l4ID0gKGRpZmYgKyBDX3N0eCkgTW9kIDE2CiAgICBkaXggPSAoZGlmZiArIERfc3R4KSBNb2QgMTYKICAgIEZvciBpID0gMCBUbyA2CiAgICAgICAgd3JvdyA9IDYKICAgICAgICB3Y29sID0gMiArIGkKICAgICAgICB3cy5SYW5nZSh3cy5DZWxscyh3cm93LCB3Y29sKSwgd3MuQ2VsbHMod3JvdyArIDQsIHdjb2wpKS5WYWx1ZSA9IHNoaWZ0X3AoYWl4KSAgICAnQeOBruOCt+ODleODiAogICAgICAgIHdyb3cgPSB3cm93ICsgNQogICAgICAgIHdzLlJhbmdlKHdzLkNlbGxzKHdyb3csIHdjb2wpLCB3cy5DZWxscyh3cm93ICsgNCwgd2NvbCkpLlZhbHVlID0gc2hpZnRfcChiaXgpICAgICdC44Gu44K344OV44OICiAgICAgICAgd3JvdyA9IHdyb3cgKyA1CiAgICAgICAgd3MuUmFuZ2Uod3MuQ2VsbHMod3Jvdywgd2NvbCksIHdzLkNlbGxzKHdyb3cgKyA0LCB3Y29sKSkuVmFsdWUgPSBzaGlmdF9wKGNpeCkgICAgJ0Pjga7jgrfjg5Xjg4gKICAgICAgICB3cm93ID0gd3JvdyArIDUKICAgICAgICB3cy5SYW5nZSh3cy5DZWxscyh3cm93LCB3Y29sKSwgd3MuQ2VsbHMod3JvdyArIDQsIHdjb2wpKS5WYWx1ZSA9IHNoaWZ0X3AoZGl4KSAgICAnROOBruOCt+ODleODiAogICAgICAgIGFpeCA9IG5leHRfc2hpZnQoYWl4KQogICAgICAgIGJpeCA9IG5leHRfc2hpZnQoYml4KQogICAgICAgIGNpeCA9IG5leHRfc2hpZnQoY2l4KQogICAgICAgIGRpeCA9IG5leHRfc2hpZnQoZGl4KQogICAgTmV4dApFbmQgU3ViCifmrKHjga7jgrfjg5Xjg4jjgpLlj5blvpcKUHJpdmF0ZSBGdW5jdGlvbiBuZXh0X3NoaWZ0KEJ5VmFsIHNoaWZ0X2l4IEFzIExvbmcpIEFzIExvbmcKICAgIG5leHRfc2hpZnQgPSBzaGlmdF9peCArIDEKICAgIElmIG5leHRfc2hpZnQgPiAxNSBPciBuZXh0X3NoaWZ0IDwgMCBUaGVuCiAgICAgICAgbmV4dF9zaGlmdCA9IDAKICAgIEVuZCBJZgpFbmQgRnVuY3Rpb24K