VBA-在动态创建的文本框中捕获事件

罗伯特

我正在用Excel编写VBA应用程序。我有一个用户窗体,该窗体根据其中一个工作表中包含的数据动态地自行构建。创建各种组合框,文本框和标签的所有代码都在工作。我创建了一个类模块来捕获Combobox的OnChange事件,并且再次按预期工作。现在,我需要为某些文本框捕获OnChange事件,因此我在此模型上创建了一个新的类模块,以供组合框捕获事件。

Public WithEvents tbx As MSForms.TextBox

Sub SetTextBox(ctl As MSForms.TextBox)
Set tbx = ctl
End Sub

Public Sub tbx_Change()
Dim LblName As String

MsgBox "You clicked on " & tbx.Name, vbOKOnly

End Sub

该消息框只是为了让我可以在继续之前确认它是否起作用。我遇到的问题在UserForm代码模块中:

Dim TBox As TextBox
Dim tbx As c_TextBoxes

'[...]

Set TBox = lbl
Set tbx = New c_TextBoxes
tbx.SetTextBox lbl
pTextBoxes.Add tbx

这会引发的类型不匹配错误Set TBox=lbl这是完全相同的代码,对于ComboBox可以很好地工作,只是给变量指定了适当的名称。我盯着这个看了两个小时。任何人有任何想法吗?感谢您的指导。

编辑-这是我遇到的完整用户窗体模块:

Private Sub AddLines(FrameName As String, PageName As String)
Dim Counter As Integer, Column As Integer
Dim obj As Object
Dim CBox As ComboBox
Dim cbx As c_ComboBox
Dim TBox As TextBox
Dim tbx As c_TextBoxes
Dim lbl As Control

Set obj = Me.MultiPage1.Pages(PageName).Controls(FrameName)
If pComboBoxes Is Nothing Then Set pComboBoxes = New Collection
If pTextBoxes Is Nothing Then Set pTextBoxes = New Collection

For Counter = LBound(Vehicles) To UBound(Vehicles)
     For Column = 1 To 8
     Select Case Column
     Case 1
         Set lbl = obj.Add("Forms.Label.1", "LblMachine" & FrameName & Counter, True)
    Case 2
        Set lbl = obj.Add("Forms.Label.1", "LblFleetNo" & FrameName & Counter, True)
    Case 3
        Set lbl = obj.Add("Forms.Label.1", "LblRate" & FrameName & Counter, True)
    Case 4
        Set lbl = obj.Add("Forms.Label.1", "LblUnit" & FrameName & Counter, True)
    Case 5
        Set lbl = obj.Add("Forms.ComboBox.1", "CBDriver" & FrameName & Counter, True)
    Case 6
        Set lbl = obj.Add("Forms.Label.1", "LblDriverRate" & FrameName & Counter, True)
    Case 7
        Set lbltbx = obj.Add("Forms.TextBox.1", "TBBookHours" & FrameName & Counter, True)
    Case 8
        Set lbl = obj.Add("Forms.Label.1", "LblCost" & FrameName & Counter, True)
    End Select
    With lbl
        Select Case Column
        Case 1
            .Left = 1
            .Width = 60
            .Top = 10 + (Counter) * 20
            .Caption = Vehicles(Counter).VType
        Case 2
            .Left = 65
            .Width = 40
            .Top = 10 + (Counter) * 20
            .Caption = Vehicles(Counter).VFleetNo
        Case 3
            .Left = 119
            .Width = 50
            .Top = 10 + (Counter) * 20
            .Caption = Vehicles(Counter).VRate
        Case 4
            .Left = 163
            .Width = 30
            .Top = 10 + (Counter) * 20
            .Caption = Vehicles(Counter).VUnit
        Case 5
            .Left = 197
            .Width = 130
            .Top = 10 + (Counter) * 20
            Set CBox = lbl 'WORKS OK
            Call CBDriver_Fill(Counter, CBox)
            Set cbx = New c_ComboBox
            cbx.SetCombobox CBox
            pComboBoxes.Add cbx
        Case 6
            .Left = 331
            .Width = 30
            .Top = 10 + (Counter) * 20
        Case 7
            .Left = 365
            .Width = 30
            .Top = 10 + (Counter) * 20
            Set TBox = lbl 'Results in Type Mismatch
            Set tbx = New c_TextBoxes
            tbx.SetTextBox TBox
            pTextBoxes.Add tbx
        Case 8
            .Left = 400
            .Width = 30
            .Top = 10 + (Counter) * 20
        End Select
    End With
    Next
Next
obj.ScrollHeight = (Counter * 20) + 20
obj.ScrollBars = 2

End Sub

这是c_Combobox类模块:

