Excel UserForm 动态 TextBox 控件退出事件

2024-05-06

UPDATE:经过对对象浏览器的进一步研究......看来MSForms.TextBox既没有实现.Name财产或_Exit事件 - 仅_Change事件。有没有办法确定具体是哪个TextBox生成更改事件?

或者可以使用MSForms.Control用这种技术?这Control对象实现了.Name财产和_Exit event.


您可以侦听 TextBox 退出事件吗?类似于普通的 TextBox 事件如何工作?例如。

  Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        'Update a certain label based on the value of the TextBox
  End Sub

以下没有捕获退出事件。此外,虽然我可以在本地窗口中看到为 MyTextBox 生成事件的 TextBox 的 .Name 属性,但我无法访问该信息来确定要操作的标签。

此类技术改编自这个帖子 https://stackoverflow.com/a/5942200/2084052, and 这个帖子 https://stackoverflow.com/q/47684598/2084052,捕获了更改事件。

类 clsTextBox:

Private WithEvents MyTextBox As MSForms.TextBox

Public Property Set Control(tb As MSForms.TextBox)
    Set MyTextBox = tb
End Property

' Want to handle this event, but it's not caught when exiting the TextBox control
Private Sub MyTextBox_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    'Debug.Print me.Control.name
    'Update a certain label based on the value of the TextBox
    Stop
End Sub

' Catching this event but can't identify the control which triggered it
Private Sub MyTextBox_Change()
    Debug.Print MyTextBox.Value ' <--- This prints the correct value
    Debug.Print Me.Control.Name ' <--- ERROR here on any variation of Me or MyTextBox
    'Update a certain label based on the value of the TextBox
    Stop
End Sub

