I'm trying to run a python script from my VBA module. I've tried pretty much every example I've seen on the internet and so for have had no luck. In the VBA module I also run a .bat file, and it works perfectly:
batchname = "U:\Backup Bat File.bat"
Shell batchname, vbNormalFocus
Next I need to run the python script, which is located in the same folder as the excel file. Right now I'm trying out this:
Dim Ret_Val
Dim args
args=Activeworkbook.Path & "\beps_output.py"
Ret_Val = Shell("C:\python34\python.exe" & args, vbNormalFocus)
It doesn't error out, but nothing happens. I'm a little confused at what the "Ret_Val" (return value?) does here, and why it isn't running.
Within the provided space, first initialize the macro using Sub link_python_excel() . This tells Excel VBA (Excel's programming language) that you are about to write a macro called 'link_python_excel'. Next, declare your macro as an object, and your Python executable and Python script as strings.
A python library called xlwings allows you to call Python scripts through VBA and pass data between the two.
PyXLL is an Excel add-in that enables you to run Python in Excel. Use Microsoft Excel as a user friendly front-end to your Python code. No VBA, just Python!
This is running on my PC (Win 7 x64, python 2.7.9):
Sub runpython()
Dim Ret_Val
Dim args As String
args = "W:\programming\python\other_py\sqrt.py"
Ret_Val = Shell("C:\Program Files (x86)\python27\python.exe" & " " & args, vbNormalFocus)
If Ret_Val = 0 Then
MsgBox "Couldn't run python script!", vbOKOnly
End If
End Sub
Ret_Val
will be non-zero if the call succeeds, namely the processID of the launched command. Note that the command will run asynchronuously i.e. the VBA code will continue faster than the external command will terminate.
Try adding a space between exe program and file:
Ret_Val = Shell("C:\python34\python.exe " & args, vbNormalFocus)
Also, because Shell is a function that returns a value (variant type - double) with specified arguments, the returned value can be contained in a variable, here as you specify with Ret_Val. You can then add conditional logic and error handling using this value.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With