Как активировать wookbook с именем в другом модуле - PullRequest
0 голосов
/ 31 мая 2019

Я вызываю module2 из module1, где я называю рабочую книгу «x» в module2. Но позже, когда я пытаюсь «x.Activate» в module1, я получаю сообщение об ошибке «Ошибка времени выполнения 424: требуется объект»

У меня есть довольно длинный модуль, который я хотел бы организовать, разбив его на несколько модулей. До сих пор я создал модуль с именем «INPUTS», в этом модуле у меня есть «Sub RT_CMM_DATA_COMPILER_INPUTS ()», предположительно, в будущем у меня будут другие подпрограммы в этом модуле «Sub RT_Some_Other_Project_INPUTS ()», который я называю рабочей книгой в «Sub RT_CMINPER» ) "и попробуйте активировать эту книгу по имени в отдельном модуле под названием песочница. Но он отображает ошибку.

'RT_Sandbox Module
Sub sandbox()

    Call RT_CMM_DATA_COMPILER_INPUTS

    wkbwatchFolders_table.Activate
    lastShtRow = LASTSHEETROW(ActiveSheet)

    MsgBox lastShtRow

End Sub


'Inputs module
Sub RT_CMM_DATA_COMPILER_INPUTS()

    watchFolders_filePath = "D:\RT_CMM_Data_File_Paths.xlsx"
    Set wkbwatchFolders_table = Workbooks.Open(Filename:=watchFolders_filePath)

End Sub

Собираюсь ли я попытаться организовать мой код совершенно неправильно? Должен ли я использовать модули класса для этого вместо этого? Или это просто какой-то синтаксис, который мне не хватает?

Ответы [ 2 ]

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

Критическая часть, которую вам не хватает, это Option Explicit вверху каждого модуля.

С этой опцией код будет отказываться от компиляции, пока все переменные не будут явно объявлены.

Без него watchFolders_filePath является необъявленной переменной в обеих процедурах , а в области, где она читается, но не назначается, ее тип данных Variant/Empty.

Rubberduck (бесплатный проект надстройки VBIDE с открытым исходным кодом, которым я управляю) может помочь найти и исправить эти (и другие) проблемы в вашем коде:


Что касается вашего кода, вам не нужны глобальные переменные. Избегайте глобальных переменных, когда это возможно . Вместо этого используйте функции (и параметры):

Function RT_CMM_DATA_COMPILER_INPUTS() As Workbook
    Dim watchFolders_filePath As String
    watchFolders_filePath = "D:\RT_CMM_Data_File_Paths.xlsx"
    Set RT_CMM_DATA_COMPILER_INPUTS = Workbooks.Open(Filename:=watchFolders_filePath)
End Function
Sub sandbox()

    Dim wb As Workbook
    Set wb = RT_CMM_DATA_COMPILER_INPUTS    
    wb.Activate
    lastShtRow = LASTSHEETROW(wb.ActiveSheet)

    MsgBox lastShtRow

End Sub
0 голосов
/ 31 мая 2019

Использование оператора Public будет работать здесь:

Public x As Workbook 
Public your_var As Object

Вы должны объявить это вне вашей процедуры, в верхней части модуля. После их объявления вы можете получить к ним доступ в любом месте любого модуля.

Подробнее читайте здесь: Объявление переменных

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