复选框属于特定Worksheet 上的特定集合。这是哪个集合,取决于您要查找的控件类型。
您的代码写得好像复选框属于 Excel.Application 对象 - 这是行不通的。
首先,您需要保留对您正在打开的 Workbook 对象的引用,所以不要这样:
Excel_App.Workbooks.Open fready
你需要这个:
Dim book As Object ' early-bound: As Excel.Workbook
Set book = Excel_App.Workbooks.Open(fready)
如果您不知道要在哪个工作表上找到复选框,则必须迭代工作簿的 Worksheets 集合:
Dim sheet As Object ' early-bound: As Excel.Worksheet
For Each sheet In book.Worksheets
'todo
Next
表单控件
所以我们正在寻找CheckBox 表单控件。我们会在工作表的Shapes 集合中找到它,并且当它的Type 是msoFormControl 时,我们会知道我们正在查看一个表单控件;当它的FormControlType属性返回xlCheckBox时,我们就知道它是一个复选框控件:
Dim sheet As Object ' early-bound: As Excel.Worksheet
For Each sheet In book.Worksheets
Dim shp As Object ' early-bound: As Excel.Shape
For Each shp In sheet.Shapes
If shp.Type = 8 ' early-bound: msoFormControl
If shp.FormControlType = 1 ' early-bound: xlCheckBox
'todo
End If
End If
Next
Next
所以现在我们知道shp 是一个复选框表单控件。 Value 可以通过 ControlFormat 对象/属性访问,因此您可以像这样设置名为 Check Box 1(这是默认名称)的复选框的值:
If shp.Name = "Check Box 1" Then
shp.ControlFormat.Value = 1 'checked
End If
当然,如果您已经知道要查找的特定工作表,则无需全部迭代。
ActiveX 控件
如果控件是 ActiveX 控件,那就完全不同了;您会在 OLEObjects 集合中找到它,该集合包含 OLEObject 实例,这些实例具有返回 MSForms.CheckBox 对象的 Object 属性;您可以从OLEObject.ShapeRange.Name 获取复选框的名称:
Dim ctrl As Object ' early-bound: As Excel.OLEObject
For Each ctrl In sheet.OLEObjects
If TypeName(ctrl.Object) = "CheckBox" Then ' early-bound: If TypeOf ctrl.Object Is MSForms.CheckBox Then
If ctrl.ShapeRange.Name = "CheckBox1" Then
ctrl.Object.Value = True ' checked
End If
End If
Next
请注意,早期绑定的TypeOf ctrl.Object Is MSForms.CheckBox 检查比后期绑定的TypeName 检查更加稳健。您需要通过 Tools > References 引用 MSForms 类型库才能使用它(如果您的 VBA 项目有任何 UserForm 组件,它已经被引用,在这种情况下,早期绑定代码是不费吹灰之力的) .