You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

工作表中ActiveX控件对象传递至Sub/Function的问题排查

问题根源与解决方案

核心错误原因

工作表中的ActiveX TextBox控件,直接使用TBStartDate时,VBA会自动返回它的默认属性Value(即文本框内的字符串/数值),而非控件对象本身。同时你的接收过程DatePickinCtl参数定义为Control类型,但ActiveX TextBox不属于Control类(Control对应表单控件,ActiveX控件属于OLEObject下的对象),双重原因导致类型不匹配错误。


正确实现方式

方式1:传递OLEObject对象,调整接收参数类型

修改调用代码,明确获取控件的OLEObject实例:

Private Sub CBDate1_Click()
    Dim InputCtl As OLEObject
    ' 明确通过工作表OLEObjects集合获取控件对象,替换Sheet1为你的工作表名称
    Set InputCtl = Sheet1.OLEObjects("TBStartDate")
    SF_DatePick.DatePickinCtl InputCtl
End Sub

然后修改接收过程的参数类型为OLEObject,并通过Object属性访问TextBox的具体属性:

Public Sub DatePickinCtl(InputCtl As OLEObject, _
                         Optional FormatTxT As String = "Short Date", _
                         Optional Language As String = "", _
                         Optional HolidayLocation As String = "", _
                         Optional ThreeMonthFlag As Boolean = False)
    Dim TVar As Variant, DOut As Variant
    ' 通过OLEObject的Object属性访问TextBox控件
    TVar = InputCtl.Object.Value
    ' 示例:操作其他属性
    InputCtl.Object.Enabled = False
    InputCtl.Top = 100 ' 调整位置(OLEObject的位置属性)
End Sub

方式2:直接传递TextBox控件对象

如果要直接传递TextBox实例,需确保赋值时用Set,且接收参数定义为Object或MSForms.TextBox(需引用Microsoft Forms 2.0 Object Library):

Private Sub CBDate1_Click()
    Dim InputCtl As Object
    ' 用Set明确赋值控件对象
    Set InputCtl = Sheet1.TBStartDate.Object
    SF_DatePick.DatePickinCtl InputCtl
End Sub

接收过程修改参数类型:

Public Sub DatePickinCtl(InputCtl As Object, _
                         Optional FormatTxT As String = "Short Date", _
                         Optional Language As String = "", _
                         Optional HolidayLocation As String = "", _
                         Optional ThreeMonthFlag As Boolean = False)
    Dim TVar As Variant, DOut As Variant
    TVar = InputCtl.Value
    ' 直接操作TextBox属性
    InputCtl.Enabled = False
    InputCtl.Top = 100
End Sub

关键注意点

  • 避免直接使用控件名称(如TBStartDate)传递,必须通过Set语句赋值对象,或通过OLEObjects集合获取实例。
  • 区分表单控件(Control类型)和ActiveX控件(OLEObject下的MSForms.TextBox类型),两者类型不兼容。

内容的提问来源于stack exchange,提问作者Hareborn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 16:15:24