我试图通过在VBA宏中调用脚本来从Excel运行一个简单的Python脚本。每当我从Spyder运行脚本时,它就会完美执行。但是,当我使用VBA从Excel调用脚本时,它将失败。仅当我将Numpy或Pandas(我尚未尝试其他库)导入脚本时,才会发生这种情况。
调用脚本的VBA宏在这里:
Sub RunPythonScript2()
'Declare our variables
Dim RetVal As String
Dim exe As String
Dim python As String
Dim paths As String
exe = "C:\Users\myname\Anaconda3\pythonw.exe"
python = "C:\Users\myname\OneDrive\Reference Documents\Python\Excel and Python\03 Script.py"
paths = """" & exe & """" & " " & """" & python & """"
RetVal = Shell(paths, vbNormalFocus)
End Sub
有效的Python脚本在这里:
import win32com.client
excelapp = win32com.client.Dispatch("Excel.Application")
wb = excelapp.Workbooks(1)
sht = wb.Worksheets(1)
sht.Range('A1').Value = "Hello World "
到目前为止,一切都很好。但是,如果添加了将Numpy或Pandas导入python脚本的语句,那么我将无法再从Excel中成功调用该脚本。但是,我可以从Spyder运行脚本并产生预期的结果。
我最初叫python.exe
,但是当我使用时:
import sys
print(sys.executable)
我看到Spyder正在呼叫pythonw.exe
。我叫python.exe
还是pythonw.exe
似乎都没关系。
导入Numpy并运行脚本时,我没有收到任何错误消息。结果是没有任何内容打印到Excel。
我在Windows 10(64位)上使用以下软件包版本
我希望能够在Excel中打印如下内容:
sht.Range('A1').Value = np.pi
编辑-------------------------------------
我还确认这与Numpy有关。我可以在Python代码中import sys
毫无问题,但是Numpy和Pandas仍然有问题。
其他人已经成功地运行了此代码,因此我怀疑它一定是某种与环境相关的问题。但是,我真的不知道如何管理我的环境。
有关示例,请参见此youtube视频和评论: https://www.youtube.com/watch?v=oVNeufjrx8M&list=PLcFcktZ0wnNnf4eh5ObzPzoLFOzTiFVKa&index=6&t=0s
我尝试全新安装Anaconda,但仍然遇到问题。这是conda info
返回的结果:
active environment : base
active env location : C:\Users\<user>\AppData\Local\Continuum\anaconda3
shell level : 1
user config file : C:\Users\<user>\.condarc
populated config files : C:\Users\<user>\.condarc
conda version : 4.6.14
conda-build version : 3.17.8
python version : 3.7.3.final.0
base environment : C:\Users\<user>\AppData\Local\Continuum\anaconda3 (writable)
channel URLs : https://repo.anaconda.com/pkgs/main/win-64
https://repo.anaconda.com/pkgs/main/noarch
https://repo.anaconda.com/pkgs/free/win-64
https://repo.anaconda.com/pkgs/free/noarch
https://repo.anaconda.com/pkgs/r/win-64
https://repo.anaconda.com/pkgs/r/noarch
https://repo.anaconda.com/pkgs/msys2/win-64
https://repo.anaconda.com/pkgs/msys2/noarch
package cache : C:\Users\<user>\AppData\Local\Continuum\anaconda3\pkgs
C:\Users\<user>\.conda\pkgs
C:\Users\<user>\AppData\Local\conda\conda\pkgs
envs directories : C:\Users\<user>\AppData\Local\Continuum\anaconda3\envs
C:\Users\<user>\.conda\envs
C:\Users\<user>\AppData\Local\conda\conda\envs
platform : win-64
user-agent : conda/4.6.14 requests/2.21.0 CPython/3.7.3 Windows/10 Windows/10.0.14393
administrator : False
netrc file : None
offline mode : False
我在家里的计算机上和在工作中的计算机上都发生了同样的问题。
答案 0 :(得分:0)
好的,让我们逐步了解一下我们需要对您的代码进行的一些更改。我认为问题出在以下事实:当您引用Workbooks集合时,您使用的是index方法,而key方法却是。如果您有个人的Macro Workbook,这可能会给您带来麻烦。
以打开工作簿的顺序确定索引,并且首先<始终>始终打开“个人宏工作簿”。这通常会带来意想不到的后果,因此我告诉人们只使用工作簿的名称。更改以下内容:
旧:
wb = excelapp.Workbooks(1)
新功能:
wb = excelapp.Workbooks("myWorkbook.xlsm")
此外,我认为如果我们删除一些引号,它应该可以正常工作。我重写了每一行,使之用三引号引起来。
旧:
exe = "C:\Users\myname\Anaconda3\pythonw.exe"
python = "C:\Users\myname\OneDrive\Reference Documents\Python\Excel and Python\03 Script.py"
paths = """" & exe & """" & " " & """" & python & """"
新功能:
Set objShell = VBA.CreateObject("Wscript.Shell")
exe = """C:\Users\<USER>\Anaconda3\pythonw.exe"""
python = """C:\Users\<USER>\OneDrive\myScript.py"""
objShell.Run exe & python
尝试一下,看看会得到什么。
答案 1 :(得分:0)
事实证明这是一个复杂的问题。我终于想出了直接从Windows命令提示符运行脚本的方法。我收到了此处描述的预期错误:
https://superuser.com/questions/1413313/importerror-missing-required-dependencies-numpy
但是,更改路径变量并没有帮助。我没有尝试创建或更改环境。如果要从Windows命令提示符下检查路径变量,请首先键入 do {
// Activities
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let result = try decoder.decode(Root.self, from: data)
self.activities = result.activities
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch {
print("Error serializing json: ", error)
}
,按Enter,然后键入override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return activities.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ActivityCell", for: indexPath) as! MainTableViewCell
let activity = activities[indexPath.row]
// assign the activity data to the UI for example
// cell.someLabel = activity.amount
return cell
}
。
最终有效的解决方案是此解决方案。我不得不将Anaconda版本重置为5.2.0版。
现在,经过几天的研究,我终于可以从Excel中正确使用Python。向前和向上。