Определение кросс-модульных переменных со значениями - PullRequest
0 голосов
/ 16 января 2019

Я разрабатываю кучу макросов Excel для облегчения моей жизни. Одна часть разных макросов - вставка рисунка в листы. По этой причине я хотел бы сохранить путь к изображениям в глобальном местоположении, а затем получить к нему доступ через переменную (чтобы мне не приходилось вручную настраивать пути в каждом макросе, если он изменяется). Я использую один модуль на макрос

В моем собственном модуле «Переменные» я определил переменную как Public или Global, а затем присвоил значение через подпрограмму. Если я теперь получу доступ к этой переменной через другой модуль, я получу пустой MsgBox. Для целей тестирования я использую строку, которую я хочу отобразить через MsgBox.

Модуль 1:

Public test As String
Sub variablen()
    test = "String for Test "
End Sub

Модуль 2:

Public Sub testpublic()
    MsgBox (test)
End Sub

Ответы [ 2 ]

0 голосов
/ 16 января 2019

, чтобы мне не приходилось вручную настраивать пути в каждом макросе, если он изменяется

Если это когда-либо нужно изменить, то семантически это не Const. Ключом к написанию кода, который вам не нужно постоянно изменять, является отделение кода от данных .

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

Имейте модуль, который может читать настройки, где бы они ни находились, и возвращать значение настройки, учитывая некоторую клавишу .

Сами настройки могут располагаться на (скрытом?) Рабочем листе, в таблице ListObject со столбцами Key и Value и использоваться с функциями INDEX + MATCH (с использованием ранней привязки). WorksheetFunction функции будут выдавать ошибки во время выполнения при наличии несуществующей ключевой строки):

Option Explicit

Public Function GetSettingValue(ByVal key As String) As Variant
    With SettingsSheet.ListObjects(1)
        GetSettingValue = Application.WorksheetFunction.Index( _
            .ListColumns("Value").DataBodyRange, _
            Application.WorksheetFunction.Match(key, .ListColumns("Key").DataBodyRange, 0))
    End With
End Function

Variant сохранит подтип Value, поэтому для значения String вы получите Variant/String; для значения Date вы получите Variant/Date, для числового значения вы получите Variant/Double, а для значения ИСТИНА / ЛОЖЬ вы получите Variant/Boolean.

Теперь, когда нужно изменить путь к файлу, ваш код не:

Dim path As String
path = GetSettingValue("ImageFolderPath")

А если вам нужно больше настроек, у вас нет кода для добавления:

Dim otherThing As String
otherThing = GetSettingValue("OtherThing")

Все, что вам нужно сделать, это убедиться, что используемые строковые ключи соответствуют содержимому столбца Key в вашем SettingsSheet.

0 голосов
/ 16 января 2019

Я рекомендую использовать константу вместо переменной:

Модуль 1

Option Explicit

Public Const MyPath As String = "C:\Temp"

Модуль 2

Option Explicit

Public Sub ShowPath()
    MsgBox MyPath
End Sub

Я также рекомендую активировать Option Explicit: в редакторе VBA перейдите на Инструменты Параметры Требуется объявление переменных .


Если вы делаете это так, как вы, test пусто до тех пор, пока оно не будет инициализировано, сначала запустив процедуру variablen. Если вы используете Public Const, инициализация не требуется.

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