Я хочу написать некоторый код 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) для решения этой проблемы без передачи значений внешним хостам скриптов. Пожалуйста, смотрите ниже.