Разбор значений перечисления по имени в VBA - PullRequest
0 голосов
/ 31 января 2020

Я хочу написать некоторый код VBA, который должен анализировать имена констант MSForms (заданные в виде строки, как "fmTextAlignLeft") в их фактическое значение. Поскольку нет никакого собственного способа сделать это, я собирался поместить имя константы в код powershell, который затем будет выполнен и вернет результат.

Private Sub ParseEnumByName(EnumConst As String)
    Dim WScript As New WshShell
    Dim PSCode As String
    Dim Result
    PSCode = "(some code)" & EnumConst & "(more code with exit $Value statement)"

    Result = WScript.Run("Powershell -command """ & PSCode & """", 0, True)

    ParseEnumByName = Result
End Sub

Это должно быть осуществимо путем итерации по всем перечисления в библиотеке MSForms и получение значений из них с помощью чего-то вроде [System.Enum]::GetNames( [System.Windows.Forms.FormBorderStyle] ) или, может быть, что-то вроде объясненного здесь: Как преобразовать строку в перечисление?

Проблема в том, что библиотека System. Windows .Forms содержит совершенно другие перечисления и типы названий, чем библиотека MSForms, доступная в VBA.

Я попытался Add-Type -Path "C:\Windows\SysWOW64\FM20.DLL", где хранится библиотека MSForms, но возвращает ошибку, сообщающую, что файл или сборка или какой-либо связанный файл не найден.

Как получить ссылку на MSForms в Powershell?

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

1 Ответ

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

Вот функция, которую я понял. Пока что он работает со всеми предварительно определенными перечислениями и константами, а также с самоопределенными перечислениями в Excel. Функция должна быть размещена в модуле!

Static Function ParseValue(StringValue) As Variant
    Dim ParseValueBuffer As Variant

    If IsEmpty(ParseValueBuffer) Then
        ParseValueBuffer = 1
        Application.Run ("'ParseValue " & StringValue & "'")
        ParseValue = ParseValueBuffer
        ParseValueBuffer = Empty
    Else
        ParseValueBuffer = StringValue
    End If
End Function

Sub TestMe()
    MsgBox "First line" & ParseValue("vbcrlf") & "Second line"
    MsgBox ParseValue("fmTextAlignCenter") 'Should return "2" (if MSForms is referenced)
    MsgBox ParseValue("rgbblue") 'Should return 16711680
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...