Объявить их вне подпрограммах, как это:
Public wbA as Workbook
Public wbB as Workbook
Sub MySubRoutine()
Set wbA = Workbooks.Open("C:\file.xlsx")
Set wbB = Workbooks.Open("C:\file2.xlsx")
OtherSubRoutine
End Sub
Sub OtherSubRoutine()
MsgBox wbA.Name, vbInformation
End Sub
В качестве альтернативы, вы можете передавать переменные между подпрограммами:
Sub MySubRoutine()
Dim wbA as Workbook
Dim wbB as Workbook
Set wbA = Workbooks.Open("C:\file.xlsx")
Set wbB = Workbooks.Open("C:\file2.xlsx")
OtherSubRoutine wbA, wbB
End Sub
Sub OtherSubRoutine(wb1 as Workbook, wb2 as Workbook)
MsgBox wb1.Name, vbInformation
MsgBox wb2.Name, vbInformation
End Sub
Или использовать Functions
для возвращения значения:
Sub MySubroutine()
Dim i as Long
i = MyFunction()
MsgBox i
End Sub
Function MyFunction()
'Lots of code that does something
Dim x As Integer, y as Double
For x = 1 to 1000
'Lots of code that does something
Next
MyFunction = y
End Function
В th e second, в пределах OtherSubRoutine
вы ссылаетесь на них по именам их параметров wb1
и wb2
. Переданным переменным не нужно использовать одни и те же имена, одни и те же типы переменных. Это позволяет вам немного свободы, например, у вас есть цикл над несколькими книгами, и вы можете отправить каждой книге в подпрограмму, чтобы выполнить некоторые действия в этой книге, не делая все (или любые) из переменных общедоступными в области.
Замечание о пользовательских форм
Лично я бы рекомендовал держатьOption Explicit
во всех ваших модулей и форм (это предотвращает вас от инстанцировании переменных опечаток в именах, как lCoutn
, когда вы имели в виду lCount
и т.д. ., среди других причин).
Если вы используете Option Explicit
(который вы должны ), то вы должны квалифицироваться модуль-контекстные переменные стиля и, чтобы избежать двусмысленности, и вы должны квалифицироваться пользователем формы Public
контекстные переменные, так как они не являются «общественность» в том же смысле. Например, i
не определен, хотя это в рамках UserForm1
Public
:
Вы можете обратиться к нему как UserForm1.i
, чтобы избежать ошибки компиляции, или поскольку формы New
-able, вы можете создать объектная переменная содержит ссылку на форму, и ссылаться на него таким образом:
NB: в скриншотах выше x
объявлен Public x as Long
в другом стандартном модуле кода и не поднимет ошибку компиляции. Может быть предпочтительнее ссылаться на это как Module2.x
, чтобы избежать неоднозначности и возможного затенения в случае повторного использования имен переменных ...
+1: Можете упомянуть, что это работает для 'Public' в модулях. «Публикация» в классах, формах и рабочих листах несколько сложнее. – RBarryYoung
У меня были проблемы с этим во время отладки - VBA продолжал говорить мне, что у меня были необъявленные переменные. Мне пришлось удалить Option Explicit из моих форм и модулей и определить только переменную Public в одном месте. Вероятно, очень простой, но я никогда не использовал переменную в 12 пользовательских формах и 2 модуля одновременно. – TheFontSnob
@ TheFontSnob Да, как вы обнаружили, есть некоторые ограничения (@RBarryYoung намекает на это выше). Лично я бы рекомендовал * держать * 'Option Explicit' во всех ваших модулях и формах (это мешает вам создавать экземпляры переменных с опечатками в своих именах, например' lCoutn', если вы имели в виду 'lCount' и т. Д., Среди других причин). Если вы используете 'Option Explicit' (который вы ** должны **), тогда вы должны квалифицировать переменные с модульной областью для стиля, и вы ** должны ** квалифицировать переменные области с пользовательской формой, поскольку они не являются« общедоступными » «в том же смысле. –