关于这个问题,我的第一个问题因为不够具体而被关闭了,所以我将试着告诉你我迄今为止所做的哪些尝试没有奏效。我正在尝试使用Office 365将Excel 2010工作簿移动到我的新Mac mini Big Sur机器上。这是我的第一台Mac电脑,因此我对操作系统以及与微软世界的差异非常陌生。这也是我第一次使用Office 365。我希望你能帮助我。在我的VBA宏中,我运行Python脚本来抓取网页中的数据。通常我会让Python脚本创建一个.csv文件,然后在VBA宏中打开该文件以读取和填充工作簿中必要的单元格。这是我在PC版本中用来调用Python脚本的代码:
Kill strFileOfData
Set objWsh = VBA.CreateObject("WScript.shell")
strPython = """C:\Users\Phil\AppData\Local\Programs\Python\Python37-32\python.exe"""
strPyScript = """C:\Users\Phil\Documents\PyScripts\GetMarketsStks1-0.py"""
objWsh.Run strPython & strPyScript
Err = 0
Do Until Dir(StrFileOfData) <> 0
Application.Wait (Now() + TimeValue("0:00:01"))
Loop
它可能不是最好的,但在PC上工作可靠。我先删除数据文件,运行Python脚本,等待创建数据文件,然后继续。 我在Mac上安装了最新版本的Python,重写了Python脚本以获取更多数据,并在终端上运行Python脚本以确保它正确执行。它运行良好,正确创建了.csv文件。 然后,我更改了VBA宏中的代码,以考虑不同的文件结构。这是新代码:
Kill strFileOfData
Set objWsh = VBA.CreateObject("WScript.shell")
strPython = """/Library/Frameworks/Python.framework/Python"""
strPyScript = """/Users/minime/MyDocuments/Finance/GetHistory1-0.py"""
objWsh.Run strPython & strPyScript
Err = 0
Do Until Dir(StrFileOfData) <> 0
Application.Wait (Now() + TimeValue("0:00:01"))
Loop
当我在Mac上运行时,我得到:
Run-Time error '429': ActiveX component can't create object
我怀疑这是shell创建和使用方式的不同,于是开始研究如何在Mac上从Excel调用Python。在经历了相当多的死胡同后,我发现了这条4年前的线索: How can I launch an external python process from Excel 365 VBA on OSX?
我试着简单地前进,按照指示去做。我学习了一些关于AppleScript的知识,添加了文件夹:“~/Library/Application Scripts/com.microsoft.Excel/”,创建了名为PythonCommand.scpt的AppleScript,并将其放在该文件夹中。因为我在示例中找不到路径,所以我替换了我认为正确的路径,假设这是由于MacOS与4年前的不同。我的AppleScript如下所示:
on PythonCommand(pythonScript)
do shell script "/Library/Frameworks/Python.framework/Python" & pythonScript
end PythonCommand
然后,我将以下代码添加到VBA宏:
strPyScript = """/Users/minime/MyDocuments/Finance/GetHistory1-0.py"""
Dim result As String
result = AppleScriptTask("PythonCommand.scpt", "PythonCommand", strPyScript)
当我运行VBA宏时。我得到了这个信息:
Run-time error '13': Type mismatch
我再次尝试使用单引号而不是三引号,得到了相同的结果。 我试着反向工作,以确保这些部件工作正常。我再次从终端窗口运行Python脚本,没有问题,因此我尝试的下一步是从空闲状态运行AppleScript。我输入了以下内容:
AppleScriptTask("PythonCommand.scpt", "PythonCommand","/Users/minime/MyDocuments/Finance/GetHistory1-0.py")
得到了这个结果:
Traceback (most recent call last): File "<pyshell#0>", line 1, in AppleScriptTask("PythonCommand.scpt", "PythonCommand","/Users/minime/My Documents/Finance/GetHistory1-0.py") NameError: name 'AppleScriptTask' is not defined
经过进一步研究,我在编辑器中尝试了以下应用程序脚本:
do shell script "/Library/Frameworks/Python.framework/Versions/3.9/Python /Users/minime/MyDocuments/Finance/GetHistory1-0.py"
我得到了这个结果:
error "sh: /Library/Frameworks/Python.framework/Versions/3.9/Python: cannot execute binary file" number 126
接下来我尝试了这个:
do shell script "Python /Users/minime/MyDocuments/Finance/GetHistory1-0.py"
得到这个:
error "Traceback (most recent call last):
File \"/Users/philipackermann/MyDocuments/Finance/GetHistory1-0.py\", line 2, in <module>
from urllib.request import urlopen
ImportError: No module named request" number 1
这实际上可能是一些进步!那个import语句是我的Python脚本中的第一行代码,但我不知道为什么这比上次的尝试更深入,为什么它的运行方式与终端中Python脚本的执行方式不同。 但我刚刚注意到在终端我进入了Python3,所以我尝试了以下方法:
do shell script "Python3 /Users/minime/MyDocuments/Finance/GetHistory1-0.py"
在阅读了更多关于终端的内容后,我意识到Mac上有隐藏的文件,所以我尝试了以下AppleScript:
do shell script "/usr/local/bin/Python3 /Users/minime/MyDocuments/Finance/GetHistory1-0.py"
成功了!!已成功创建.csv文件。现在我需要弄清楚如何从Excel调用它。我在这里找到一篇文章:
https://stackoverflow.com/questions/38723420/how-to-simply-run-an-applescript-task-from-mac-excel-2016
这确实有效。我将AppleScript转换为一个应用程序(刚刚将扩展名从scpt更改为app),并将其移动到Applications文件夹,然后将此代码放入VBA宏:
ThisWorkbook.FollowHyperlink Address:="/Applications/RunGetHistory.app", NewWindow:=True
这成功了!当然,它没有传递任何参数或接收任何结果。但是有一个问题,就像我以前的PC版本一样,代码不会等待应用程序完成,所以我需要一种方法来检查它是否完成,因为我更改了Python脚本,在开始时打开文件,并在抓取网页时向其写入行,所以文件会立即创建,所以我在PC v中使用的这段代码版本不足:
Do Until Dir(strFileNmHistory) <> ""
Application.Wait (Now() + TimeValue("0:00:01"))
Loop
我想我可以添加一个单独的文件,写在Python脚本的末尾,只是说它已经完成了,但这是一个相当蹩脚的攻击。所以从技术上讲,我想我可以说我解决了这个问题,可以从Excel运行Python脚本,但我必须相信有更好的方法,我相信这个社区有比我聪明得多的人,他们可以做得更好。有没有人能够从4年前的解决方案中获得成功?这可能会解决参数、结果和等待Python脚本结束的问题。你能提出的任何建议都会很有帮助。我已经对这个问题进行了广泛的研究,一些回答说沙箱正在阻止Excel运行Python,但是如果我们可以运行运行Python脚本的应用程序,我想这会解决问题。如果你能对我在上面遇到的具体错误发表评论,我将尝试不同的方法并报告。 请帮忙。 菲尔
解决了。。。一路上我学到了很多!我将尝试只列出实现这一目标所需的步骤,但我确实倾向于漫无边际,对不起。有一个问题让这比需要的更难:我在AppleScript的“DoShell脚本”语句中缺少了一个空格。以下是适用于我的VBA代码:
以下是AppleScript代码:
注意“Python3”后面的空格。在方便的文件夹中创建AppleScript并将其复制到 “/Users/minime/Library/Application Scripts/com.microsoft.Excel”
尝试在该文件夹中编辑它是有问题的,相信我。把它移到那里。 只要在VBA代码中的AppleScriptTask命令中给出路径,Python脚本就可以在任何地方
确保对.csv文件的所有引用都指向Excel沙盒文件夹。我用了这个,但我怀疑其他人也会用: “/Users/minime/Library/Containers/com.microsoft.Excel/Data/Documents”
如果找不到此文件夹,请参阅下面的注释。这在2021年7月1日起作用!我们将看到当新的OSX问世时会发生什么。对AppleScriptTask的调用将等待Python脚本的完全执行,然后再继续。我还没有找到处理Python脚本中错误的好方法
以下是我在学习过程中学到的一些重要知识,可能对像我这样的第一次使用Mac的用户有所帮助:
相关问题 更多 >
编程相关推荐