2017-07-31 146 views
11

我有一个包含宏的excel文件(Main.xlsm)。我有一个python文件(python.py)来生成一个辅助excel文件(sub.xlsx),我将在Main.xlsm文件的宏中进一步调用它。这个由运行python.py生成的sub.xlsx文件保存在同一个工作目录中。有没有办法在Excel-VBA中调用python代码?

现在我想让这个python.py在运行Main.xlsm宏时执行,然后使用这个xlsx文件。我基本上想要减少外部执行python.py的步骤。有没有一个命令?我是VBA新手。

+1

然后留新(以及远离)VBA :)我希望你你找到你需要的东西。有趣的问题。 –

+0

@ Jean-FrançoisFabre感谢您对这个问题的兴趣。 :从我的角度来看,p –

+0

(也适用于其他专有和繁琐的系统),有时最好1)将数据导出为CSV 2)运行python脚本以便轻松处理数据3)重新导入为excel /无论如何我们也使用这个技巧,而不是试图在子语言中编码:) –

回答

12

最简单的方法是用Shell命令运行Python解释器

Shell ("python.exe " & yourScript & " " & arguments) 
+0

感谢您的回复@Uri。但是一个小问题是它是用于Python还是用于VBA的命令? 我需要在VBA中执行它。 –

+0

这是一个VBA命令 –

+0

@UriGoren根据这个上下文,你的标签是Main.xlsm? –

9

是的,有。我最喜欢的做法是通过xlwings(https://www.xlwings.org/),但还有其他几个选项。 XlWings非常棒,因为它免费,开放源代码且易于使用,并且具有出色的文档。虽然有一些功能限制,所以你必须检查它是否符合你的需求。

+0

好主意,有一个upvote。 XlWings不是在一个线程中工作吗? – Bathsheba

+0

据我所知,它确实是单线程的 – Gabor

+0

伟大的加载项!不知道这个,谢谢!有(其他)upvote。 –

3

有多种方式TU运行使用VBA取决于你是否需要等待执行结束,知道一个python脚本如果它没有错误。

随着Shell,异步与控制台:

Public Sub RunPython(file As String, ParamArray args()) 
    Shell "python.exe """ & file & """ " & Join(args, " ") 
End Sub 

随着Shell,同步而不控制台:

Public Function RunPython(file As String, ParamArray args()) 
    Shell "pythonw.exe """ & file & """ " & Join(args, " ") 
End Function 

随着WScript.Shell,同步而不控制台和与退出代码:

Public Function RunPython(file As String, ParamArray args()) As Long 
    Dim obj As Object 
    Set obj = CreateObject("WScript.Shell") 
    RunPython = obj.Run("pythonw.exe """ & file & """ " & Join(args, " "), 0, True) 
End Function 
相关问题