Board logo

標題: excel 產生多個核取方塊. [打印本頁]

作者: sworder12    時間: 2013-9-1 01:37     標題: excel 產生多個核取方塊.

我有一個表單需製作,內容是根據我給予的文字,按照文字來產生各個核取方塊.
範例如圖


因為我有上百段需要設定成為核取方塊...目前是一個一個看著文字後輸入..很慢...
作者: oobird    時間: 2013-9-1 08:57

  1. Sub test()
  2.     For Each c In ActiveSheet.Cells.SpecialCells(2)
  3.         Set b = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", _
  4.                                            Left:=c(1, 2).Left, Top:=c.Top, Width:=c.Width, Height:=c.Height)
  5.         b.Object.Caption = c.Value
  6.     Next
  7. End Sub
複製代碼

作者: sworder12    時間: 2013-9-5 15:24

感謝版主,在家用office 2010測試正常,
因為我需要用 true/false 做計數功能.但公司版本是舊版的,不像新版的那麼方便,可以直接按屬性->LinkedCell
[attach]15951[/attach]

請問在舊版的 excel 如何開啟屬性呢?試了許久試不出來....:(
作者: GBKEE    時間: 2013-9-5 15:58

回復 3# sworder12
2003版可用
  1. Option Explicit
  2. Sub Ex()
  3.     Dim S As Integer, C As Variant
  4.     For Each C In ActiveSheet.OLEObjects
  5.         If C.Name Like "CheckBox*" Then
  6.             S = S + IIf(C.Object.Value, 1, 0)
  7.         End If
  8.     Next
  9.     MsgBox S
  10. End Sub
複製代碼

作者: ML089    時間: 2013-9-5 16:25

回復 4# GBKEE


請問用2#作出來 核取方塊 可以統計勾選數量

若用人工插入的 核取方塊 為何無法統計勾選數量,需要在設定甚麼
作者: GBKEE    時間: 2013-9-5 16:49

回復 5# ML089

[attach]15952[/attach]
  1. Option Explicit
  2. Sub Ex()
  3.     Dim S As Integer, C As Variant
  4.     For Each C In ActiveSheet.OLEObjects   '控制工具箱的控制項 (MSForms.CheckBox)
  5.         If C.Name Like "CheckBox*" Then
  6.             S = S + IIf(C.Object.Value, 1, 0)
  7.         End If
  8.     Next
  9.     MsgBox S
  10.     S = 0
  11.     For Each C In ActiveSheet.CheckBoxes    '表單的控制項(核取方塊)
  12.             S = S + IIf(C.Value = 1, 1, 0)
  13.     Next
  14.     MsgBox S
  15. End Sub
複製代碼

作者: ML089    時間: 2013-9-5 17:28

本帖最後由 ML089 於 2013-9-5 17:31 編輯

回復 6# GBKEE


    原來 CheckBox 與 核取方塊不同,謝謝你詳細的解說

   這兩個使用上有何差別?
作者: GBKEE    時間: 2013-9-5 20:07

回復 7# ML089
控制工具箱的控制項,可寫VBA

[attach]15957[/attach]
作者: oobird    時間: 2013-9-5 20:44

若你想用LinkedCell屬性計算,那就是表單工具的核取方塊了,可改成這樣:(例如LinkedCell放在m欄)
  1. Sub test()
  2.     For Each c In ActiveSheet.Cells.SpecialCells(2)
  3.         Set b = ActiveSheet.CheckBoxes.Add(c(1, 2).Left, c.Top, c.Width, c.Height)
  4.         b.Characters.Text = c.Value
  5.         i = i + 1
  6.         b.LinkedCell = Cells(i, 13).Address
  7.     Next
  8. End Sub
複製代碼

作者: oobird    時間: 2013-9-5 20:52

回復 9# oobird


    結果如圖:
[attach]15958[/attach]
作者: ML089    時間: 2013-9-5 23:28

回復 8# GBKEE
回復 9# oobird

我用控制工具箱插入CheckBox1後,以右鍵選用出現的是「檢視程式碼」
我用oobird大9#的程式插入CheckBoxes後,以右鍵選用出現的是「指定巨集」
這是不一樣的物件嗎?

「檢視程式碼」與「指定巨集」的使用方式不一樣,請各位高手有沒有習慣性用那一種比較好用。

[attach]15961[/attach]
作者: ML089    時間: 2013-9-5 23:40

回復 9# oobird
回復 2# oobird

我用oobird超版2#的程式碼加上LinkedCell屬性也可以用來計算,但按右鍵選項中「指定巨集」就變成灰色不能選用。
OLEObjects.Add是否比CheckBoxes.Add使用上更有彈性?
  1. Sub 選取格_FormsCheckBox()
  2.     For Each C In Selection.Cells.SpecialCells(2)
  3.         Set b = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", _
  4.                                            Left:=C.Left, Top:=C.Top, Width:=C.Width, Height:=C.Height)
  5.         b.Object.Caption = C.Value
  6.         b.LinkedCell = C.Address '連結該位置以TRUE、FALSE表示,以利後續統計
  7.         'C.Value = False '起始值設定
  8.     Next
  9. End Sub
複製代碼

作者: GBKEE    時間: 2013-9-6 07:02

回復 12# ML089
[attach]15963[/attach]

[attach]15964[/attach]
作者: stillfish00    時間: 2013-9-6 11:12

本帖最後由 stillfish00 於 2013-9-6 11:17 編輯

回復 12# ML089
翻了一下書,有寫到 Forms Control 和 ActiveX Control 各自優點,整理一下。

