Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Run and execute a python script from VBA

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.

like image 650
EmmaV Avatar asked May 29 '15 14:05

EmmaV


People also ask

How do I run a Python script in VBA?

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.

Can you call Python from VBA?

A python library called xlwings allows you to call Python scripts through VBA and pass data between the two.

Can you use Python within Excel?

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!


2 Answers

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.

like image 185
user1016274 Avatar answered Sep 19 '22 10:09

user1016274


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.

like image 30
Parfait Avatar answered Sep 18 '22 10:09

Parfait