在父级中调用助手功能,而无需在助手中重新定义父级的对象

时间:2019-05-06 17:27:08

标签: excel vba

我正在使用VBA在Excel中工作,以收集要建立的表的数据,我必须去TN3270仿真器才能获取它。为了与仿真器一起工作,我必须定义一些对象来完成工作。我也有一些帮助程序功能,多个功能可使用这些功能来导航到模拟器中的不同屏幕。到目前为止,为了使用它们,我不得不将对象定义复制到这些函数中以使其起作用。这在大多数情况下都有效,但是有时(并且以某种方式我无法预期地复制),当助手重新创建要使用的特定对象时,我会出错。

Option Explicit
Public Sub gather_data()
    Dim TN_Emulator As Object
    Dim Workbook As Object
    Set TN_Emulator = CreateObject("TN_Emulator.Program")
    Set Workbook = ActiveWorkbook
    Dim string_from_excel As String

    #for loop to go through table rows
        #put value in string_from_excel
        If string_from_excel = some condition
            go_to_screen_2
            #grab and put data back in excel
        Else
            go_to_screen_3
            #grab and put data back in excel
        End If
        go_to_screen_1
    #next loop logic
End Sub

Public Sub go_to_screen_1()
    Dim TN_Emulator As Object

    #the next step occasionally throws the error
    Set TN_Emulator = CreateObject("TN_Emulator.Program") 

    #send instructions to the emulator
End Sub

是否有一种方法可以导入现有对象(创建和使用时没有任何错误),而无需将其重新定义到辅助函数中来避免此问题?我曾尝试在Google中搜索,但我认为我使用的搜索字词不正确。

1 个答案:

答案 0 :(得分:1)

首先要感谢@JosephC和@Damian在评论中为我发布答案。

JosephC的“您要查找的关键字是:“如何将参数传递给函数”。”,他提供了以下链接ByRef vs ByVal,其中描述了在函数调用中传递参数的两种不同方法。

从达米安(Damian)那里解决我的紧迫问题。而不是声明和设置将在辅助函数主体中使用的对象。将对象名称和类型放在初始帮助器名称的括号中,从另一个函数调用帮助器时,也应在括号中,如下所示。

Option Explicit
Public Sub gather_data()
    Dim TN_Emulator As Object
    Dim Workbook As Object
    Set TN_Emulator = CreateObject("TN_Emulator.Program")
    Set Workbook = ActiveWorkbook
    Dim string_from_excel As String

    #for loop to go through table rows
        #put value in string_from_excel
        If string_from_excel = some condition
            Call go_to_screen_2(TN_Emulator)
            #grab and put data back in excel
        Else
            Call go_to_screen_3(TN_Emulator)
            #grab and put data back in excel
        End If
        Call go_to_screen_1(TN_Emulator)
    #next loop logic
End Sub

Public Sub go_to_screen_1(TN_Emulator As Object)
   #send instructions to the emulator
End Sub

我相信我正确理解了说明,并且已经为我自己成功进行了测试。我还在助手函数定义中传递了多个对象,并按实际应用程序的需要按每次Ex的相同顺序进行调用。

Sub go_to_screen_1(TN_Emulator As Object, ConnectionName As Object)

Call go_to_screen_1(TN_Emulator, ConnectionName)