我已经阅读了几个线程,发现我可以使用Shell从VBA调用Python。
这就是我所拥有的:
Private Sub CommandButton1_Click()
Ret_Val = Shell("C:\Users\....\Anaconda3\python.exe C:\Users\...\REL.py", vbNormalFocus)
If Ret_Val <> 0 Then
MsgBox "ok!", vbOKOnly
End If
End Sub
我收到确认消息,并在一秒钟内打开和关闭一个窗口。所以我猜它是启动Python但脚本不起作用。
所以我认为这可能不起作用,因为我在spyder中编写了代码,我可能需要启动spyder:
Ret_Val = Shell("C:\Users\...\Anaconda3\Scripts\spyder.exe C:\Users\...\REL.py", vbNormalFocus)
这将打开Spyder,这需要花费太多时间而且不是我想要的。一旦打开它,它就不会启动脚本。
有些问题,但我不确定是否是由于VBA代码或与脚本相关的其他内容。当我从没有VBA的Spyder运行它时,脚本可以工作。
这是Python代码的一个简单示例:
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 21 08:24:05 2017
@author: xxxxxx
"""
import pandas as pd
import numpy as np
import datetime
RW = pd.read_excel('Raw_data.xlsx', skipinitialspace=True)
RW=pd.DataFrame(RW, columns = ['Task Id', 'TIDmodRW', 'Start Date', 'End Date', 'Machine', 'Boards'])
writerRW = pd.ExcelWriter('RW_test2.xlsx', engine='xlsxwriter')
RW.to_excel(writerRW, sheet_name='sheet1')
writerRW.save()
答案 0 :(得分:1)
考虑使用内置的os
模块path.dirname()
来自动检测python脚本的当前路径,以找到输入的Excel文件(假设工作簿位于同一目录中)。 py脚本)。然后,使用与操作系统无关的path.join()
将每个文件字符串与其连接以进行完整目录引用。此方法不需要反斜杠(即Windows)或正斜杠(即Linux / Mac),因此应该跨操作系统工作。
现在,无论Excel文件和Python文件驻留在哪个文件夹中,或者包括Spyder,VBA或命令行在内的调用方法,脚本都应该完全读取和写入本地工作簿。
import os # ADD IMPORT
import pandas as pd
import numpy as np
import datetime
cd = os.path.dirname(os.path.abspath(__file__)) # LOCATE CURRENT DIR
# CONCATENATE CURRENT DIRECTORY TO EXCEL BASE FILE NAME
RW = pd.read_excel(os.path.join(cd, 'Raw_data.xlsx'), skipinitialspace=True)
RW = pd.DataFrame(RW, columns = ['Task Id', 'TIDmodRW', 'Start Date',
'End Date', 'Machine', 'Boards'])
writerRW = pd.ExcelWriter(os.path.join(cd, 'RW_test2.xlsx'), engine='xlsxwriter')
RW.to_excel(writerRW, sheet_name='sheet1')
writerRW.save()