另一个UserFormB的VBA输入值从UserFormA到TextBox

时间:2018-02-05 16:40:52

标签: vba ms-word word-vba userform

我有一个userForm(mappingGuide),允许用户从更友好的用户名列表中选择 smartyTag

我有第二个用户表单(conditionalBuilder),我想在双击文本字段时调用此userForm,以便用户可以查找要应用的 smartyTag (如果他们没有& #39; t know)。

所以逻辑是:

  1. open conditionalBuilder
  2. 双击“字段文本框”
  3. mappingGuide打开
  4. 从列表框中选择一个smartytag
  5. 将smartytag值填入conditionalBuilder
  6. 的字段文本框中
  7. 卸载mappingGuide
  8. 我认为我在完成要求时遇到的问题是,当我自己加载表单时,我无法找到设置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
    

    如果有更好的设置,那也很好。我将表单分开,因为用户可以使用几个级别创建标记。

3 个答案:

答案 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 即可。
TypeProperty可能有点矫枉过正,因为我们只需要地图指南中的一个值,但它仍然是一种很好的做法。

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(双击文本字段)

enter image description here

第2步(选择&#34; b&#34;)

enter image description here

第3步(结果)

enter image description here

答案 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