VBA从另一个UserFormB向UserFormA的文本框输入值
我有一个userForm(mappingGuide),它允许用户从一个更加用户友好的名称列表中选择smartyTag 我还有第二个用户表单(conditionalBuilder),我想在双击文本字段时调用此用户表单,以便用户可以查找要应用的smartyTag(如果他们不知道) 因此,逻辑是:VBA从另一个UserFormB向UserFormA的文本框输入值,vba,ms-word,userform,Vba,Ms Word,Userform,我有一个userForm(mappingGuide),它允许用户从一个更加用户友好的名称列表中选择smartyTag 我还有第二个用户表单(conditionalBuilder),我想在双击文本字段时调用此用户表单,以便用户可以查找要应用的smartyTag(如果他们不知道) 因此,逻辑是: 打开条件生成器 双击字段文本框 mappingGuide将打开 从列表框中选择smartytag 将smartytag值填入conditionalBuilder的字段文本框中 卸载映射向导 我认为我在完成要
Sub RunCode(ByVal Control As IRibbonControl)
Select Case Control.ID
Case Is = "mapper": LoadMappingGuide
Case Is = "conditional": LoadConditionalBuilder
End Select
End Sub
Sub LoadConditionalBuilder()
Dim conditionalForm As New conditionalBuilder
conditionalForm.Show False
End Sub
双击fieldName事件,然后加载mappingGuide
Private Sub fieldName_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Me.hide
Dim pickField As New mappingGuide
pickField.Show False
End Sub
智能标签列表框单击事件,然后尝试将所选内容放入fieldName(或未加载表单时的所选内容)
如果有一个更好的设置,这将是伟大的知道太多。我将表单分开,因为用户可以使用两个级别创建标记。我实际上解决了这个问题,将下面的块放在
IF
中,我检查正在加载的表单,如果有更好的答案,我将保持打开状态
Dim uForm As Object
For Each uForm In VBA.UserForms
If uForm.Name = conditionalBuilder.Name Then
uForm.fieldName.Text = smartyTag
uForm.Show
End If
Next
这是我将如何做的,有点过分,但在多种形式的情况下,这将是有益的 单元1:
Option Explicit
Sub test()
frmMaster.Show False
End Sub
表格1:frmMaster:
Option Explicit
'/ Declare with events
Dim WithEvents frmCh As frmChild
Private Sub TextBox1_DblClick(ByVal cancel As MSForms.ReturnBoolean)
handleDoubleClick
End Sub
Sub handleDoubleClick()
If frmCh Is Nothing Then
Set frmCh = New frmChild
End If
frmCh.Show False
End Sub
'/ Handle the event
Private Sub frmCh_cClicked(cancel As Boolean)
Me.TextBox1.Text = frmCh.bChecked
End Sub
表格2:FRM儿童:
Option Explicit
Event cClicked(cancel As Boolean)
Private m_bbChecked As Boolean
Public Property Get bChecked() As Boolean
bChecked = m_bbChecked
End Property
Public Property Let bChecked(ByVal bNewValue As Boolean)
m_bbChecked = bNewValue
End Property
Private Sub CheckBox1_Click()
Me.bChecked = Me.CheckBox1.Value
'/ Raise an event when something happens.
'/ Caller will handle it.
RaiseEvent cClicked(False)
End Sub
您可以使用presenter类来实现这一点,该类控制userform实例并在它们之间传递值。我模拟了一些类似的东西给你一个想法 演示者
这是一个类模块,用于创建userforms,控制其作用域,并捕获 条件生成器。它使在两个对象之间传递值变得超级容易 用户表单
Private WithEvents CB As ConditionalBuilder
Private MG As MappingGuide
Public Sub ShowCB()
Set CB = New ConditionalBuilder
CB.Show vbModal
End Sub
Private Sub CB_ShowMappingGuide()
Set MG = New MappingGuide
MG.Show vbModal
CB.UpdateTB1 Value:=MG.SmartTag
End Sub
条件生成器这有一个简单的函数来更新你的文本框,还有一个在演示者中引发动作的事件
Public Event ShowMappingGuide()
Public Function UpdateTB1(Value As String)
TextBox1.Value = Value
End Function
Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
RaiseEvent ShowMappingGuide
End Sub
地图指南类型
和属性
可能有些过分,因为我们只需要映射指南中的一个值,但这仍然是一个很好的实践
Private Type TView
Tag As String
End Type
Private this As TView
Public Property Get SmartTag() As String
SmartTag = this.Tag
End Property
Private Sub UserForm_Initialize()
Tags.List = Array("a", "b", "c")
End Sub
Private Sub Tags_Click()
this.Tag = Tags.List(Tags.ListIndex, 0)
Me.Hide
End Sub
我有最后一个标准模块,创建演示者。这就是你要挂在缎带上的东西
Public Sub ShowProject()
With New Presenter
.ShowCB
End With
End Sub
步骤1(双击文本字段)
步骤2(选择“b”)
步骤3(结果)
更好的方法是在表单上使用属性。您是否尝试过:
UserForms(“TheNameOfUserForm”)
?@cyboashu-您能否在回答中详细说明或画出它,或者提供链接以获取更多信息?@MaciejLos-是的。没用。@CallumDA,你是对的,这就是为什么我对你和[cyboashu]的答案投了赞成票。这只是另一个想法谢谢我得研究一下。这超出了我目前的理解水平,但我认为可能非常有用。这也非常棒。非常感谢。因为这对我来说有点新鲜,所以我必须研究一下。再次感谢;)很乐意帮忙!如果你有任何问题要问:)我有一个问题是,在你的例子中,两个表单的代码仍然进入userform模块,对吗?我也可以在mappingGuide表单中对事件使用,对吗,因为它会被自己调用,并根据用户的选择采取某些操作。是的,它会调用,你也可以调用——尽管如果我没记错的话,VBA的一个怪癖是,在你的列表中有相应的公共事件SomeEvent
之前,你不能用Private with events MG…
编译你的演示者地图指南
Public Sub ShowProject()
With New Presenter
.ShowCB
End With
End Sub