我对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语句中引用的内容,但我不知道如何。
答案 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
循环。