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

Posted

技术标签:

【中文标题】如何从 VBA Access 中勾选 Excel 复选框【英文标题】:How can I tick an Excel checkbox from VBA Access 【发布时间】:2018-02-10 16:36:00 【问题描述】:

我已经通过 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

【问题讨论】:

复选框不属于Excel.Application 实例。它甚至不属于您打开(并丢弃)的Workbook 实例;如果您正在寻找 ActiveX 或 Office-Forms 控件,您首先需要知道。您将在工作表的 OleObjects 集合中找到 ActiveX 控件,在 Shapes 集合中找到 Office-Forms 控件(不过,您还可以在其中找到嵌入式 ActiveX 控件的形状)。 您还需要知道该复选框的名称 谢谢,CheckBox 类型是 Office-Forms。我没有在链接中找到代码。我在 Excel.Application 实例中尝试了 Shape.CheckBox3.Value = True ,但在说“对象需要”。 【参考方案1】:

复选框属于特定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 实例,这些实例具有返回 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 组件,它已经被引用,在这种情况下,早期绑定代码是不费吹灰之力的) .

【讨论】:

精彩的解释! @DavidZemens 谢谢!只是一个巧合,不迟于昨晚我正在努力让 Rubberduck 了解表单和 ActiveX 文档控件,这样我们就可以终于停止出现声称“程序 'Button1_Click' 的烦人的误报检查结果”从未使用过”。 Mat's Mug,效果很好,非常感谢您的大力帮助。

以上是关于如何从 VBA Access 中勾选 Excel 复选框的主要内容,如果未能解决你的问题,请参考以下文章

从 Access VBA 编辑打开的 Excel 工作表

从 Excel VBA 运行嵌套的 Access SQL 查询

如何使用sql语句和vba将数据从MS-Access导入excel power查询?

从 Access 2010 VBA 打开 Excel 2010 文件

VBA - 从 Access (QueryTable) 生成 Excel 文件

VBA - 从 Excel 更新 Access 文件的链接表