VBA: переменная Publi c против свойства - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть 3 разных модуля, и у всех них есть Subs, которые на каком-то этапе используют книгу, в которой хранится код. Module3 - это место, где устанавливаются мои диапазоны, и я также поместил рабочую книгу publi c Переменная там. Для пояснения: две основные подпрограммы выполняют разные задачи и не имеют ничего общего друг с другом - за исключением того, что обе используют одни и те же переменные диапазона и строки, поэтому я поместил их в дополнительный модуль.

У меня также есть пользовательская форма, которая использует ThisWorkbook в своем событии Initialize. До сих пор я использовал переменную publi c, чтобы объявить рабочую книгу (wbTest) в Module3, но я читал о свойствах, которые раньше никогда не использовал. Я думал о передаче wbTest из Module2 в Userform, что, как я выяснил, невозможно для Initialize, и именно так я наткнулся на свойства.

Мой вопрос: из примеров я вижу, что довольно удобно использовать свойства, когда с ними связана какая-то обработка ошибок или вычисления. Но в моем случае это просто команда Set wbTest, не более того - имеет ли смысл в этом случае выбирать свойство над переменной c publi?

Модуль 1:

Option Explicit

Private Sub MainSub1()
    Call Module3.DefiningRanges
    MsgBox wbTest.Range("A1").Value
End Sub

Модуль 2:

Option Explicit

Private Sub MainSub2()
   Call Module3.DefiningRanges
   MsgBox wbTest.Range("A2").Value
   frmSelection.Show
End Sub

Модуль 3:

Option Explicit
Public wbTest As Workbook

Public Sub DefiningRanges()
   Set wbTest = ThisWorkbook   
End Sub

Форма пользователя frmSelection:

Option Explicit

Private Sub UserForm_Initialize()
  MsgBox wbTest.Sheets(1).Range("B1").Value
End Sub

Так что это довольно общий вопрос, но в Google я не нашел такого простого случая, как мой. Теперь я знаю, что переменные publi c осуждаются, и многие стараются избегать их, если это возможно - поэтому я спрашиваю, стоит ли мне заменить их здесь свойством.

1 Ответ

0 голосов
/ 26 февраля 2020

когда вы говорите об использовании свойств, это звучит так, как будто вы хотите использовать Module3 в качестве объекта, и в этом случае его нужно создать как модуль класса. Это кажется немного излишним для простого возврата диапазона - почему бы вам просто не преобразовать его в функцию, которая возвращает объект диапазона? Вы можете просто изменить Sub в Module3 следующим образом:

Public Function DefiningRanges() as WorkBook
   Set DefiningRanges = ThisWorkbook   
End Function

Затем в других ваших модулях вы можете создать новый объект и заполнить его результатом этой функции следующим образом:

Private Sub MainSub1()
    Dim wb as WorkBook 
    Set wb = Module3.DefiningRanges()
    MsgBox wb.Range("A1").Value
End Sub

Обратите внимание, что вы больше не будете ссылаться на wbTest, и я заменил его новой книгой WorkBook [wb] в строке MsgBox. Таким образом, нет глобальных переменных, есть только «глобальная функция», которая возвращает ссылку на WorkBook.

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