Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA从另一个UserFormB向UserFormA的文本框输入值_Vba_Ms Word_Userform - Fatal编程技术网

VBA从另一个UserFormB向UserFormA的文本框输入值

VBA从另一个UserFormB向UserFormA的文本框输入值,vba,ms-word,userform,Vba,Ms Word,Userform,我有一个userForm(mappingGuide),它允许用户从一个更加用户友好的名称列表中选择smartyTag 我还有第二个用户表单(conditionalBuilder),我想在双击文本字段时调用此用户表单,以便用户可以查找要应用的smartyTag(如果他们不知道) 因此,逻辑是: 打开条件生成器 双击字段文本框 mappingGuide将打开 从列表框中选择smartytag 将smartytag值填入conditionalBuilder的字段文本框中 卸载映射向导 我认为我在完成要

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

我还有第二个用户表单(conditionalBuilder),我想在双击文本字段时调用此用户表单,以便用户可以查找要应用的smartyTag(如果他们不知道)

因此,逻辑是:

  • 打开条件生成器
  • 双击字段文本框
  • mappingGuide将打开
  • 从列表框中选择smartytag
  • 将smartytag值填入conditionalBuilder的字段文本框中
  • 卸载映射向导
  • 我认为我在完成要求时遇到的问题是,当我加载表单本身时,我无法找到一种方法来设置已加载的conditionalBuilder实例的fieldName文本框的文本(请参见下面的最后一个代码块)。我一直在四处寻找,但找不出答案

    以下是相关代码:

    从自定义UI功能区加载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