【问题标题】:Cycling through some checkboxes on my excel page循环浏览我的 excel 页面上的一些复选框
【发布时间】:2012-11-18 04:51:32
【问题描述】:

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

我正在尝试循环浏览一些(但不是全部)复选框。它们目前被命名为 CheckBox1 到 CheckBox15。如何循环通过 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

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

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

【问题讨论】:

  • 您遇到的一个错误是您使用Worksheet,而您应该使用Worksheets。要早点发现这一点,请在模块顶部输入 Option Explicit
  • 谢谢 - 改变了,但它仍然不起作用。我知道为什么,但我不知道问题的解决方案。问题是 Worksheet 没有“控件”成员。它有 OLEobjects 和 Shapes,但我似乎也无法让它工作。

标签: vba


【解决方案1】:

我想我解决了这个问题。

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

If ole.Object.Value = True Then

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

【讨论】:

  • 啊,好一个。 ole.Value = True 没有为我抛出任何错误,但因为这对你有用,所以这是最好的答案。 :-)
  • 谢谢,这也是我的诀窍。 If (wsActions.OLEObjects("chkOpt1").Object.Value) Then doit(1) Else doit(0) / wsActions.OLEObjects("chkOpt1").Object.Value = False
【解决方案2】:

使用CheckBox.Name

例子:

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

【讨论】:

    【解决方案3】:

    扩展@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 循环即可。

    【讨论】:

    • 当我尝试这个时,我得到一个错误......它无法识别工作表。我已经编辑了我的原始问题以包含我尝试过的内容
    • 这仍然不适合我。我对错误感到困惑-“对象不支持此方法或属性”,当我调试时发生在 If ole.Value = True Then 当我检查 ole 的属性时,我发现它是一个 OLEObject/ CheckBox 和那个在 Object Property 中,它确实有值吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多