我有一个userForm(mappingGuide),允许用户从更友好的用户名列表中选择 smartyTag 。
我有第二个用户表单(conditionalBuilder),我想在双击文本字段时调用此userForm,以便用户可以查找要应用的 smartyTag (如果他们没有& #39; t know)。
所以逻辑是:
我认为我在完成要求时遇到的问题是,当我自己加载表单时,我无法找到设置conditionalBuilder的已加载实例的fieldName文本框文本的方法(参见最后一篇)下面的代码块)。我一直在四处寻找,但无法理解。
以下是相关代码:
conditionalBuilder从自定义UI功能区加载
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
smartTag列表框点击事件然后尝试将选择放入fieldName(如果表单未加载则选择)
Private Sub smartTagList_Click()
If smartTagList.ListIndex > -1 And smartTagList.Selected(smartTagList.ListIndex) Then
Dim smartyTag As String
smartyTag = smartTagList.List(smartTagList.ListIndex, 2)
If isUserFormLoaded(conditionalBuilder.Name) Then
'*** ---> below is my issue how to reference instance of form
conditionalBuilder.fieldName.Text = smartyTag
conditionalBuilder.Show
Else
Selection.Range.Text = smartyTag
End If
End If
Unload Me
End Sub
如果有更好的设置,那也很好。我将表单分开,因为用户可以使用几个级别创建标记。
答案 0 :(得分:3)
我就是这样做的,有点矫枉过正,但如果有多种形式,那将是有益的。
第1单元:
TargetAggregateIdentifier
表格1:frmMaster:
@RequestMapping(value="/logout", method = RequestMethod.GET)
public String logout(SessionStatus status){
status.setComplete();
return "redirect:/";
}
表格2:frmChild:
Option Explicit
Sub test()
frmMaster.Show False
End Sub
答案 1 :(得分:3)
您可以使用presenter类来控制userform实例并在它们之间传递值。我嘲笑类似的东西给你一个想法。
<强>演示即可。
这是一个类模块,它创建用户表单,控制它们的范围,并捕获由它引发的事件 ConditionalBuilder。它使得在两者之间传递值变得非常容易 用户窗体。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
<强> ConditionalBuilder 即可。
这有一个简单的功能来更新您的文本框以及一个在演示者中引发操作的事件。
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
<强> MappingGuide 即可。
Type
和Property
可能有点矫枉过正,因为我们只需要地图指南中的一个值,但它仍然是一种很好的做法。
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
我有一个最终的标准模块,用于创建Presenter。这就是你连接你的功能区。
Public Sub ShowProject()
With New Presenter
.ShowCB
End With
End Sub
步骤1(双击文本字段)
第2步(选择&#34; b&#34;)
第3步(结果)
答案 2 :(得分:1)
我实际上是通过将下面的块放在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