Forms Control :
    *可用在 Chart sheets,ActiveX Control 不能。
    *與工作表的結合較緊密,像"標籤"或"按鈕"可在公式列去參考,以動態地設定控制項文字。
        又如"清單方塊"可在其控制項的輸入範圍指定已定義的範圍名稱。
    *容易同時指定很多個控制項到同一個VBA程序,要達到同樣功能 ActiveX Control 需要比較複雜的物件類別的方法。
    *當使用多視窗或分割視窗時,ActiveX Control 只會作用在原視窗,Forms Control 會作用在任何視窗。

ActiveX Control :
    *ActiveX Control 控制項的外觀有較多屬性可以調整。
    *有比較多種類的控制項可使用。
    *可以回應控制項多種不同類型的事件,Forms Control 只能對應執行一個巨集。
作者: c_c_lai    時間: 2013-9-6 11:28

回復 14# stillfish00
蠻不錯的詮釋,受教了!
作者: ML089    時間: 2013-9-6 12:50

回復 13# GBKEE
謝謝你,真是一圖勝百言,解說詳盡

回復 14# stillfish00
謝謝你,你這整理的資料可真寶貴,昨天在網路沒查詢到資料(應該是關鍵字沒用對)
作者: sworder12    時間: 2013-9-7 21:17

回報一下
4F GBKEE 大大的還是沒辦法使用..最後跳出小視窗顯示一個「 0 」
9F oobird 大大的可正常使用
但想請教額外問題,如果其中整行內的資料有變動,但不是全部.
如果我重新執行巨集的話,會蓋到前一次生成出來的核取方塊,造成兩個核取方塊重疊.
有辦法避免嗎??
作者: GBKEE    時間: 2013-9-8 13:56

回復 18# sworder12
最後跳出小視窗顯示一個「 0 」 請附檔看看
解決造成兩個核取方塊重疊.的程式碼
  1. Option Explicit
  2. Sub Ex()
  3.     Dim C As Variant, B As Object, I As Integer, Rng(1 To 2) As Range
  4.     With ActiveSheet
  5.         Set Rng(1) = .Range("A:A").SpecialCells(2)  '處裡 A欗有資料的文字的 CheckBoxe
  6.         If .CheckBoxes.Count > 1 Then
  7.             For Each C In .CheckBoxes
  8.                 If Not Intersect(C.TopLeftCell.Offset(, -1), Rng(1).EntireColumn) Is Nothing Then
  9.                     If C.TopLeftCell.Offset(, -1) = "" Then
  10.                         C.TopLeftCell.Offset(, 1) = ""
  11.                         C.Delete
  12.                     Else
  13.                         C.Characters.Text = C.TopLeftCell.Offset(, -1)
  14.                         If Rng(2) Is Nothing Then
  15.                             Set Rng(2) = C.TopLeftCell.Offset(, -1)
  16.                         Else
  17.                             Set Rng(2) = Union(Rng(2), C.TopLeftCell.Offset(, -1)) '.Offset(, -1)
  18.                         End If
  19.                     End If
  20.                 End If
  21.             Next
  22.         End If
  23.         For Each C In Rng(1)        'Rng(2): CheckBoxe 的TopLeftCell儲存格
  24.             If Rng(2) Is Nothing Then
  25.                 Set B = .CheckBoxes.Add(C(1, 2).Left, C.Top, C.Width, C.Height)
  26.                 B.Characters.Text = C
  27.                 B.LinkedCell = C.Offset(, 2).Address
  28.             ElseIf Intersect(C, Rng(2)) Is Nothing Then
  29.                 Set B = .CheckBoxes.Add(C(1, 2).Left, C.Top, C.Width, C.Height)
  30.                 B.Characters.Text = C
  31.                 B.LinkedCell = C.Offset(, 2).Address
  32.             End If
  33.         Next
  34.     End With
  35. End Sub
複製代碼

作者: sworder12    時間: 2013-9-8 22:52

本帖最後由 GBKEE 於 2013-9-9 06:09 編輯
回復  sworder12
最後跳出小視窗顯示一個「 0 」 請附檔看看
解決造成兩個核取方塊重疊.的程式碼
GBKEE 發表於 2013-9-8 13:56


97-2003版本以及2010版本我在家執行也一樣...



作者: sworder12    時間: 2013-9-10 12:05

最後跳出小視窗顯示一個「 0 」 請附檔看看

[attach]15999[/attach]

另外在請教一個問題,如果如圖的格式跑掉,該往哪邊檢查?不知道google該怎麼搜尋...
[attach]16000[/attach]
作者: sworder12    時間: 2013-9-10 12:09

最後跳出小視窗顯示一個「 0 」 請附檔看看



另外在請教一個問題,如果如圖的格式跑掉,該往哪邊檢查? ...
sworder12 發表於 2013-9-10 12:05



忘記補充...滾輪往下移之後,核取方塊會漸漸往上跑....
作者: mulder_shiu    時間: 2013-9-10 19:24     標題: 請問如何取得核取方塊的行列位置呢?

本帖最後由 mulder_shiu 於 2013-9-10 19:26 編輯

Sub test()
S = 0
For Each C In ActiveSheet.CheckBoxes    '表單的控制項(核取方塊)
    S = S + IIf(C.Value = 1, 1, 0)
    If C.Value = 1 Then
       MsgBox C.Cells.Row    '當條件成立時,取得cells的行數和列數
    End If
Next
MsgBox S
End sub

請問大大ActiveSheet.CheckBoxes 當條件式成立時,我想取得當下cells的行數和列數??
作者: stillfish00    時間: 2013-9-10 20:18

回復 1# mulder_shiu
C.TopLeftCell.Row
作者: mulder_shiu    時間: 2013-9-10 20:23

回復 2# stillfish00


    感謝大大的幫助,今天找了一天了 囧...




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