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

标签 excel vba ms-access checkbox

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

我的代码:

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

最佳答案

复选框属于特定 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 时,我们就会知道它是一个复选框控件。属性(property)返回 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 Access 对象/属性,因此您可以设置名为 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

注意早绑定(bind)TypeOf ctrl.Object Is MSForms.CheckBox check 比后期绑定(bind)的 TypeName 更加稳健查看。您需要通过 Tools > References 引用 MSForms 类型库才能使用它(如果您的 VBA 项目有任何 UserForm 组件,它已经被引用,在这种情况下,早期绑定(bind)代码是不费吹灰之力的)。

关于excel - 如何从 VBA Access 中勾选 Excel 复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46003167/

相关文章:

excel - VBA检查对象在设置之前是否存在

Excel VBA 正在更改我设置的范围

ms-access - 使用 VBA 在 Access 表中记录计数

vba - Excel VBA 将范围复制到新工作簿中

vba - 删除重复的可见行

excel - 在 Excel 中生成 1000 个两位数唯一字母数字代码

excel - 如何循环直到特定的命名范围?

sql-server - SQL Compact Edition 的类似 Access 的编辑器

python - Access 中的复杂文本解析

c# - 将数据发送到 Access 数据库时出错