2017-09-30 47 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

相关问题