如何从 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
集合中找到它,并且当它的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
组件,它已经被引用,在这种情况下,早期绑定代码是不费吹灰之力的) .
【讨论】:
精彩的解释! @DavidZemens 谢谢!只是一个巧合,不迟于昨晚我正在努力让 Rubberduck 了解表单和 ActiveX 文档控件,这样我们就可以终于停止出现声称“程序 'Button1_Click' 的烦人的误报检查结果”从未使用过”。 Mat's Mug,效果很好,非常感谢您的大力帮助。以上是关于如何从 VBA Access 中勾选 Excel 复选框的主要内容,如果未能解决你的问题,请参考以下文章
从 Excel VBA 运行嵌套的 Access SQL 查询
如何使用sql语句和vba将数据从MS-Access导入excel power查询?
从 Access 2010 VBA 打开 Excel 2010 文件