Board logo

標題: [發問] 排班表連續7天時出現提醒 [打印本頁]

作者: jsc0518    時間: 2023-2-5 16:57     標題: 排班表連續7天時出現提醒

Dear all,
我依據YouTube上教學,已在 Excel 設定儲存格格式公式,是可以連續七日時會儲存格會變底色提醒。
想問一下,是否可以將語法寫在VBA內,因為怕有人不懂Excel亂按到,導致儲存格公式跑到。
範圍為:C11~AB41

[attach]35776[/attach][attach]35776[/attach]

[attach]35773[/attach]

[attach]35774[/attach]

[attach]35775[/attach]

謝謝大家!!
作者: Andy2483    時間: 2023-2-6 09:12

回復 1# jsc0518


    謝謝前輩發表此主題與範例
後學學習後建議以下方案,請試試看

Option Explicit
Sub 檢測_選取問題格()
Dim i&, Arr, n, xR As Range, C%, R&
Arr = ActiveSheet.UsedRange
For C = 1 To UBound(Arr, 2)
   For R = 1 To UBound(Arr)
      If InStr("/主/副/●/", "/" & Trim(Arr(R, C)) & "/") Then
         n = n + 1
         If n >= 7 Then
            If Not xR Is Nothing Then
               Set xR = Union(xR, Cells(R, C))
               Else
                  Set xR = Cells(R, C)
            End If
         End If
         Else
            n = 0
      End If
   Next
   n = 0
Next
If Not xR Is Nothing Then
   Application.Goto xR
   Else
     MsgBox "沒有連續七天上班!"
End If
End Sub
作者: jsc0518    時間: 2023-2-6 20:37

回復 2# Andy2483

Dear Andy,

您好!感謝您熱心地回覆、解惑!
想與您請教:若要修改範圍 C11~AB41  --> 在哪一VBA語法修改呢?

感恩!!
作者: Andy2483    時間: 2023-2-7 09:20

回復 3# jsc0518


    謝謝前輩回復

若要修改範圍 C11~AB41  --> 在哪一VBA語法修改呢?
Ans:不必修改VBA語法!因為程式判斷整表連續7天(含)以上上班,第7天後的儲存格都會被選取,如果沒有則顯示 "沒有連續七天上班!"提視窗
PS: Arr = ActiveSheet.UsedRange   '有使用的儲存格

建議以原格式化條件為主,此檢測方案作為輔助
作者: jsc0518    時間: 2023-2-7 20:49

回復 4# Andy2483
Dear Andy,

謝謝您的熱心指導,知道意思了!感恩!
作者: Andy2483    時間: 2023-2-8 14:37

回復 1# jsc0518


    謝謝前輩
後學另一個方案:刪除全部格式化條件,以觸發檢查,細節如下,請試試看
1.下方編輯區:滑鼠左鍵快按2次可做 ● 切換
2.下方編輯區:滑鼠按右鍵可做 "主" or  "副"  切換
3.紅色字&提示窗:連續上班7天

[attach]35803[/attach]

執行結果:
[attach]35804[/attach]
作者: jsc0518    時間: 2023-2-8 20:15

回復 6# Andy2483
Dear Andy,

我在編輯區域 C11~AB41,按下滑鼠右鍵要做複製/貼上動作時,會出現視窗連續七天上班。
這部分可以修訂嗎?
作者: Andy2483    時間: 2023-2-9 07:21

本帖最後由 Andy2483 於 2023-2-9 07:24 編輯

回復 7# jsc0518


    謝謝前輩再回復
1.後學優先考慮的是:有錯誤(連續7天上班)要馬上改善,所以[K16]以左鍵快按2下,就可以不再出現提示
2.編輯區內只要是 ●/主/副 任一種,左鍵快按2下,都會變空白
3. 編輯區內只要是 ●/副 或空白 任一種,按右鍵會變 "主"
4. 編輯區內只要是 "主" ,按右鍵會變 "副"
5.如果常用 右鍵 複製/貼上,建議用Ctrl+C  /  Ctrl+V 取代這兩功能

[K16]以左鍵快按2下的結果:
[attach]35807[/attach]
作者: jsc0518    時間: 2023-2-9 19:38

回復 8# Andy2483
Dear Andy,
我知道你設計的意思了,我測試看看!謝謝你歐!
作者: Andy2483    時間: 2023-2-10 12:29

回復 9# jsc0518


    謝謝前輩回復
