透過VBA 製作新增核取方塊效果



在進入閱讀本文章的內容之前,思考一下如果想要製作選取方塊的效果,
要怎麼製作呢?

或許您已經製作過核取方塊,並用在很多地方。
但如果當您的Excel內需要重複設定大量的核取方塊,
想使用VBA,但不知道怎麼處理時,可以參考本篇文章。
或許可以給您一點想法也說不定。

如果你在您的程式中也遇到相同的問題,不妨以以下簡單的方式,
測試看看。


目錄

{tocify} $title={目錄} 


前言

話說在前些日子,有朋友問我說,他想要透過VBA來製作核取方塊的效果。
我笑著說,如果只是幾個核取方塊勾選,不需要用到VBA,只需要簡單的EXCEL設定就好了。

可以簡單做的事情,或許不需要追求一直寫程式來優化,除非工作量真的大的重複性作業,基於效率上的需求,或許才思考是否製作程式來簡化自己的工作工作流程及時間。

接下來就讓我們看看要怎麼製作核取方塊吧。

以下說明使用Excel 2019 ,版本不同或許有點差異,
但基本上製作的方法差不多是一樣的。

程式最終製作的成果會如下圖。


開始製作程式: 階段1 程式說明


Point!

1. 使用手動新增核取方塊

2. 使用VBA新增核取方塊(表單控制項)程式範例預覽


使用手動製作核取方塊

1. 開啟Excel 活頁簿,準備類似這樣的清單,
    我們打算在代辦事項的右側加上選取方塊。

  

2. 接著在上方的開發人員選項中選擇插入,在插入裡面我們可以看到
    表單控制項,在表單控制巷裡有個打勾的圖案,就是本次的主角
    核取方塊。

    如果不知道怎麼開啟上發的開發人員標籤,
    可以參考網站文章的  如何開始使用VBA   文章
    文章內有教學如何開啟開發人員選項的說明。


3.  接著在需要的位置點一下,調整適當長度,放開滑鼠左鍵後,
     就會出現像下方一樣的核取方塊,核取方塊預設是會有名稱的。



     這邊的名稱可以使用滑鼠右鍵,選取編輯文字,修改名稱。
     如果想要移動核取方塊,可以按著滑鼠右鍵進行拖拉,移動到想要的位置。


 4.  如果想要複製更多的核取方塊,把核取方塊放在儲存格內。
      接下來選取儲存格右下角的點點往下拉,就可以一次製作多個核取方塊。

 

5.  如果想要設定按下核取方塊的效果,可選取想要設定的核取方塊。
     接著在核取方塊的地方按下滑鼠右鍵,這時會出現選單。
     在選單內選擇控制項格式。
     

下方簡單設定B2位置的核取方塊,儲存格連結到C2
注意 Excel內 儲存格的英文 C 和 2 前方的 $ 符號代表鎖定的意思。


 設定完之後,當按下核取方塊後,對應的C儲存格位置,
 就會顯示TRUE或FALSE,
 當選取的時候顯示TRUE,沒有選取的地方就會顯示FALSE。



現在看到左側A欄儲存格的代辦事項,顯示為紅色刪除。
要顯示這個效果,要進行另外一個條件式格式設定。

6.  要設定之前,先選擇要連結的儲存格,
選擇常用,接下來選擇條件式格式,再選擇新增規則。



    這邊假設已經選取了A2的儲存格,並選擇了新增規則。
    接下來要設定新增格式化的規則,這邊選擇使用公式來決定要格式化那些儲存格
    然後在下方的格式化在此公式為True的值內選取C2進行連結。


    接著點選上圖內的格式,可以跳出設定儲存格格式的視窗。
    在設定好想要的格式後按下確定即可。
   

7.  製作完後效果就會像下圖一樣,當B2的核取方塊選取時,
     C2的位置會顯示True,接著剛剛設定格式化條件的A2,
     會因為設定當True時,顯示格式化條件設定的格式。


   這樣就完成了簡單的1個設定。
   當然數量少的時候你也可以一個一個設定,但是如果有100個,
   也許就沒辦法這樣輕鬆了。
   
   也正是因為這樣,會撰寫VBA可以提升重複作業上的效率。

關於階段1可參考以下連結影片




