programing

Excel vba에서 python 스크립트를 호출하는 방법

oldcodes 2023. 4. 19. 23:26
반응형

Excel vba에서 python 스크립트를 호출하는 방법

VBA에서 python 스크립트를 호출하려고 하는데 저는 초보입니다.py2exe를 사용하여 메인 스크립트를 exe로 변환한 후 VBA(셸)에서 호출하려고 했는데, 메인 스크립트가 다른 스크립트를 호출하기 때문에 복잡해져서 (내 exe가 기능하지 않습니다.게다가 메인 스크립트가 큰 파일이기 때문에 많이 수정하고 싶지 않습니다.

요컨대 스크립트를 exec 파일로 변환하지 않고 Excel vba에서 메인 스크립트를 호출할 수 있는 방법이 있습니까?

지금까지, 저는 다음과 같이 시도했다.

RetVal = Shell("C:\python27\python.exe " & "import " & "C:\\" & "MainScriptFile")

python.exe가 시작되지만 다른 작업은 수행되지 않습니다.그리고 나서 나는 시도했다:

RetVal = Shell("C:\Windows\System32\cmd.exe " & "python " & "C:\\Python27\\hello.py")

명령 프롬프트가 시작되지만 python은 시작되지도 않습니다.

P.S. 포럼에서 관련된 질문들을 모두 확인했지만, 그것들은 제 문제를 해결해주지 않습니다.

이것을 시험해 보세요.

RetVal = Shell("<full path to python.exe> " & "<full path to your python script>")

또는 python 스크립트가 워크북과 같은 폴더에 있는 경우 다음을 시도할 수 있습니다.

RetVal = Shell("<full path to python.exe> " & ActiveWorkBook.Path & "\<python script name>")

<고객명>님에 기재되어 있습니다.<>주어질 것이다. <> 가능한 . - 변경 가능한 필드입니다.

이거면 될 것 같아.그러나 스크립트가 다른 폴더에 있는 다른 파일을 호출할 경우 스크립트가 적절하게 처리하지 않으면 오류가 발생할 수 있습니다.도움이 됐으면 좋겠다.

이 오래된 포스트를 우연히 발견했어요.위에 열거된 어떤 것도 나에게는 효과가 없었다.아래 스크립트를 테스트해 본 결과, 시스템에서 정상적으로 동작했습니다.나 다음에 이 자리에 온 다른 사람들을 위해 여기서 나누는 것.

Sub RunPython()

Dim objShell As Object
Dim PythonExe, PythonScript As String
    
    Set objShell = VBA.CreateObject("Wscript.Shell")

    PythonExe = """C:\your_path\Python\Python38\python.exe"""
    PythonScript = "C:\your_path\from_vba.py"
    
    objShell.Run PythonExe & PythonScript
    
End Sub

이 문제를 해결할 수 있는 몇 가지 방법이 있습니다.

Pynx - Excel 프로세스 공간에서 Python을 호출할 수 있는 매우 가벼운 도구 http://code.google.com/p/pyinex/

몇 년 전에 사용한 적이 있는데 (개발이 한창이던 시절) 꽤 잘 작동했습니다.

돈 내도 괜찮으시다면, 이건 꽤 괜찮아 보이는데요.

https://datanitro.com/product.html

한 번도 안 써봤는데


만약 당신이 Python으로 이미 글을 쓰고 있다면, 당신은 완전히 Excel을 버리고 순수한 Python으로 모든 것을 할 수 있다.2(피톤 + Excel 오버레이)보다 1개의 코드 베이스(피톤)를 유지하는 것이 훨씬 쉽습니다.

데이터를 Excel로 출력해야 한다면 Python에는 이를 위한 훌륭한 툴도 있습니다.그게 더 잘 될 것 같으면 연락 주시면 링크를 받을게요.

왜 창이 깜박이고 아무것도 하지 않고 사라지는지 궁금할 때 Python 스크립트는 VBA에서 shell 명령을 호출한 후 수행해야 할 작업입니다.내 프로그램에서

Sub runpython()

Dim Ret_Val
args = """F:\my folder\helloworld.py"""
Ret_Val = Shell("C:\Users\username\AppData\Local\Programs\Python\Python36\python.exe " & " " & args, vbNormalFocus)
If Ret_Val = 0 Then
   MsgBox "Couldn't run python script!", vbOKOnly
End If
End Sub

args = "F:\my folder\helloworld.py" 행에서 세 개의 따옴표를 사용해야만 작동합니다.args = "F:\my folder\helloworld.py"과 같은 일반 따옴표만 사용하면 프로그램이 작동하지 않습니다.그 이유는 경로(내 폴더)에 공간이 있기 때문입니다.경로에 공백이 있는 경우 VBA에서는 세 개의 따옴표를 사용해야 합니다.

이 코드는 동작합니다.

 your_path= ActiveWorkbook.Path & "\your_python_file.py" 
 Shell "RunDll32.Exe Url.Dll,FileProtocolHandler " & your_path, vbNormalFocus 

액티브 워크북경로는 워크북의 현재 디렉터리를 반환합니다.shell 명령어는 Windows 쉘을 통해 파일을 엽니다.

또한 ExcelPython을 사용해 볼 수 있습니다.ExcelPython은 Python 오브젝트와 VBA로부터의 호출 코드를 조작할 수 있습니다.

이것을 시험해 보세요.

retVal = Shell("python.exe <full path to your python script>", vbNormalFocus)

<full path to your python script> ''」를 해 주세요.

창이 깜박이고 아무 일도 하지 않고 사라지는 이유를 궁금해 하는 사람들에게 이 문제는 Python 스크립트의 RETAL 경로와 관련이 있을 수 있습니다. 예를 들어 "를 사용하셨습니다.\." Python 스크립트와 Excel Workbook이 같은 디렉토리에 있어도 Current Directory는 다를 수 있습니다.절대 경로로 변경하기 위해 코드를 수정하지 않을 경우.python 스크립트를 실행하기 전에 현재 Excel 디렉토리를 변경하기만 하면 됩니다.

ChDir ActiveWorkbook.Path

예를 들어 보겠습니다.플래시가 표시될 경우 가장 먼저 확인해야 할 문제의 1개는 Current Working Directory입니다.

ChDir "가 저의 해결책이었습니다.WORD의 vba를 사용하여 python3 스크립트를 실행합니다.

저 같은 경우에는 ms 액세스 문서와는 다른 디렉토리에 스크립트를 가지고 있고, 그 스크립트에서는 다른 스크립트에서 변수를 Import하기 때문에 먼저 디렉토리를 변경해야 합니다.그러면 셸 기능을 올바르게 사용할 수 있습니다.

   ChDir "C:\Users\directory_where_the_script_is"
   Call Shell("C:\Users\...\python.exe " & "your_script_name.py", 1)

RetVal = Shell(" & ActiveWorkBook)이 작동하지 않습니다.경로 & "< python script name >"

저에겐 다음과 같습니다.

RetVal = 셸("python3" & " & " C:\a\b\c\xyz.py")

위의 답변에는 치명적인 문제가 있다고 생각합니다.

후 " " "cmd이치노출력이 예상과 다를 경우 디버깅 정보가 전혀 없습니다. 나는 더 좋은 , 그 cmd창이 열린 채로 모든 정보가 표시됩니다(printpython) 및error log.

코드:

  Sub RunPythonScript()
        cwd = ActiveWorkbook.Path 'current working directory
        workbookName = ActiveWorkbook.Name
        pythonScriptName = "main.py"
        workbookNameWithPath = cwd & "\" & workbookName
        pythonScriptNameWithPath = cwd & "\" & pythonScriptName
        pythonExePath = "C:\Users\USERNAME\AppData\Local\Programs\Python\Python39\python.exe" ' change path as output of "where python"    
        
Shell "cmd.exe /k """"" & pythonExePath & """ """ & pythonScriptNameWithPath & """""", vbNormalFocus
    End Sub

다른 사용자가 이 문제에 직면했을 경우 스크립트에 상대 경로 참조가 포함되어 있지 않은지 확인하십시오.VBA에서 실행할 경우 이 참조가 작동하지 않습니다.

언급URL : https://stackoverflow.com/questions/18135551/how-to-call-python-script-on-excel-vba

반응형