0

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

我正在尝试循环浏览一些(但不是全部)复选框。它们目前被命名为 CheckBox1 到 CheckBox15。Howe 我如何循环通过例如 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,但不适用于复选框。当我查看 ole 的属性时,我看到它的 Object 属性设置为 Object/Checkbox 并且这个 Object 有一个值。我想这就是我应该在 if 语句中引用的内容,但我不知道如何。

4

3 回答 3

1

我想我解决了这个问题。

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

If ole.Object.Value = True Then

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

于 2012-11-17T20:51:32.463 回答
0

采用CheckBox.Name

例子:

For Each cb In ActiveSheet.CheckBoxes 
    If cb.Name = "CheckBox5"
        ' Do stuff
    End If
Next cb 
于 2012-11-15T18:21:56.490 回答
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根据您使用的控件类型使用循环即可。

于 2012-11-15T18:27:42.953 回答