- 帖子
- 522
- 主題
- 36
- 精華
- 1
- 積分
- 603
- 點名
- 0
- 作業系統
- win xp sp3
- 軟體版本
- Office 2003
- 閱讀權限
- 50
- 性別
- 男
- 註冊時間
- 2012-12-13
- 最後登錄
- 2021-7-11
|
7#
發表於 2014-4-9 19:50
| 只看該作者
回復 3# h60327
如何製作跳號輪值表(完)
四、最後還有一個問題要處理,
那就是【連續假日】要不要連排同一人?
如果【連續假日要連排同一人】,
則要再增加一張工作表→【日期表】,
即將原月曆表(總表), 轉錄成【日柱】, 以方便VBA存取,
【建立日期表】的VBA Code 如下:- '建立日期表
- '將【總表】的 月曆 轉換成【日期表】的日柱
- Private Sub CommandButton1_Click()
- Dim sh1, sh2 As Worksheet
- Dim 年, 月, i, j, k As Integer
-
- Set sh1 = Sheets("總表")
- Set sh2 = Sheets("日期表")
-
- Application.ScreenUpdating = False '關閉螢幕刷新
-
- '從【總表】的【月曆表】取得 年(西元), 並存入 sh2.[A2]
- sh2.[A2] = "=MID(總表!A2,3,4)"
-
- k = 1
- For 月 = 1 To 12
-
- '月曆表上, 每月有 6 週(包括空白格)
- For i = 1 To 6
-
- '月曆表上, 每週有 7 天
- For j = 1 To 7
-
- '如果月曆表上是空白格, 換下一格
- If sh1.Cells(月 * 20 + i * 3 - 19, j) <> "" Then
-
- k = k + 1
-
- sh2.Cells(k, 2) = 月
- sh1.Cells(月 * 20 + i * 3 - 19, j).Copy sh2.Cells(k, 3)
- sh1.Cells(月 * 20 + i * 3 - 18, j).Copy sh2.Cells(k, 4)
- sh2.Cells(k, 5) = DateSerial(sh2.[A2], 月, sh2.Cells(k, 3))
- sh2.Cells(k, 6) = sh2.Cells(k, 5)
-
- End If
- Next
- Next
- Next
- sh2.[A1].Resize(367, 7).Font.Size = 12
- sh2.[A1].Resize(367, 7).Borders.LineStyle = 0
- Application.ScreenUpdating = True '打開螢幕刷新
- End Sub
複製代碼 如下圖:

