2017-09-30 71 views
0

當我單擊我的工作表上的任意複選框時,我會瘋狂地嘗試找到代碼運行的方式。我已經看過多篇關於創建類模塊的文章,但我似乎無法讓它起作用。由ANY觸發的事件複選框單擊

我有代碼將填充列B以匹配列C.無論我手動輸入到C10將填充到B10,即使C10是一個公式:= D9。因此,我可以在D10中輸入TRUE,而C10中的公式將導致:TRUE,然後代碼填充B10以說:TRUE。真棒...訣竅是有一個複選框鏈接到D10。當我點擊複選框時,D10表示TRUE,而C10中的公式表示TRUE,但是就這一點而言。 VBA代碼無法識別複選框點擊。如果我然後點擊工作表(選擇更改),那麼代碼將運行,所以我知道我需要一個不同的事件。

很容易將事件更改爲「Checkbox1_Click()」,但是我希望它可以適用於任何我點擊的複選框。經過幾天尋找和嘗試不同的事情,我沒有任何運氣。

這裏是我運行至今

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
Dim i As Long 


For i = 3 To 11 
    Range("B" & i).Value = Range("c" & i) 
Next i 
    End Sub 

任何幫助,將不勝感激的代碼。

+0

這裏是一些代碼,我張貼處理多個按鈕....看看你是否能適應它來滿足您的需求... https://stackoverflow.com/questions/46381935/change-activex-命令按鈕顏色回到之前的顏色後點擊/ 46396731#46396731 – jsotola

+0

btw:你說你不能得到類模塊代碼運行,但你沒有發佈任何代碼引用類模塊。 – jsotola

+0

你爲什麼使用循環來賦值? ....只需使用'Range(「B3:B11」)= Range(「c3:c11」)。值' – jsotola

回答

0

這個作品

' this goes into sheet code 

Private Sub Worksheet_Activate() 
    activateCheckBoxes 
End Sub 

' put all this code in class a module and name the class module "ChkClass" 

Option Explicit 

Public WithEvents ChkBoxGroup As MSForms.CheckBox 

Private Sub ChkBoxGroup_Change() 
    Debug.Print "ChkBoxGroup_Change" 
End Sub 

Private Sub ChkBoxGroup_Click() 
    Debug.Print "ChkBoxGroup_Click"; vbTab; 
    Debug.Print ChkBoxGroup.Caption; vbTab; ChkBoxGroup.Value 
    ChkBoxGroup.TopLeftCell.Offset(0, 2) = ChkBoxGroup.Value 

End Sub 

' this code goes into a module 

Option Explicit 

Dim CheckBoxes() As New ChkClass 
Const numChkBoxes = 20 
' 

Sub doCheckBoxes() 
    makeCheckBoxes 
    activateCheckBoxes 
End Sub 

Sub makeCheckBoxes()  ' creates a column of checkBoxes 

    Dim sht As Worksheet 
    Set sht = ActiveSheet 

    Dim i As Integer 
    For i = 1 To sht.Shapes.Count 
    ' Debug.Print sht.Shapes(1).Properties 
     sht.Shapes(1).Delete 
     DoEvents 
    Next i 

    Dim xSize As Integer: xSize = 2  ' horizontal size (number of cells) 
    Dim ySize As Integer: ySize = 1  ' vertical size 

    Dim t As Range 
    Set t = sht.Range("b2").Resize(ySize, xSize) 

    For i = 1 To numChkBoxes 
     sht.Shapes.AddOLEObject ClassType:="Forms.CheckBox.1", Left:=t.Left, Top:=t.Top, Width:=t.Width - 2, Height:=t.Height 
     DoEvents 
     Set t = t.Offset(ySize) 
    Next i 

End Sub 

Sub activateCheckBoxes()  ' assigns all checkBoxes on worksheet to ChkClass.ChkBoxGroup 

    Dim sht As Worksheet 
    Set sht = ActiveSheet 

    ReDim CheckBoxes(1 To 1) 

    Dim i As Integer 
    For i = 1 To sht.Shapes.Count 

     ReDim Preserve CheckBoxes(1 To i) 
     Set CheckBoxes(i).ChkBoxGroup = sht.Shapes(i).OLEFormat.Object.Object 

    Next i 

End Sub 
+0

尤里卡!有用!!!!非常感謝!我在類模塊的底部添加了一小段代碼,只要點擊任意一個複選框,即可讓列B與列C匹配。上帝保佑你,先生! – csmith222

+0

我對此代碼的下一步有另一個問題,以使其適用於我的主要目的。我在猜測我應該如何去做這件事,就是將它作爲一個單獨的問題發佈,然後引用回這個頁面? – csmith222

0

您只需要讓每個複選框的_Click()事件知道您要運行Worksheet_SelectionChange事件。要做到這一點,你需要添加下面一行到每一個_Click()子:

Call Worksheet_SelectionChange(Range("a1")) 

請注意,這是無關緊要的傳遞什麼範圍的SelectionChange子,因爲你在你的代碼不使用Target

+0

感謝您努力的迴應,但部分想法是不必爲每個複選框編寫代碼,因爲此表中將有超過100個。我的手指在思索中顫抖!這是一個不錯的主意。我會提高你的答案,但顯然,我沒有足夠的聲譽爲這個網站讓別人受到我的投票。 : -/ – csmith222

相關問題