vba中有啥类型的电子表格复选框?

Posted

技术标签:

【中文标题】vba中有啥类型的电子表格复选框?【英文标题】:What type has a spreadsheet checkbox in vba?vba中有什么类型的电子表格复选框? 【发布时间】:2018-02-03 15:28:42 【问题描述】:

我有以下代码,它应该为旁边的列表对象中的每一行添加一个复选框。我想开发一个审批工具,它从数据库中加载数据并将其加载到列表对象中。之后,我可以使用复选框批准或不批准数据并保存更改。由于列表对象的长度会发生变化,因此需要通过代码添加和删除复选框。

这里是代码:

Sub Approval()
Dim i As Integer
Dim tbl As ListObject
Dim CBcollection As Collection
Dim CB As msforms.CheckBox ' THIS IS WRONG
Dim sht As Worksheet
Dim L As Double, T As Double, H As Double, W As Double
Dim rng As Range

Set sht = Tabelle1
Set tbl = sht.ListObjects("ApprovalTBL")
Set rng = tbl.Range(2, 1).Offset(0, -1)
      W = 10
      H = 10
      L = rng.Left + rng.Width / 2 - W / 2
      T = rng.Top + rng.Height / 2 - H / 2

For i = 1 To tbl.ListRows.Count
      Set CB = sht.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, DisplayAsIcon:=False, Left:=L, Top:=T, Width:=W, Height:=H) 
'the line before will give me an error 13 type missmatch
      CBcollection.Add (CB)
      Set rng = rng.Offset(-1, 0)
      T = rng.Top + rng.Height / 2 - H / 2
Next i

End Sub

现在的问题:

普通电子表格中有什么类型的复选框?

我总是使用“Option Explicit”,我总是将变量调暗为正确的类型,我不想使用变体类型。

【问题讨论】:

表单控件还是 ActiveX 控件? 【参考方案1】:

表单控件复选框将是 Shape,但这不是您在这里所拥有的。

在工作表上添加 ActiveX 复选框会添加对 MSForms 类型库的引用(就像在 VBA 项目中添加 UserForm 一样)。

复选框确实是一个MSForms.Checkbox 实例,但要存在于工作表上,它嵌入OLEObject 中,该类型存在于Excel 类型库中。

所以要获得MSForms.Checkbox,您需要检索OLEObject.Object 参考:

Dim ctrl As Excel.OLEObject
Set ctrl = sht.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, DisplayAsIcon:=False, Left:=L, Top:=T, Width:=W, Height:=H) 

Dim chkBox As MSForms.CheckBox
Set chkBox = ctrl.Object

【讨论】:

您的解决方案有效,但在尝试将 CheckBox 添加到我的集合时,我又遇到了另一个问题 ::error 91 对象或变量未定义。知道那里可能有什么问题吗? @LucasRaphaelPianegonda 看着你的CBcollection.Add 调用,你在对象引用周围有多余的括号,这对VBA来说意味着“将这个表达式作为一个值来评估,并传递结果ByVal" - 在处理对象引用时这不是一个好主意(将其评估为一个值不太可能结束)。删除多余的括号,您将解决问题。【参考方案2】:

这只是Checkbox - 你不需要用任何东西来限定它。

如果它在您的电子表格中,那可能是一个 ActiveX 复选框,定义为 Object

【讨论】:

这不是...嵌入式控件是OLEObject,而Checkbox 定义在MSForms类型库中,无论是否合格。【参考方案3】:

OLEObjects.Add 返回OLEObject,所以像这样声明你的变量:

Dim CB As OLEObject

【讨论】:

如果我使用 OLEObject,它不会给我错误 13 类型不匹配但给我错误 438:对象不支持属性或方法..知道如何解决这个问题吗? @LucasRaphaelPianegonda 看到我的答案 啊,打败我!

以上是关于vba中有啥类型的电子表格复选框?的主要内容,如果未能解决你的问题,请参考以下文章

VBA:保存电子表格

使用 VBA 插入一行并自动填充

将图像嵌入到 Excel 电子表格 - VBA

Excel中的VBA创建带有表格和签名的电子邮件

VBA Excel - 从 MS Access 将列名保存到电子表格

访问 VBA 以表格格式将查询结果发送到 Outlook 电子邮件