我有一系列动态创建的控件需要侦听器。代码如下:

  Option Explicit
  Dim tbCollection As Collection

  Private Sub UserForm_Initialize()
        Dim ctrl As MSForms.Control
        Dim obj As clsTextBox
        Dim acftNumber As Long
        Dim mPage As MSForms.MultiPage ' Control
        Dim lbl_acftName As MSForms.Label
        Dim lbl_currentHrs As MSForms.Label
        Dim lbl_hrsDUE As MSForms.Label
        Dim lbl_dateXFRIn As MSForms.Label
        Dim lbl_dateXFROut As MSForms.Label
        Dim lbl_hrsOnXFROut As MSForms.Label
        Dim txb_currentHrs As MSForms.TextBox
        Dim txb_hrsDUE As MSForms.TextBox
        Dim txb_dateXFRIn As MSForms.TextBox
        Dim txb_dateXFROut As MSForms.TextBox
        Dim txb_hrsOnXFROut As MSForms.TextBox
        Dim i As Double
        Dim pgName As String
        Dim acftName As String

        ' Correct for border size calculations bug in Excel 2016
        Me.Height = 249.75
        Me.Width = 350.25

        acftNumber = Range("aircraft").Count 'Unknown value from 3 to 10

        Set mPage = Me.multipage_file_week 'set Multipage variable

        For i = 1 To acftNumber
              'set name/title for new page
              pgName = "pg_acft_" & i
              acftName = Range("aircraft").Cells(i, 1).Value

              'mPage.Pages.Add pgName, pgTitle

              With mPage 'add acft tab
                    ' add the aircraft page to the multipage
                    .Pages.Add pgName, acftName

                    ' Aircraft Name Label
                    Set lbl_acftName = .Pages(i).Controls.Add("Forms.Label.1", "lbl_acftName_" & i, True)
                    With lbl_acftName
                          .Caption = acftName
                          .Font = "Arial"
                          .Font.Size = 12
                          .Font.Bold = True
                          .Left = 10
                          .Width = 55
                          .Top = 0
                    End With

                    ' Current Hours Label and TextBox
                    Set lbl_currentHrs = .Pages(i).Controls.Add("Forms.Label.1", "lbl_currentHrs_" & i, True)
                    With lbl_currentHrs
                          .Caption = "Current Asset Hours:"
                          .TextAlign = fmTextAlignRight
                          .Font = "Arial"
                          .Font.Size = 10
                          .Font.Bold = False
                          .Left = 20
                          .Width = 120
                          .Top = 25
                    End With
                    Set txb_currentHrs = .Pages(i).Controls.Add("Forms.TextBox.1", "txb_currentHrs_" & i, True)
                    With txb_currentHrs
                          .Value = "16004.5"
                          .Text = "16004.5"
                          .Font = "Arial"
                          .Font.Size = 10
                          .Font.Bold = False
                          .Left = 150
                          .Width = 70
                          .Top = 25
                    End With


                    ' Hours DUE Label and TextBox
                    Set lbl_hrsDUE = .Pages(i).Controls.Add("Forms.Label.1", "lbl_hrsDUE_" & i, True)
                    With lbl_hrsDUE
                          .Caption = "Hours next HMC DUE:"
                          .TextAlign = fmTextAlignRight
                          .Font = "Arial"
                          .Font.Size = 10
                          .Font.Bold = False
                          .Left = 20
                          .Width = 120
                          .Top = 50
                    End With
                    Set txb_hrsDUE = .Pages(i).Controls.Add("Forms.TextBox.1", "txb_hrsDUE_" & i, True)
                    With txb_hrsDUE
                          .Value = "16004.5"
                          .Text = "16004.5"
                          .Font = "Arial"
                          .Font.Size = 10
                          .Font.Bold = False
                          .Left = 150
                          .Width = 70
                          .Top = 50
                    End With

                    ' Date XFR In Label and TextBox
                    Set lbl_dateXFRIn = .Pages(i).Controls.Add("Forms.Label.1", "lbl_dateXFRIn_" & i, True)
                    With lbl_dateXFRIn
                          .Caption = "Estimated arrival date:"
                          .TextAlign = fmTextAlignRight
                          .Font = "Arial"
                          .Font.Size = 10
                          .Font.Bold = False
                          .Left = 20
                          .Width = 120
                          .Top = 75
                    End With

                    Set txb_dateXFRIn = .Pages(i).Controls.Add("Forms.TextBox.1", "txb_hrsDUE_" & i, True)
                    With txb_dateXFRIn
                          .Value = "4/16/2019"
                          .Text = "4/16/2019"
                          .Font = "Arial"
                          .Font.Size = 10
                          .Font.Bold = False
                          .Left = 150
                          .Width = 70
                          .Top = 75
                    End With


                    ' Date XFR Out Label and TextBox
                    Set lbl_dateXFROut = .Pages(i).Controls.Add("Forms.Label.1", "lbl_dateXFROut_" & i, True)
                    With lbl_dateXFROut
                          .Caption = "Estimated departure date:"
                          .TextAlign = fmTextAlignRight
                          .Font = "Arial"
                          .Font.Size = 10
                          .Font.Bold = False
                          .Left = 20
                          .Width = 120
                          .Top = 100
                    End With
                    Set txb_dateXFROut = .Pages(i).Controls.Add("Forms.TextBox.1", "txb_hrsDUE_" & i, True)
                    With txb_dateXFROut
                          .Value = "4/16/2019"
                          .Text = "4/16/2019"
                          .Font = "Arial"
                          .Font.Size = 10
                          .Font.Bold = False
                          .Left = 150
                          .Width = 70
                          .Top = 100
                    End With

                    ' Hours on XFR Out Label and TextBox
                    Set lbl_hrsOnXFROut = .Pages(i).Controls.Add("Forms.Label.1", "lbl_hrsOnXFROut_" & i, True)
                    With lbl_hrsOnXFROut
                          .Caption = "Desired hours remaining on departure:"
                          .TextAlign = fmTextAlignLeft
                          .Font = "Arial"
                          .Font.Size = 10
                          .Font.Bold = False
                          .Left = 20
                          .Width = 170
                          .Top = 125
                    End With
                    Set txb_hrsOnXFROut = .Pages(i).Controls.Add("Forms.TextBox.1", "txb_hrsDUE_" & i, True)
                    With txb_hrsOnXFROut
                          .Value = "35"
                          .Text = "35"
                          .Font = "Arial"
                          .Font.Size = 10
                          .Font.Bold = False
                          .Left = 200
                          .Width = 35
                          .Top = 125
                    End With
              End With

              'Debug
              Debug.Print Me.multipage_file_week.Pages(i).Name & ":"
              For Each ctrl In Me.multipage_file_week.Pages(i).Controls
                    Debug.Print "  - " & ctrl.Name
              Next ctrl

        Next i
        mPage.Value = 0
        Me.Caption = FILE_WEEK_FORM_TITLE

        Set tbCollection = New Collection
        For Each ctrl In Me.Controls
              If TypeOf ctrl Is MSForms.TextBox Then
                    Set obj = New clsTextBox
                    Set obj.Control = ctrl
                    tbCollection.Add obj
              End If
        Next ctrl
        Set obj = Nothing
  End Sub

