VBA - 调用Python脚本

时间:2017-05-01 23:16:13

标签: python vba spyder

我已经阅读了几个线程,发现我可以使用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()

1 个答案:

答案 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()