今天複習再檢查了一下並作註解,請前輩參考

Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
With Target
'↑以下是關於左鍵雙擊的程序
   If .Count > 1 Then Exit Sub
   '↑如果觸發的儲存格數大於1,就結束程式執行 (例如:觸發的是合併儲存格)
   If InStr("/主/副/●//", "/" & Trim(.Value) & "/") Then
   '↑如果觸發格值去除前後空白字元後,在前後連接 "/" 符號的新字串,包含在 "/主/副/●//"字串裡??
      .Font.ColorIndex = 1
      '↑令觸發格字色是 黑色
      .Value = Switch(.Value = "", "●", .Value = "●", "", .Value = "主", "", .Value = "副", "")
      '↑令觸發格值是以Switch 函式回傳的字串值
      'https://learn.microsoft.com/zh-tw/office/vba/language/reference/user-interface-help/switch-function
      '如果原儲存格值是 空字元,就回傳 "●"
      '如果原儲存格值是 "●",就回傳 空字元
      '如果原儲存格值是 "主",就回傳 空字元
      '如果原儲存格值是 "副",就回傳 空字元

      Cancel = True
      '↑取消左鍵雙擊的原功能
   End If
End With
End Sub
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
With Target
'↑以下是關於右鍵單擊的程序
   If .Count > 1 Then .Font.ColorIndex = 1: Call 檢測_選取問題格: Exit Sub
   '↑如果觸發的儲存格數大於1,令觸發格字色是 黑色,執行 (檢測_選取問題格)副程式,結束程式執行
   If InStr("/主/副/●//", "/" & Trim(.Value) & "/") Then
   '↑如果觸發格值去除前後空白字元後,在前後連接 "/" 符號的新字串,包含在 "/主/副/●//"字串裡??
      .Value = Switch(.Value = "", "主", .Value = "●", "主", .Value = "主", "副", .Value = "副", "主")
      '↑令觸發格值是以Switch 函式回傳的字串值
      '如果原儲存格值是 空字元,就回傳 "主"
      '如果原儲存格值是 "●",就回傳 "主"
      '如果原儲存格值是 "主",就回傳 "副"
      '如果原儲存格值是 "副",就回傳 "主"

      Cancel = True
      '↑取消右鍵單擊的原功能
   End If
End With
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
'↑以下是關於儲存格內容編輯觸發的程序
   Call 檢測_選取問題格
   '↑執行 (檢測_選取問題格)副程式
   
End With
End Sub

Option Explicit
Sub 檢測_選取問題格()
Dim Arr, xR As Range, C%, i&, R&, n&
'↑宣告變數! (Arr)是通用型變數,(xR)是儲存格變數,(C)是短整數變數,(i,R,n)是長整數變數
Arr = ActiveSheet.UsedRange
'↑令Arr這通用型變數是二維陣列,以現表有使用儲存格擴展最小方正範圍儲存格值倒入
For C = 1 To UBound(Arr, 2)
'↑設順迴圈!C從1到Arr陣列橫向最大索引欄號數
   For R = 1 To UBound(Arr)
   '↑設順迴圈!R從1到Arr陣列縱向最大索引列號數
      If InStr("/主/副/●/", "/" & Trim(Arr(R, C)) & "/") Then
      '↑如果迴圈Arr陣列值去除前後空白字元後,在前後連接 "/" 符號的新字串,包含在 ""/主/副/●/""字串裡??
         If Cells(R, C).Font.ColorIndex <> 1 Then Cells(R, C).Font.ColorIndex = 1
         '↑如果迴圈儲存格字色不是黑色!就變為 黑色
         n = n + 1
         '↑令n這長整數變數累加 1
         If n >= 7 Then
         '↑如果n變數 > 7 ??
            If Not xR Is Nothing Then
            '↑如果xR這儲存格變數已有物件
               Set xR = Union(xR, Cells(R, C))
               '↑令xR變數將 迴圈儲存格納入在 xR變數後面,成為新的儲存格集
               Else
                  Set xR = Cells(R, C)
                  '↑否則令xR 是迴圈儲存格
            End If
         End If
         Else
            n = 0
            '↑令n變數歸零
      End If
   Next
   n = 0
   '↑令n變數歸零(因為跨欄不再累加上班天數)
Next
If Not xR Is Nothing Then
'↑如果xR這儲存格變數已有物件
   Application.Goto xR
   '↑選取xR變數儲存格
   xR.Font.ColorIndex = 3
   '↑令xR變數儲存格字色是 紅色
   MsgBox "****  連續七天上班!  ****"
   '↑跳出提示窗
End If
End Sub
作者: jsc0518    時間: 2023-2-10 21:51

回復 10# Andy2483

Dear Andy,
謝謝您詳細的把各語法的意思寫出來,真的很感謝您!




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)