最後再加上
A、排輪值表(連續假日連排同一人)
vba Code 如下:- '副程式
- Sub 複製名單到日期表(ByVal name1 As String, ByVal k As Integer)
- Dim sh, sh2 As Object
- Set sh = Sheets(name1)
- Set sh2 = Sheets("日期表")
-
- '若 [G2] 為空白格(則 欄G 為空白欄), 而 [H2] 不是空白格, 則
- If sh.[G2] = "" Then
-
- '刪除 欄G, 並向左移(取得 欄H 的名單)
- sh.[G2].Resize(row3, 1).Delete Shift:=xlToLeft
- End If
-
- '將[G2]複製到 日期表
- sh.[G2].Copy
- sh2.Cells(k, 7).PasteSpecial Paste:=xlPasteValues
-
- '並將 [G2] 刪除且向上移一格
- sh.[G2].Delete xlUp
- End Sub
- '副程式
- Sub 從日期表複製名單到總表()
- Dim sh1, sh2 As Object
- Dim i, j, k As Integer
- Dim cel As Range
-
- Set sh1 = Sheets("總表")
- Set sh2 = Sheets("日期表")
-
- '【日期表】中, 欲複製到【總表】的名單 的 始列號
- k = sh2.[J14]
-
- '從 日期表 複製到 總表
- For i = 1 To 6
- For j = 1 To 7
-
- Set cel = sh1.Cells(sh2.[J13] * 20 + i * 3 - 19, j)
-
- '若日期 = "", 則換下一個
- If cel <> "" Then
-
- cel.Offset(2, 0) = sh2.Cells(k, 7)
- End If
-
- k = k + 1
- Next
- Next i
- End Sub
複製代碼- '排輪值表(連續假日連排同一人)
- Private Sub CommandButton2_Click()
- Dim sh1, sh2, sh3, sh4 As Object
- Dim i, j, k, row3, row4 As Integer
- Dim cel As Range
-
- Set sh1 = Sheets("總表")
- Set sh2 = Sheets("日期表")
- Set sh3 = Sheets("平日")
- Set sh4 = Sheets("假日")
-
- '若 [G2] 及 [H2] 皆為空白格, 則
- If sh4.[G2] = "" And sh4.[H2] = "" Then
- MsgBox "已無名單可用", vbExclamation
- Exit Sub
- End If
-
- Application.ScreenUpdating = False '關閉螢幕刷新
-
- row3 = sh3.[A2].End(xlDown).Row
- row4 = sh4.[A2].End(xlDown).Row
-
- 'sh2.[J14] 直接指向【日期表】指定月份的 開始列號
- sh2.[J14] = "=MATCH(J13,B2:B367,0) + 1"
- k = sh2.[J14]
-
- Do
-
- '處理平日
- If sh2.Cells(k, 3).Font.ColorIndex = 1 Then
-
- 複製名單到日期表 "平日", k
-
- '處理假日
- Else
-
- '如果 前一天 也是 假日, 則從前一天的名單 複製名單
- If sh2.Cells(k - 1, 3).Font.ColorIndex = 3 _
- Or sh2.Cells(k - 1, 3).Font.ColorIndex = 5 Then
-
- If sh2.Cells(k - 1, 7) <> "" Then
- sh2.Cells(k, 7) = sh2.Cells(k - 1, 7)
-
- '但, 如果 前一天的 名單 是空白, 則自 "假日" 表中, 複製名單
- Else
- 複製名單到日期表 "假日", k
- End If
-
- '否則, 自 "假日" 表中, 複製名單
- Else
- 複製名單到日期表 "假日", k
- End If
- End If
-
- k = k + 1
- Loop Until sh2.Cells(k, 2) > sh2.[J13]
-
- 從日期表複製名單到總表
-
- Application.ScreenUpdating = True '打開螢幕刷新
- End Sub
複製代碼 B、排輪值表(連續假日不連排同一人)
vba Code 如下:- '排輪值表(連續假日不連排同一人)
- Private Sub CommandButton3_Click()
- Dim sh1, sh2, sh3, sh4 As Object
- Dim i, j, k, row3, row4 As Integer
- Dim cel As Range
-
- Set sh1 = Sheets("總表")
- Set sh2 = Sheets("日期表")
- Set sh3 = Sheets("平日")
- Set sh4 = Sheets("假日")
-
- '若 [G2] 及 [H2] 皆為空白格, 則
- If sh4.[G2] = "" And sh4.[H2] = "" Then
- MsgBox "已無名單可用", vbExclamation
- Exit Sub
- End If
-
- Application.ScreenUpdating = False '關閉螢幕刷新
-
- row3 = sh3.[A2].End(xlDown).Row
- row4 = sh4.[A2].End(xlDown).Row
-
- 'sh2.[J14] 直接指向【日期表】指定月份的 開始列號
- sh2.[J14] = "=MATCH(J13,B2:B367,0) + 1"
- k = sh2.[J14]
-
- Do
-
- '若 ColorIndex = 1, 則自【平日】表中, 複製名單 到【日期表】
- If sh2.Cells(k, 3).Font.ColorIndex = 1 Then
-
- 複製名單到日期表 "平日", k
-
- '否則, 自【假日】表中, 複製名單 到【日期表】
- Else
-
- 複製名單到日期表 "假日", k
- End If
-
- k = k + 1
- Loop Until sh2.Cells(k, 2) > sh2.[J13]
-
- 從日期表複製名單到總表
-
- Application.ScreenUpdating = True '打開螢幕刷新
- End Sub
複製代碼 OK, 大功告成, 可以測試去了。
不想自己動手的朋友, 這裡有一個現成的檔案,
可下載來試試看:
http://www.mediafire.com/download/6ibnow9d2rk851g/%E8%B7%B3%E8%99%9F%E8%BC%AA%E5%80%BC%E8%A1%A8.7z
順便幫忙測試, 謝謝!! |
|