Ms access Access 2016 VBA文本框为空

Ms access Access 2016 VBA文本框为空,ms-access,vba,ms-access-2016,Ms Access,Vba,Ms Access 2016,我很久没有使用VBA了……我在Access 2016中有这个表单 当我试图通过Me.Controls集合访问各种文本框并将其转换为文本框对象时,我得到一个空引用,但它的一些属性是有效的(例如tb.Name) 要获取类型,请像下面这样使用TypeName: If TypeName(ctrl) = "TextBox" Then Private WithEvents f_EH As Access.Form Private WithEvents f_TB As Access.TextBox Pub

我很久没有使用VBA了……我在Access 2016中有这个表单

当我试图通过Me.Controls集合访问各种文本框并将其转换为文本框对象时,我得到一个空引用,但它的一些属性是有效的(例如tb.Name)


要获取类型,请像下面这样使用
TypeName

If TypeName(ctrl) = "TextBox" Then
Private WithEvents f_EH As Access.Form
Private WithEvents f_TB As Access.TextBox

Public Property Set EventsHandler(frm As Access.Form)
  Set f_EH = frm
End Property

Public Property Set InnerTextBox(ctl As Access.TextBox)
   Set f_TB = ctl
End Property
要确保
tb
采用
Textbox
对象的形式,请使用

Set tb = Controls(ctrl.Name)

您尚未显示正在使用的类,但假设它看起来像这样:

If TypeName(ctrl) = "TextBox" Then
Private WithEvents f_EH As Access.Form
Private WithEvents f_TB As Access.TextBox

Public Property Set EventsHandler(frm As Access.Form)
  Set f_EH = frm
End Property

Public Property Set InnerTextBox(ctl As Access.TextBox)
   Set f_TB = ctl
End Property
如果我使用具有这种结构的类,那么您文章中的代码可以正常工作。但是请注意,我已经将
InnerTextBox
属性的预期类型显式设置为
Access.TextBox

但是您的代码不需要强制转换,使用匈牙利命名(恶心!),并且依赖于名称的前4个字符“Txt_”,可以写成:

  Dim ctrl As Control
  Dim evTb As clsEventTextBox

  Set m_TbColl = New Collection

  For Each ctrl In Me.Controls
    If TypeOf ctrl Is Access.TextBox Then
      'Create the TextBox wrapper
      Set evTb = New clsEventTextBox
      Set evTb.EventsHandler = Me

      Set evTb.InnerTextBox = ctrl  'Just pass the ctrl reference without casting

      m_TbColl.Add evTb, ctrl.Name
    End If
  Next

注意在
中使用
TypeOf
如果TypeOf ctrl是Access.TextBox,那么
要确定控件是否是
TextBox

谢谢,我的错误是忘记了InnerTextBox Set属性中的“Set”:(小OT:我发布了另一个问题,你知道为什么会发生这种情况吗?