2016-04-28 177 views
0

我試圖創建一個宏來選擇某個列的所有複選框。 例如,對於每列,我有10個標準複選框,每個列有主複選框作爲「全選」。 我的代碼向下選擇每個複選框,但無法弄清楚如何小幅調整它,只選擇或不選擇單元格A2:在列B,C等A10例如,而不是箱使用主複選框選擇特定的複選框

我使用這個簡單的腳本;

Sub SelectAll_Click() 
Dim CB As Checkbox 
For Each CB In ActiveSheet.CheckBoxes 
If CB.Name <> ActiveSheet.CheckBoxes("Check Box 1").Name Then 
CB.Value = ActiveSheet.CheckBoxes("Check Box 1").Value 
End If 
Next CB 
End Sub 

我曾嘗試改變<,>,=複選框名稱以識別出聲小於塔B 的第一複選框除了在=範圍添加()

我的對於所有這些都是全新的,我敢肯定,隨着時間的推移和學習,我會回顧並嘲笑我的路障,但如果有人能夠暫時借給我他們的專業知識,我們將不勝感激。

感謝

+0

你在使用 - 表單控件或ActiveX控件? – Spidey

+0

[複選框以選中並取消選擇電子表格中的所有其他複選框]可能的重複(http://stackoverflow.com/questions/15301445/check-box-to-select-and-deselect-all-other-check-boxes在電子表格) –

+0

窗體控件**對不起 – Awill

回答

0

爲了有一個宏觀調控工作的所有主 - 複選框使用來電顯示和比較topleftcell.column:

Sub CheckComboboxesInColumn() 
Dim CallerString As String, CallerBox As CheckBox 
Dim chk As CheckBox 

    CallerString = Application.Caller 
    Set CallerBox = ActiveSheet.CheckBoxes(CallerString) 

    For Each chk In ActiveSheet.CheckBoxes 
     If chk.TopLeftCell.Column = CallerBox.TopLeftCell.Column Then chk.Value = CallerBox.Value 
    Next chk 
End Sub 
+0

這正是我最初尋找的謝謝你。 因爲我用一個按鈕換掉了我的主複選框,我試圖改變字符串來識別按鈕,但是失敗了,因此我的電子表格轉換回所有複選框。 我假設它比將主題複選框標識符替換爲按鈕更復雜。 – Awill

0

如果引用的複選框爲表內的Shape對象,那麼你可以訪問屬性.TopLeftCell它會告訴你該複選框位於哪一列。下面的代碼將所有表單控件檢查工作只需將列#(此代碼中爲1)更改爲您希望的列,並在每種情況下更改主複選框的名稱。

Sub SelectAllColumnA_Click() 
Dim shp As Shape 
For Each shp In ActiveSheet.Shapes 
    If shp.Type = msoFormControl Then 'Form control 
     If shp.FormControlType = xlCheckBox Then 
      If shp.Name = "Check Box 1" Then 
       'Do not alter value of master check box "Check Box 1" 
      ElseIf shp.TopLeftCell.Column = 1 Then 
       shp.ControlFormat.Value = ActiveSheet.CheckBoxes("Check Box 1").Value 
      End If 
     End If 
    End If 
Next shp 
End Sub 

編輯:我簡化了代碼,因爲你說你正在使用窗體控件。

編輯2:這是一個簡單的添加,它將改變主複選框的狀態。

Sub SelectSubCheckBoxA() 
ActiveSheet.CheckBoxes("Check Box 1").Value = 2 
End Sub 

只需將此宏分配給列A中的每個複選框。對於其他列,創建此宏的新版本並更改主複選框的名稱。這樣,當您單獨選中任何複選框時,它將在視覺上「禁用」主複選框。

+0

非常感謝,只是經過測試,並且每列都有效。唯一的情況是,「主」複選框始終處於選中狀態。每次單擊它時,我都可以選擇並取消選擇整個列,但是支票將保留在該框中。我認爲這不是什麼大問題,如果我可以用一個按鈕替換全選複選框,但看着腳本,這是行不通的。 – Awill

+0

這很奇怪,它似乎在我的測試文件中工作正常。你的模塊中是否還有其他代碼可以改變複選框?也許你正在觸發另一個事件,然後編輯mastercheckbox。 此代碼應該與一個按鈕一起工作,只需刪除主複選框的檢查(因爲這通過複選框循環,它不會看到你的主「按鈕」)。 – Swaffle

+0

再次感謝swaffe, 看起來它是同時重新選中主複選框,因爲它與「追隨者」框位於同一列。 我確實希望select all複選框與它選擇的框位於同一列,是否沒有辦法設置範圍而不是整列? – Awill

0

在我看來,你想根據它們所在的列來檢查/取消選中你的框。因此,我會提出以下代碼:

Public Sub CheckComboBoxBasedOnColumn() 

Dim chk As CheckBox 

For Each chk In Sheet2.CheckBoxes 
    Select Case Split(chk.TopLeftCell.Address, "$")(1) 
    Case "A" 
     'If the checkbox is in column A then check it. 
     chk.Value = True 
    Case "B" 
     'If the checkbox is in column B then un-check it. 
     chk.Value = False 
    Case "C" 
     '... what ever you want for column C 
    Case Else 
     '... or any other column 
    End Select 
Next chk 

End Sub 

讓我知道這是否解決了您的問題。

+0

感謝您的回覆,我不認爲這真的是我的意圖。我不想取消選擇其他列,同時選擇另一列。我將設置多個主複選框來選擇同一列中的所有複選框。所以主複選框是A1,我希望它選擇列A中的所有框; B1中的另一個主複選框,選擇列B中的所有框。 – Awill