В настоящее время я не могу использовать xlwings, потому что не могу получить доступ к cmd Windows. Но я могу получить доступ к PowerShell, поэтому я попытался изменить специальный код VBA для xlwings, который вместо этого вызывает cmd для вызова PowerShell.
При вызове PowerShell с командами из VBA он не работает. Если я вставлю точно такие же команды в терминал PowerShell, он будет работать как положено.
Я пытался сравнить (не работающую) команду, которую VBA передает в PowerShell, с (рабочей) командой, которую я вручную вставляю в терминал PowerShells. Но они выглядят точно так же.
Исходный код xlwings, который вызывает cmd
RunCommand = PythonInterpreter & " -B -c ""import sys, os; sys.path[0:0]=os.path.normcase(os.path.expandvars(r'" & PYTHONPATH & "')).split(';'); " & PythonCommand & """ "
ExitCode = Wsh.Run("cmd.exe /C " & _
DriveCommand & RunCommand & _
"""" & WORKBOOK_FULLNAME & """ ""from_xl""" & " " & _
Chr(34) & Application.Path & "\" & Application.Name & Chr(34) & " " & _
Chr(34) & Application.Hwnd & Chr(34) & _
" 2> """ & LOG_FILE & """ ", _
WindowStyle, WaitOnReturn)
И моя слегка модифицированная версия
RunCommand = "C:\ProgramData\Anaconda3\pythonw.exe -B -c ""import sys, os; sys.path[0:0]=os.path.normcase(os.path.expandvars(r'" & PYTHONPATH & "')).split(';'); " & PythonCommand & """ "
ExitCode = Wsh.Run("Powershell.exe -ExecutionPolicy ByPass -NoExit " & _
DriveCommand & RunCommand & _
"""" & WORKBOOK_FULLNAME & """ ""from_xl""" & " " & _
Chr(34) & Application.Path & "\" & Application.Name & Chr(34) & " " & _
Chr(34) & Application.Hwnd & Chr(34) & _
" 2> """ & LOG_FILE & """ ", _
WindowStyle, WaitOnReturn)
Результирующая команда из приведенного выше кода. Работает при прямой вставке в терминал PowerShells, не работает при выполнении из VBA:
C:\ProgramData\Anaconda3\pythonw.exe -B -c "import sys, os; sys.path[0:0]=os.path.normcase(os.path.expandvars(r'C:\Users\<placeholder>\test1;')).split(';'); import test1;test1.hello_xlwings()" "C:\Users\<placeholder>\test1\test1.xlsm" "from_xl" "C:\Program Files (x86)\Microsoft Office\Office16\Microsoft Excel" "788640" 2> "C:\Users\<placeholder>\AppData\Roaming\xlwings.log"
Я ожидаю простого "Привет, мир!" в определенной ячейке Excel при нажатии кнопки, связанной с макросом vba. Вместо этого я получаю эту ошибку:
At line:1 char:213
+ ... X0RNZ\test1;')).split(';'); import test1;test1.hello_xlwings() C:\Use ...
+ ~
An expression was expected after "(".
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ExpectedExpression
Если я вставлю команду в терминал PowerShell напрямую, я получу ожидаемый результат: «Привет, мир!» отображается в моей конкретной ячейке Excel.