Excel 在另一个工作簿用户窗体上循环通过控件

Excel 在另一个工作簿用户窗体上循环通过控件,excel,vba,Excel,Vba,好的,我一直在寻找如何正确地做到这一点。来吧。我有两本作业本。在第一个工作簿中,我有一些用户表单(嵌套的用户表单,为数据输入创建用户界面,然后保存到工作表)。当然,每个用户表单都有控件。第二个工作簿包含宏。我在这个工作簿中有一个读写宏,可以在适当的时候调用它进行读写。在某些情况下,我有一些特殊的写场景需要更多的处理。我已经能够使用application.run方法从第一个工作簿userforms运行第二个工作簿中的宏 这就是我被踩的地方。在第二个工作簿的宏中,我需要返回到第一个工作簿,启动另一个

好的,我一直在寻找如何正确地做到这一点。来吧。我有两本作业本。在第一个工作簿中,我有一些用户表单(嵌套的用户表单,为数据输入创建用户界面,然后保存到工作表)。当然,每个用户表单都有控件。第二个工作簿包含宏。我在这个工作簿中有一个读写宏,可以在适当的时候调用它进行读写。在某些情况下,我有一些特殊的写场景需要更多的处理。我已经能够使用application.run方法从第一个工作簿userforms运行第二个工作簿中的宏

这就是我被踩的地方。在第二个工作簿的宏中,我需要返回到第一个工作簿,启动另一个用户窗体,然后循环通过控件(文本框)并更新某些文本框值,以便执行特殊的编写场景。为了尝试这样做,我正在执行“Application.Run(“”&wb.Name&“!showNA”)”,它将打开并初始化第一个工作簿中的另一个用户窗体。然后我想使用“vbcompfrm.Designer.controls中的每个ctrl”循环遍历它的控件,我无法使用这些控件,并且尝试了许多不同的语法和组合。救命啊!我也在工具中签入了扩展性引用。我是一个自学成才的vba爱好者,所以请放松我的方法:D非常感谢

    'code in workbook 2'
Public Sub test(ByRef FRM)
Dim ctrl As MSForms.Control
Dim vbcompfrm As VBComponent
Dim SubStr As String
Dim MyArr() As Variant
Dim key As String
Dim ATTR As String

ReDim MyArr(1)
MyArr(0) = "first"
MyArr(1) = "second"

Set ws = wb.Worksheets("testws")
    Application.Run ("'" & wb.Name & "'!showNA")    'this will show the userform NA form the first workbook'
    'Application.Run ("'" & wb.Name & "'!hideNA")
    With UserForms("tbls_RTU_NA")
        Set vbcompfrm = wb.VBProject.VBComponents("NA")    'this is the userform in the first workbook, we want to loop thru the controls'
        For Each ctrl In vbcompfrm.Designer.Controls    'not sure how to make this work'
            With ctrl
                For i = LBound(MyArr) To UBound(MyArr)
                    If .ControlTipText = MyArr(i) Then
                        datasplit = Split(MyArr(i), "_")
                        key = datasplit(0)
                        ATTR = datasplit(1)
                        .Text = SearchDataArray(StandardTableDataArray, "NA_" & key, ATTR)    'don't forget we need to set the value of the new text to the array value once we match the key
                    End If
                Next i
            End With
        Next ctrl
    End With

第一个问题是为什么要在两个工作簿中分开这些项目使用
应用程序运行代码会让生活变得更加困难。运行
是一件痛苦的事。因为我有15多本使用相同代码的工作簿,我正在及时更新和查找错误,所以修复和更新所有工作簿是一件痛苦的事。所以,我用这种痛苦换取了使用application.run的痛苦,希望一旦我完成了安装,就不会再有痛苦了我确实想过做一个主宏工作簿,每次运行15个宏中的一个时,只复制最新的宏。建议?您不必在多个工作簿中包含所有宏和窗体,但可以将宏和窗体组合在一个工作簿中,并让它们在需要运行它们的工作簿上运行。