通过VBA运行Python脚本并提供活动工作簿的名称和路径?

时间:2016-11-17 14:51:49

标签: python excel vba excel-vba

编辑:这是同样的问题,但我重写了它,所以它更清晰。

我已经尝试过这篇文章:How to call python script on excel vba?

这篇文章:Run and execute a python script from VBA

这篇文章:How can I call python program from VBA?

但是没有一个答案适合我,我不知道我做错了什么。问题1:我想从VBA excel运行pythonscript。 excel文件没有主页(可以在任何桌面上)。我希望使用的代码:

 Dim Ret_Val
 Ret_Val = Shell("C:\python27\python.exe \\10.31.13.22\SharedDocs\3 - Technical\13 - Reports & Templates\13 - Description\DescriptionToDatabase.py")

pythonfile在服务器上始终具有相同的路径。我在这里看不到扫管笏是错的?我得到的只是一个黑色的蟒蛇屏幕。

在python文件中,我调用工作簿和正确的工作表:

book = xlrd.open_workbook("//10.31.13.22/SharedDocs/3 - Technical/1 - Projects/0 - Internal/RPA 138 - Engineering software/testchipdescription/upload to database/testchipdescription-template-10-11.xltm")
sheet = book.sheet_by_name("Database")

目前excel工作簿路径在python中是硬编码的。这将带我回到问题2:我可以将excel工作簿的名称和路径以某种方式传递给我的pythonscript吗?

编辑:

我在命令提示符下尝试了shell()代码。 与VBA相同:

"C:\python27\python.exe \\10.31.13.22\SharedDocs\3 - Technical\13 - Reports & Templates\13 - Description\DescriptionToDatabase.py"

它不起作用。 '系统无法找到指定的路径'。

我试过这个:

C:\python27\python.exe "\\10.31.13.22\SharedDocs\3 - Technical\13 - Reports & Templates\13 - Description\DescriptionToDatabase.py"

它有效!所以cmd需要""处理路径中的空格。但是我不能在VBA中添加它们,因为我不能放置2""否则就是错误。

2 个答案:

答案 0 :(得分:1)

是的,我找到了问题1的解决方案:

Dim excelToPython As String
excelToPython = """C:\python27\python.exe"" ""\\10.31.13.22\SharedDocs\3 - Technical\13 - Reports & Templates\13 - Description\DescriptionToDatabase.py"""
Debug.Print excelToPython
Call Shell(excelToPython)

感谢'Allan Browne'(https://bytes.com/topic/access/answers/520558-problem-shell-space-file-name

编辑:

最后,我找到了问题2的解决方法。我仍然没有真正的解决方案,使用shell命令将活动工作簿的名称和路径提供给我的python脚本。

但是我将活动工作簿的路径和名称写在与我的python脚本相同的文件夹中的txtfile中。然后我用pythonscript et voila获取这些信息..它有效!嗯,它做我想要的,但它不是一个干净的解决方案。如果有人知道正确的解决方案,请随时分享:o)

我的解决方案解决方案:

vba-excel中的代码:

'via pythonscript'

Dim excelToPython As String
Dim myFileTxt As String
Dim fileTxtPath As String

'first give the name and path of active workbook to a txtfile in the same folder as ThemeColor pythonscript'

fileTxtPath = "\\10.31.13.22\SharedDocs\3 - Technical\13 - Reports & Templates\13 - Description\actWBdb.txt"

myFile = FreeFile

Open fileTxtPath For Output As myFile

nameWB = ActiveWorkbook.name
pathWB = ActiveWorkbook.path

Print #myFile, nameWB
Print #myFile, pathWB

Close myFile

'run the python file'
 excelToPython = """C:\python27\python.exe"" ""\\10.31.13.22\SharedDocs\3 - Technical\13 - Reports & Templates\13 - Description\DescriptionToDatabase.py"""

Call Shell(excelToPython)

python中的代码:

filepath ='//10.31.13.22/SharedDocs/3 - Technical/13 - Reports & Templates/13 - Description/actWBdb.txt'
lines =  open(filepath).read().splitlines()
nameWorkbook = lines[0]
pathWorkbook = lines[1]

book = xlrd.open_workbook(pathWorkbook + '/' + nameWorkbook)
sheet = book.sheet_by_name("Database")

答案 1 :(得分:0)

  

我想知道是否可以将活动excel工作簿的名称和路径提供给我从此活动工作簿调用的python脚本?

是。 You can pass argument(s) to SHELL function from VBA,然后你需要修改你的python脚本来接受参数,并用它/它们做一些事情。

Python Read from Stdin with Arguments

Python read from command line arguments or stdin