MSForms.Control定义了Enter and Exitevents:如果你需要处理TextBox.Change,那么你需要两个WithEvents变量:

Private WithEvents TextBoxEvents As MSForms.TextBox
Private WithEvents ControlEvents As MSForms.Control

Public Property Set Control(ByVal tb As Object)
    Set TextBoxEvents = tb
    Set ControlEvents = tb
End Property

MSForms.Control也是您可以访问属性的接口,例如Name, Top, Left, Visible, etc.

提示:切勿手动键入事件处理程序过程签名。从代码窗格左上角的下拉列表中选择源接口,然后从右上角的下拉列表中选择要处理的事件;让VBE生成具有正确签名的成员。如果您处于处理程序过程中并且左上角的下拉列表显示“(常规)”,则您不在事件处理程序中。


EDIT

虽然上面的代码编译得很好并且MSForms.Control界面does公开我们要处理的事件...

?TypeOf tb Is MSForms.Control
True
?TypeOf tb Is MSForms.TextBox
True

...幕后有一些 COM 黑客活动;有足够的烟雾和镜子让 VBA 成功编译上述内容,但是,基本上,您正在看到 The Matrix 中的一个小故障(Rubberduck 的解析器与 MSForms 控件有类似的“不”问题):没有任何明显的方法可以获取VBA将动态控制对象绑定到其MSForms.Control events.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Excel UserForm 动态 TextBox 控件退出事件 的相关文章

  • 从 Excel 数据为列中的每个不同值创建 CSV 文件?

    我有一个 Excel 其供应商代码 数字 作为其中一列 VENDORITEM DESCRIPTION PRICE PRICEGROUP VENDOR NUMBER PRODUCT CATEGORY HNM36789 30ML FLUID C
  • 从原始数据创建 n 个新行,例如 (1000....1000+n)

    我需要从 Excel 工作簿中读取数据 其中数据以这种方式存储 Company Accounts Company1 3000 3999 Company2 4000 4019 4021 4024 在 SSIS 中使用 OLE DB 目标的预期
  • VBA 按用户范围选择排序

    在过去的三天里我一直在为这个问题苦苦挣扎 所以请帮忙 我想做的是当我运行 Macro1 时 为了论证 将弹出窗口以选择应排序的单元格范围 通过选择的最后一列 或第五列 对这些进行排序 从最低数字到最高数字 这里的问题是所选区域每次都会改变
  • ReDim 保留“下标超出范围”

    我正在尝试将数据从 2 个双精度数组移动到 2 个不同的双精度数组 我不确定大小是多少 因为我正在从第一个数组中随机抽取样本并将其放入第二个数组中 当我添加 ReDim Preserve 行时 出现下标超出范围错误 Function Cre
  • SQL查询从表的每条记录生成多条记录

    我有一个包含 3000 条记录的表 使用其中的每一条记录 我必须生成大约 200 条记录 总共 600k 条记录 并通过 SQL Server 2012 将它们插入到第二个表中 我尝试使用 VBA 执行此操作 从第一个表中选择数据 计算 然
  • Excel VBA - 以编程方式列出用户窗体上控件的可用事件过程

    你好 我已经搜索过 google 但发现只有 1 页提到了如何在 MS Access 中执行此操作 但没有在 MS Excel 中执行此操作 此处 列出 MS Access 表单的控件及其事件 https stackoverflow com
  • 在 Nodejs/javascript 中的 Excel 中创建动态数量的列或标题

    我用过exceljsNodejs中用于将json数据导出到excel的模块 它工作正常 但必须在添加行之前预定义标题 列的名称 即列是固定的 添加行后 我无法动态添加列 我尝试了许多通过 npm 提供的模块 但它们都具有相同的功能 那么 有
  • 我需要使用 VBA 将数据从 Excel 插入 SQL Server

    我需要插入test vba xlsx将数据写入 SQL Server 到特定数据库 Sub insertion Dim conn As ADODB Connection Dim rs As ADODB Recordset Dim sConn
  • ReactJs 中输出事件的 Angular

    我正在寻找在 ReactJs 中创建类似 Angular 等输出事件的方法 我正在根据 Atomic 设计在 ReactJs 中制作一个组件库 因此 例如 我在其他组件中注入了一个 Button 我想知道如何为 Button 编写一个 pr
  • vba Excel 中的多个查找请求(在查找中查找)

    我正在尝试执行一种嵌套查找请求 用例是我需要在一个工作表上查找组 如果找到 则从找到的行中的单独列中获取用户 ID 值 然后在另一张纸 然后它应该执行一系列操作 然后在第一张表中找到下一个出现的组 我的代码是 LookupGroup Spl
  • 如何从Excel调用VBA函数

    我有一个 excel 文件 我必须在其中放置验证规则 我有一个单元格表示 客户时间 用户可以在其中输入时间 但它是自定义时间 用户可以这样输入时间 23 45 98 20 100 30 用户不能输入字符串 并且不能输入除冒号之外的特殊字符
  • 使用Excel宏执行命令并关闭cmd窗口

    这是我现在正在尝试的 Sub del BJSFM files Call Shell cmd exe S K cd d C UTAS SA del f s q BJSFM gt nul vbNormalFocus End Sub 问题是命令窗
  • 雅虎财经历史股价动力查询返回301响应

    直到今天我的 Excel 2016 power query 都能够从以下 URL 获取历史股票定价数据https finance yahoo com quote AAL history p AAL https finance yahoo c
  • 使用VBA删除Excel中的非重复数据

    我尝试删除非重复数据并保留重复数据 我已经完成了一些编码 但什么也没发生 哦 这是错误 哈哈 这是我的代码 Sub mukjizat2 Dim desc As String Dim sapnbr As Variant Dim shortDe
  • 将单元格背景颜色设置为其包含的 RGB 值。如何?

    下面是我希望通过手动复制和粘贴以外的方式实现的屏幕截图 这是材料设计调色板 在 Excel 中看起来很棒 如何循环遍历范围 B2 B15 并将每个单元格背景颜色设置为其相应的包含颜色 也许是一个VBA loop去经历垂直 B 单元格范围 解
  • 将 PDFMaker 与 MS Outlook 结合使用

    我想将 Adob e PDFMaker 插件与 MS Outlook 2013 一起使用 使用 PDFMAKER 将多封电子邮件保存为 pdf https stackoverflow com questions 44723984 savin
  • 通过 VBA MS_Access 将 MS Access 表导出为 dBase 5

    如何通过 VBA 将单个表导出为 dBase 5 文件 目前我正在使用这个VBA代码 DoCmd TransferDatabase acExport dBase IV DB Total acTable DB Total C Data Fal
  • 使用 SpreadsheetLight 进行行计数

    我正在寻找一个类似于 DataTable Rows Count 的函数 它可以与 SLDocument 一起使用来找出有多少行中有数据 SpreadsheetLight 中有可用的东西吗 还有其他方法可以实现这一目标吗 Brendan SL
  • Excel的解析路径

    其实我想问以下问题 对于位于 目录中定义的 PATH 怎么能 我找出这些目录中的哪个 找到了 因为我需要使用 Process Run 从 C 运行 Excel 并且只需指示 Excel 即可正常工作 Windows 似乎知道在哪里可以找到它
  • 连续工作表切换循环

    我有一个 Excel 电子表格来显示 SQL 数据图表 这些图表将显示在我们机加工车间的显示器上 该电子表格有 45 个选项卡 我需要在选项卡之间切换 每个选项卡间隔 10 秒 然后返回到第一个选项卡并重复循环 I found 如何使用 V

随机推荐