- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
更新:在对象浏览器中的进一步研究...看来 MSForms.TextBox
既没有实现 .Name
属性也没有实现_Exit
事件 - 只有 _Change
事件。有没有办法确定哪个特定的 TextBox
生成了更改事件?
或者,是否可以通过这种技术使用 MSForms.Control
? Control
对象实现了 .Name
属性和 _Exit
事件。
你能监听 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 属性,但我无法访问该信息来确定要作用于哪个标签。
此类技术改编自 this post , 和 this post , 它捕获了变化事件。
类 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
和 Exit
事件:如果您需要处理 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
等属性的界面>、可见
等
提示:切勿手动键入事件处理程序过程签名。从代码 Pane 左上角的下拉列表中选择源接口(interface),然后从右上角的下拉列表中选择要处理的事件;让 VBE 生成具有正确签名的成员。如果您在处理程序中并且左上角的下拉菜单显示“(一般)”,则您不在事件处理程序中。
虽然上面的代码可以正常编译并且 MSForms.Control
接口(interface)确实公开了我们要处理的事件...
?TypeOf tb Is MSForms.Control
True
?TypeOf tb Is MSForms.TextBox
True
...在幕后进行了一些 COM 黑客攻击;有足够的烟雾和镜子让 VBA 成功编译上面的内容,但是,基本上,你正在寻找 Matrix 中的一个小故障(Rubberduck 的解析器与 MSForms 控件有类似的“不”问题):没有任何明显的方法来获得VBA 将动态控件对象绑定(bind)到它的 MSForms.Control
事件。
关于Excel UserForm 动态 TextBox 控件退出事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55737979/
我长期以来一直使用这个网站来寻找我的问题的答案,但我找不到关于这个问题的任何信息。如果我错过了什么,请提前道歉。 所以我有一个工作簿(Office 2013,VBA 7.1),我试图将用户窗体用作菜单
我有一个柜台NumObjects我在 UserForm1 中声明,其中包含添加到 Userform 的标签数量。 单击命令按钮添加水平表时,程序会调用类模块中的子程序来为用户窗体添加标签。 添加的第一
我创建了一个用户表单(更改事件工作表或所有工作表的列和行宽度),它具有三个框架。 在第一帧中,我给出了两个选项框。 Firsts 选项框: - 从 B 列开始更改行和列宽度,其他选项框从 C 列开始更
我有一个使用 VBA 在 Excel 2010 中创建的用户窗体。基于来自特定工作表的数据以编程方式将控件添加到表单中。我的代码添加了所有控件,然后确定表单是否过长。如果是,则表单将设置为最大高度 5
我从其他人那里接管了一个用户表单(这个表单是由 Excel VBA 制作的)。我注意到那个人创建了两个文本框,一个是白色的,另一个是黑色的。但是我想将所有文本框的背景设为白色,但我不知道如何更改文本框
我知道并理解将项目添加到 ListBox 的常用方法使用逻辑测试: If a = 1 Then ListBox1.AddItem x End If 但是,我想知道是否有可能 .AddItem直
我正在尝试通过 Sub 使用参数在 excel-VBA 中创建相同无模式用户窗体的多个实例。 我可以使用我要分配的三个参数中的两个使其工作,但第三个参数不断返回我 "Run-time Error '9
我希望这不是那么愚蠢,但我真的没有找到适合我的帖子。 情况:我希望有人将日期放入用户窗体中的文本框中。 错误处理程序:如果用户没有输入正确的格式,我想有一个非常简单的解决方案。 (EB_Start.A
我在运行我创建的用户窗体时遇到问题。我的用户窗体中有 5 个标签,但是当我运行用户窗体以获取 excel 电子表格的输入时,我的标签不显示,只有日期、数字等我已放入文本框和组合框。 Deso有人知道这
我有一个带有文本框的用户窗体,这些文本框已经通过 ControlSource 属性绑定(bind)到某些工作表单元格。我需要在其中两个绑定(bind)值之间运行计算,并将结果放在第三个工作表单元格中。
我正在尝试删除 ActiveX OLEObject从工作表然后启动 UserForm如vbModeLess . 在下面的代码中: 首先,一个子创建一个 OLEObject (a Label )在工作表
更新:在对象浏览器中的进一步研究...看来 MSForms.TextBox 既没有实现 .Name 属性也没有实现_Exit 事件 - 只有 _Change 事件。有没有办法确定哪个特定的 TextB
我正在尝试在工作中创建一个库存系统,作为我们唯一拥有的 Excel 软件。基本上,我们有一个工作订单表,我们可以在其中输入维修情况以及所使用的零件。我编写了一个代码,可以从各个工作订单中提取插入的零件
只是一个我似乎找不到答案的问题。 我正在以编程方式创建一个用户窗体,并且我发现如果我将对象声明为“MSForms.Userform”类型,则似乎无法设置高度和宽度,因为这些属性不存在,和 inside
我正在通过代码创建我的标签和复选框: i = 1 While Not Sheets("I_M_1_1PW").Cells(9 + i, 43) = "koniec" Set theLabel
我有一个带有一个模块( main )和一个用户表单模块( myUserForm )的项目。 我在模块 main 上将变量声明为全局变量: Dim myGlobal As MyType ...然后我在模
我真的需要一些帮助,我是 VBA 编程的新手,只能自学。 感谢所有帮助。 我的问题是什么? 我的工具中有超过 1 个用户窗体,每个用户窗体都包含很多按钮,有些按钮在其他用户窗体上相同,有些不同。 如果
我正在尝试创建一个用户表单,将 TextBoxes 的值传输到 Word 文件中的书签位置,但出现错误。我尝试了一些在 Google 上找到的示例,但仍然出现错误。 我收到错误“VBA 对象不支持此属
我创建了一个带有三个文本框的用户表单。 第一个文本框用于输入第一个数字,第二个文本框用于输入第二个数字,最后一个是结果。 我创建了一个名为Calculate 的按钮。 我有 textbox1 的代码:
我的问题是:在 Excel 2013 中使用 VBA 当用户决定不想填写用户表单并单击退出或取消时,如何优雅地关闭整个 Excel 实例? 目前,如果用户单击退出或取消,我会检查我的实例是否是唯一打开
我是一名优秀的程序员,十分优秀!