Public WithEvents cbx As MSForms.ComboBox

Sub SetCombobox(ctl As MSForms.ComboBox)
    Set cbx = ctl
End Sub

Public Sub cbx_Change()
Dim LblName As String
Dim LblDriverRate As Control
Dim i As Integer


    'MsgBox "You clicked on " & cbx.Name, vbOKOnly
    LblName = "LblDriverRate" & Right(cbx.Name, Len(cbx.Name) - 8)
    'MsgBox "This is " & LblName, vbOKOnly

    'Set obj = Me.MultiPage1.Pages(PageName).Controls(FrameName)
    Set LblDriverRate = UFBookMachines.Controls(LblName)
    For i = LBound(Drivers) To UBound(Drivers)
        If Drivers(i).Name = cbx.Value Then LblDriverRate.Caption = Drivers(i).Rate
    Next
End Sub

最后,这是c_TextBoxes类模块:

Public WithEvents tbx As MSForms.TextBox

Sub SetTextBox(ctl As MSForms.TextBox)
    Set tbx = ctl
End Sub

Public Sub tbx_Change()
Dim LblName As String
    'Does nothing useful yet, message box for testing
    MsgBox "You clicked on " & tbx.Name, vbOKOnly

End Sub
拜伦·沃尔

经过一些快速测试,如果声明,我可以重现您的错误TBox as TextBox如果声明,我不会出错TBox as MSForms.TextBox我建议TextBox使用MSForms限定符声明所有变量

测试代码与您的代码相似。我有MultiPage一个Frame在那里我增加了Control

Private Sub CommandButton1_Click()

    Dim obj As Object
    Set obj = Me.MultiPage1.Pages(0).Controls("Frame1")

    Dim lbl As Control
    Set lbl = obj.Add("Forms.TextBox.1", "txt", True)

    If TypeOf lbl Is TextBox Then
        Debug.Print "textbox found1" 'does not execute
    End If

    If TypeOf lbl Is MSForms.TextBox Then
        Debug.Print "textbox found2"

        Dim txt1 As MSForms.TextBox
        Set txt1 = lbl 'no error
    End If

    If TypeOf lbl Is MSForms.TextBox Then
        Debug.Print "textbox found3"

        Dim txt As TextBox
        Set txt = lbl 'throws an error
    End If

End Sub

我不确定为什么需要限定词TextBox而不是ComboBox如您在上面看到的,对此的一个很好的测试是If TypeOf ... Is ... Then测试哪些对象是哪些类型。我包括了第一个方块以表明它lbl不是“裸露” TextBox,但是同样,我也不知道为什么会这样。也许还有另一种类型TextBox可以覆盖默认声明?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Excel VBA在文本框中创建公式

来自分类Dev

从文本框中填充VBA数组

来自分类Dev

在VBA中填充文本框

来自分类Dev

如何在Access中为VBA中的顺序命名文本框动态分配变量

来自分类Dev

检查某些文本框是否为空,然后在VBA中运行事件

来自分类Dev

VBA文本框列

来自分类Dev

从activeX文本框中获取文本(VBA,PowerPoint)

来自分类Dev

VBA 如果文本在文本框中,则执行某些操作

来自分类Dev

如何在VBA中获得对文本框控件的引用而不是文本框的值

来自分类Dev

在VBA中添加具有多个属性的文本框

来自分类Dev

文本框VBA中的固定宽度列

来自分类Dev

在图VBA Excel中的节点下方添加文本框

来自分类Dev

仅从数字中阻止文本框VBA

来自分类Dev

无法通过VBA填充Internet Explorer中的文本框

来自分类Dev

Excel VBA验证文本框中的特定格式

来自分类Dev

VBA在文本框中更改日期格式

来自分类Dev

VBA文本框更改触发宏

来自分类Dev

文本框限制错误Excel VBA

来自分类Dev

VBA查找并替换单词文本框

来自分类Dev

VBA Excel-文本框验证

来自分类Dev

VBA文本框到数字值

来自分类Dev

文本框日期格式Excel VBA

来自分类Dev

MS ACCESS VBA:Me.Dirty = False OnTimer事件还原编辑的文本框数据

来自分类Dev

vba-MSAccess在多个文本框事件上执行相同的操作

来自分类Dev

输入事件后将光标移动到另一个文本框-VBA

来自分类Dev

输入事件后将光标移动到另一个文本框-VBA

来自分类Dev

使用excel vba为动态构建的文本框名称分配值

来自分类Dev

Excel VBA:根据文本框中设置的值在列表框中搜索值

来自分类Dev

Excel VBA:根据文本框中设置的值在列表框中搜索值

Related 相关文章

热门标签

归档