Вызвать вспомогательную функцию внутри родителя, не переопределяя объекты из родительского в помощнике. - PullRequest
0 голосов
/ 06 мая 2019

Я работаю в Excel с VBA, чтобы собрать данные для таблицы, которую я строю. Мне нужно выйти на эмулятор 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 Ответ

1 голос
/ 06 мая 2019

Первое спасибо @JosephC и @Damian за то, что они опубликовали для меня ответ в комментариях.

От JosephC 'Ключевые слова, которые вы ищете: «Как передать аргументы в функцию».', И он предоставил следующую ссылку ByRef vs ByVal , описывающую два различных способа передачи аргументов в вызове функции.

И от Дамиана решение моей непосредственной проблемы. Вместо объявления и установки объектов, которые будут использоваться в теле вспомогательной функции. Поместите имена и типы объектов в скобки исходного имени помощника, а при вызове помощника из другой функции также в скобках, как показано ниже.

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

Мне кажется, я правильно понял инструкции и успешно проверил это на себе. Я также передал несколько объектов в определении вспомогательной функции и вызовы, необходимые для моего реального приложения, в том же порядке каждый раз, например.

Sub go_to_screen_1(TN_Emulator As Object, ConnectionName As Object)

и

Call go_to_screen_1(TN_Emulator, ConnectionName)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...