Получение списка объявленных констант? - PullRequest
0 голосов
/ 12 марта 2020

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

Public Const project = "XXXX-"
Public Const filepath = "Z:\Operations\Projects\XXXXXXX\"
Public Const tracker = "20YY XXXX WO Tracker.xlsm"
Public Const WOarchive = "Archive\"
Public Const WOfolder = "20YY WOs\"
Public Const WOtemplates = "WO Templates\"
Public Const template001 = "template1_filename.xlsx"
Public Const template003 = "template3_filename.xlsx"
Public Const template005 = "template5_filename.xlsx"
Public Const template007 = "template7_filename.xlsx"
Public Const template009 = "template9_filename.xlsx"

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

Ответы [ 2 ]

3 голосов
/ 12 марта 2020

Это решение является ЕДИНСТВЕННЫМ ответом на ВАШ вопрос ... но это не значит, что вы должны это делать. Вы используете константы для удобства сопровождения, что хорошо, но код VBA по умолчанию недоступен для другого кода VBA в целях безопасности. Так что для вашего сценария лучше использовать альтернативу константам. Другие предложили использовать словарь. Вы также можете использовать CustomXMLParts , которые имеют преимущество постоянства.

При этом единственный способ получить имена констант - это проанализировать текст модуля кода, который содержит константы.

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

Microsoft Visual Basic for Applications Extensibility 5.3 type library

... в Инструменты -> Ссылки в VB IDE.

Затем вы можете получить объявления модуля следующим образом ...

With ThisWorkbook.VBProject.VBComponents("YOUR_CODE_MODULE_NAME").CodeModule

    MsgBox .Lines(1, .CountOfDeclarationLines)

End With
1 голос
/ 12 марта 2020

Это решение для сценариев.директория

Класс ComboTxt

Option Explicit

Public Enum ComboYourNameTexts
    NotDefined = -1
    Project
    filepath
    tracker
    WOarchive
    WOfolder
    WOtemplates
    template001
    template003
    template005
    template007
    template009
End Enum

Private Type State

    Host                            As Scripting.Dictionary

End Type

Private s                           As State

Private Sub Class_Initialize()

    If s.Host Is Nothing Then

        Set s.Host = New Scripting.dicitonary

    End If

    With s.Host

        .Add Project, "XXXX-"
        .Add filepath, "Z:\Operations\Projects\XXXXXXX\"
        .Add tracker, "20YY XXXX WO Tracker.xlsm"
        .Add WOarchive, "Archive\"
        .Add WOfolder, "20YY WOs\"
        .Add WOtemplates, "WO Templates\"
        .Add template001, "template1_filename.xlsx"
        .Add template003, "template3_filename.xlsx"
        .Add template005, "template5_filename.xlsx"
        .Add template007, "template7_filename.xlsx"
        .Add template009, "template9_filename.xlsx"

    End With

End Sub

Public Property Get Item(ByVal Key As ComboYourNameTexts)
    Item = s.Host.Item(Key)
End Property

'@Description("Returns a variant array containing the Keys of the scripting Dictionary (values of the enum ComboYourNameTexts)
Public Function Keys() As Variant
    Keys = s.Host.Keys
End Function

'@Description("Returns a variant array containg the strings put into the scripting dictionary")
Public Function Items() As Variant
    Items = s.Host.Items
End Function

Public Function Count() As Long
    Count = s.Host.Count
End Function

Пример использования

DIm myCmb as ComboTxt
Set myCmb = new ComboTxt

Dim myEnum as variant
For each myEnum in myCmb  ' scripting dictionaries return the Key not the value

    'Do something with myCmb.Item(myEnum)   'NB you will get intellisense for your enum when you type the (

Next

или даже

myComboBox = myCmb.Items  'if my memory serves me correctly
...