開始製作程式: 階段2 



Point!

1. 新增核取方塊 + 條件式格式設定

2. 效果確認


階段2要撰寫的是新增核取方塊和條件式設定的部分。
這裡主要為階段1的延伸,階段1裡的設定,可以透過階段2撰寫的方式呈現。
撰寫的方式參考以下的程式碼。

程式碼

Sub AddCheckBoxes()

  '宣告變數和資料型態
  Dim count As Integer 'count為儲存格計算用宣告為整數
  
  '宣告CheckBox新增時所在位置的變數
  Dim cbLeft As Double 'CheckBox左側位置
  Dim cbTop As Double  'CheckBox上端位置
  Dim cbWidth As Double  'CheckBox的寬度
  Dim cbHeight As Double 'CheckBox的高度
  
  '關閉畫面更新
  Application.ScreenUpdating = False
  
  'For迴圈列出需要的核取方塊
  '範例中最後一行數字為11
  For count = 2 To 11
  
      '設定B列 核取方塊(表單控制項) ============================
      With Range("B" & count)
          cbLeft = .Left
          cbTop = .Top
          cbWidth = .Width
          cbHeight = .Height
      End With
      
  '新增核取方塊(表單控制項)及核取方塊的屬性選項
  ActiveSheet.CheckBoxes.Add(cbLeft, cbTop, cbWidth, cbHeight).Select
  With Selection
      .Caption = ""       '核取方塊文字為空白
      .Value = xlOff      '為非核取狀態
      .Display3DShading = False   '3D陰影不顯示
      .LinkedCell = Range("C" & count).Address   '連結的儲存格
  End With
  
  '設定C列的值為False ==============================
  
  Range("C" & count).Value = False
  
  '設定格式化條件 =================================
  '追加格式化條件
  Range("A" & count).FormatConditions.Add xlExpression, xlEqual, "=$C$" & count
  
  '新增第一個條件式的字型格式
  With Range("A" & count).FormatConditions(1).Font
    .Strikethrough = True    '刪除線
    .Color = RGB(255, 0, 0)    '顏色設定為紅色
    .TintAndShade = 0    '色彩變淡或變深設為中性
  End With
  
  '如果為True則停止-設為False
  Range("A" & count).FormatConditions(1).StopIfTrue = False
 Next
 
 '開啟畫面更新
 Application.ScreenUpdating = True
 
 '回復到選擇A1的狀態
 Range("A1").Select
   
End Sub

關於階段2可參考以下連結影片



開始製作程式: 階段3


Point!

1. 清除核取方塊

2. 全選

3. 取消全選

4. 效果確認



階段3主要撰寫清除核取方塊,還有全部選取,
以及取消全部選取的程式。

階段3裡的清除核取方塊並非必要,只是在於如果新增A欄的資料後,
如果沒有清除之前的核取方塊,又按下新增按鈕時,
核取方塊會另外又多新增一個疊在上面。
多重堆疊的核取方塊有可能會造成錯誤。
因此設計這個功能,防止新增的核取方塊不斷堆疊。

全部選取和取消全部選取可能並非經常使用之功能,
可參考使用。

注意在下方的程式,只設定A2~A11,也就是範例的範圍,
如果需要更大的範圍,請參考以下程式碼再修改設定。
以符合您的需求。

清除核取方塊


程式碼

Sub RemoveCheckboxes()

  '清除A2到A11的條件式格式設定資料
  Range("A2:A11").FormatConditions.Delete
  
  '清除B2到C11的資料
  Range("B2:C11").ClearContents
  
  '宣告cb變數為Checkbox物件類型
  Dim cb As CheckBox
  
  '使用For Each 針對目前工作表內的核取方塊做循環處理
  For Each cb In ActiveSheet.CheckBoxes
      '刪除
      cb.Delete
  Next
  
End Sub


全部選取

程式碼

Sub SelectAll()

    '將C2~C11範圍的值設定為True
    Range("C2:C11").Value = True
    
End Sub


取消全部選取

程式碼

Sub DeselectAll()

    '將C2~C11範圍的值設定為False
    Range("C2:C11").Value = False
    
End Sub

關於階段3可參考以下連結影片



張貼留言 (0)
較新的 較舊