Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从VBA Access中勾选Excel复选框_Excel_Vba_Ms Access_Checkbox - Fatal编程技术网

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

如何从VBA Access中勾选Excel复选框,excel,vba,ms-access,checkbox,Excel,Vba,Ms Access,Checkbox,我已经通过VBA Access打开了Excel文件,可以在Excel单元格中读写。如何在Excel复选框中打勾 我的代码: 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.Val

我已经通过VBA Access打开了Excel文件,可以在Excel单元格中读写。如何在Excel复选框中打勾

我的代码:

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

复选框属于特定
工作表上的特定集合。这是哪个集合,取决于您要查找的控件类型

您的代码编写时,就好像复选框属于
Excel.Application
对象一样-这无法工作

首先,您需要保留对正在打开的
工作簿
对象的引用,因此:

你需要这个:

Dim book As Object ' early-bound: As Excel.Workbook
Set book = Excel_App.Workbooks.Open(fready)
如果不知道要在哪个工作表上找到复选框,则必须迭代工作簿的
工作表
集合:

Dim sheet As Object ' early-bound: As Excel.Worksheet
For Each sheet In book.Worksheets
    'todo
Next
窗体控件 因此,我们正在寻找一个
复选框
表单控件。我们会在表单的
形状
集合中找到它,当表单控件的
类型
msoFormControl
时,我们就会知道我们正在查看表单控件;当它的
FormControlType
属性返回
xlCheckBox
时,我们就知道它是一个checkbox控件:

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
是一个复选框表单控件。
可通过
控制格式
对象/属性访问,因此您可以设置名为
复选框1(默认名称)的复选框的值,如下所示:

If shp.Name = "Check Box 1" Then
    shp.ControlFormat.Value = 1 'checked
End If
当然,如果您已经知道要查找哪一张特定的工作表,则无需对它们全部进行迭代

ActiveX控件 如果控件是ActiveX控件,那就完全不同了;您可以在
OLEObjects
集合中找到它,该集合包含
OLEObject
实例,这些实例具有一个
Object
属性,该属性返回
MSForms.CheckBox
对象;您可以从
OLEObject.shaperage.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

注意,ctrl.Object的早期绑定
types是MSForms.CheckBox
check比后期绑定
TypeName
check更健壮。您需要通过工具>引用引用MSForms类型库来使用它(如果您的VBA项目有任何
UserForm
组件,那么它已经被引用了,在这种情况下,早期绑定代码是不需要动脑筋的)。

复选框不属于
Excel.Application
实例。它甚至不属于您打开(并丢弃)的
工作簿
实例;如果您正在寻找ActiveX或Office Forms控件,首先需要知道的是。您将在工作表的
OleObjects
集合中找到ActiveX控件,在
Shapes
集合中找到Office Forms控件(不过您也将在其中找到嵌入式ActiveX控件的形状)。您还需要知道该复选框的名称谢谢,复选框类型是Office Forms。我在链接中找不到代码。我在Excel中尝试了Shape.CheckBox3.Value=True。应用程序实例中说的是“object required”。非常好的解释@戴维哲门斯谢谢!只是一个巧合,不迟于昨晚,我正在努力让Rubberduck了解表单和ActiveX文档控件,这样我们就可以最终停止那个令人讨厌的假阳性检查结果,声称“程序“Button1_Click”从未使用过”。Mat的杯子,它工作得很好,非常感谢您的大力帮助。
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