如何从VBA Access中勾选Excel复选框

时间:2017-09-01 15:07:21

标签: excel vba ms-access checkbox

我通过VBA Access打开了一个Excel文件,可以在Excel单元格中读写。如何勾选Excel Ckeck Box?

我的代码:

Dim Excel_App  As Object
Dim strExcel As String
Set Excel_App = CreateObject("Excel.Application")
Excel_App.Visible = True
Excel_App.Workbooks.Open fready
With Excel_App
    .CheckBox3.Value = True 'This line is used in VBA Excel and I need in  Access
End With

1 个答案:

答案 0 :(得分:3)

复选框属于特定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集合中找到它,并且当TypemsoFormControl时,我们会知道我们正在查看表单控件;当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个实例,它们具有返回Object对象的MSForms.CheckBox属性;您可以从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检查更加健壮。您需要通过工具>引用MSForms类型库。引用来使用它(如果你的VBA项目有任何UserForm组件,它已被引用,在这种情况下,早期绑定的代码是明白的。)