循环访问我的Excel页面上的一些复选框

时间:2012-11-15 18:14:38

标签: vba

我对VBA非常陌生(并且只在excel中知道它。)

我试图循环访问一些(但不是全部)复选框。它们目前通过CheckBox15命名为CheckBox1。我怎么循环说CheckBox5到CheckBox10?

我想我希望有一个类似于'CheckType'的'方法'用于控件,可以让我检查名字?

这是我尝试过的。导致编译错误 - 未定义子或函数,并突出显示工作表。

Private Sub BoxCheck()
atLeastOneChecked = False
    For i = 2 To 4
        If Worksheets("ActiveX").Controls("Checkbox" & i).Value = True Then
            atLeastOneChecked = True
        End If
    Next i
End Sub

虽然以上不起作用,但下面的内容是:

Private Sub BoxCheck()
    atLeastOneChecked = False

    For i = 1 To 2
       If Sheet2.CheckBox2.Value = True Then
                atLeastOneChecked = True
       End If
    Next i

End Sub

当然,循环对结果没有影响,但是当Checkbox2为True时,它会编译并且atLeastOneChecked从False变为True。请注意,Sheet2已命名为ActiveX。我显然不明白工作表和控件是如何工作的。有人可以帮忙吗?

修复下面描述的错误后,这仍然无效。我简化为以下内容:

Private Sub BoxCheck()
    Dim ole As OLEObject

    atLeastOneChecked = False
    Set ole = Sheets("ActiveX").OLEObjects("Checkbox2")
    If ole.Value = True Then
        atLeastOneChecked = True
    End If
 End Sub

这不起作用。它失败了:

If ole.Value = True Then

错误状态:对象不支持此属性或方法

这适用于OLEObjects,但不适用于Checkboxes。当我查看ole的属性时,我看到它的Object属性设置为Object / Checkbox,并且该Object有一个值。我想这就是我应该在if语句中引用的内容,但我不知道如何。

3 个答案:

答案 0 :(得分:1)

我想我解决了这个问题。

通过引用我设置的OLEObject中的Object属性来访问Checkbox的值...像这样:

If ole.Object.Value = True Then

感谢您的帮助。如果有人有更优雅的解决方案,我仍然希望看到它。

答案 1 :(得分:0)

使用CheckBox.Name

示例:

For Each cb In ActiveSheet.CheckBoxes 
    If cb.Name = "CheckBox5"
        ' Do stuff
    End If
Next cb 

答案 2 :(得分:0)

扩展@Parker的回答:

Private Sub BoxCheck()
    atleastonechecked = False
    Dim oles As OLEObject
    For i = 2 To 4
        'If you're using Shapes Controls:
        If ThisWorkbook.Worksheets("ActiveX").Shapes("Check Box " & i).Value = True Then
            atleastonechecked = True
        End If
        ' If you're using ActiveX Controls
        Set oles = ThisWorkbook.Worksheets("ActiveX").OLEObjects("CheckBox" & i)
        If oles.Value = True Then
            atleastonechecked = True
        End If
    Next i
End Sub

抱歉,只需将上一个答案放在一起而不进行测试 - 总是会失败。只需根据您正在使用的控件类型使用If循环。