2015-10-19 70 views
0

我很难理解VBA编码方法(我只有R经验)。我正在尝试使用VBA将userform复选框的值链接到工作表中的特定单元格。复选框/单元格与多个用户表单链接

Sub x() 
    Dim Range As Range 

    If userfrom.checkbox1.Value = True Then 
     Range.Offset(0, 7).Value = 1 
    Else 
     Range.Offset(0, 7).Value = "" 
    End If 


    If userform.checkbox2.Value = True Then 
     Range.Offset(0, 8).Value = 1 
    Else 
     Range.Offset(0, 8).Value = "" 
    End If 


    If userform.checkbox3.Value = True Then 
     Range.Offset(0, 9).Value = 1 
    Else 
     Range.Offset(0, 9).Value = "" 
    End If 

    Unload userform 

End Sub 

我遇到了将复选框分配给数组的方法,但无法理解线程中的示例。理想情况下,我想要做的是声明一组复选框以及一组单元格 - 并将每个数组中的每个元素链接在一起,即checkboxArray(1) - > cellArray(1); checkboxArray(2) - > cellArray(2);等等。

我的一位同事检查了我的代码,并说它可以做得更好,即在一行中完成。

这是可以实现的吗?

+3

只是好奇 - 为什么不问你的同事呢? – pnuts

+0

在我看来,它的作业 – Poof

+0

您可以通过将ControlSource设置为所需的单元格,在复选框属性中设置复选框的单元格值。 –

回答

0

您可以简单地将复选框的ControlSource设置为工作表中的预定义单元格,并彻底废除代码。

但是,如果您需要它是动态的,基于您正在使用的工作表或范围,这里是一个功能强大且高效的解决方案,不依赖于表单上复选框的数量,并且易于更新。

顺便说一句,我不知道它是否实际上可以在一条线上完成。所有的整数计数都是从OP中的代码中获得的。

Sub x() 

Dim c As Control 

For Each c In Controls 

    If TypeName(c) = "CheckBox" Then 

     i = Replace(c.Name, "CheckBox", "") 

     If c.Value = True Then SetRange i + 6, 1 Else: SetRange i + 6, "" 

    End If 

Next 

End Sub 

Sub SetRange(i As Integer, sVal As String) 

Dim wks As Worksheet 
Set wks = Sheets("Sheet1") 'change to your sheet 

With wks 

    .Range("A1").Offset(, i).Value = sVal 'change "A1" to desired range 

End With 

End Sub