VBA - 调用 Python 脚本

VBA - call Python script

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

我确实收到了 OK 消息,并且 window 在一秒钟内打开和关闭。所以我猜它正在启动 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()

考虑使用内置 os 模块的 path.dirname() 自动检测 python 脚本的当前路径以定位输入 Excel 文件(假设工作簿与 .py 脚本位于同一目录中)。然后,使用 OS-agnostic 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()