将变量从python传递到vba

问题描述 投票:0回答:1

我正在尝试将某些.csv文档转换为.xlsx。我用下面显示的VBA代码执行此操作,并且工作正常,但我想将文件文件夹的路径定义为python中的变量并链接到VBA。

Sub CSVtoXLSX()


Dim CSVfolder As String, _
    XlsFolder As String, _
    fname As String, _
    wBook As Workbook

 CSVfolder = "pathcsv"
 XlsFolder = "pathxlsx"

 fname = Dir(CSVfolder & "*.csv")

 Do While fname <> ""
    Set wBook = Workbooks.Open(CSVfolder & fname)
    wBook.SaveAs XlsFolder & Replace(fname, ".csv", ""), xlOpenXMLWorkbook
    wBook.Close False
    fname = Dir
 Loop

End Sub

而且在使用Win32插件从python运行时,它也可以正常运行。当我尝试定义变量并将其传递给VBA时,就会出现问题。

python代码:

import win32com.client
CSVfolder = "csvpath"
XlsFolder = "xlsxpath"

xl=win32com.client.Dispatch("Excel.Application")
xl.Workbooks.Open(Filename = r"macro.xlsm", ReadOnly=1)
xl.Application.Run('CSVtoXLSX', CSVfolder, XlsFolder)
##    xl.Application.Save() # if you want to save then uncomment this line and change delete the ", ReadOnly=1" part from the open function.
xl.Application.Quit() # Comment this out if your excel script closes
del xl

我发现this线程几乎有相同的问题,但出现错误:

Traceback (most recent call last):
  File "C:/Users/.../PycharmProjects/untitled6/exc.py", line 7, in <module>
    xl.Application.Run('CSVtoXLSX', CSVfolder, XLsFolder)
  File "C:\Users\...\AppData\Local\Temp\gen_py\3.8\00020813-0000-0000-C000-000000000046x0x1x9\_Application.py", line 370, in Run
    return self._ApplyTypes_(259, 1, (12, 0), ((12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17)), 'Run', None,Macro
  File "C:\Users\...\AppData\Local\Programs\Python\Python38\lib\site-packages\win32com\client\__init__.py", line 467, in _ApplyTypes_
    self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args),
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147352562), None)

我在做什么错?

python excel-vba
1个回答
0
投票

您可能需要更改vba函数,以接受CSVfolder和Xlsfolder的参数以及在函数主体中指定的默认值。

Sub CSVtoXLSX (Optional CSVfolder As String = "csvpath", Optional Xlsfolder As String = "xlspath")

但是,如果您需要做的只是将csv转换为xlsx,在python中有一种简单的方法。

from pathlib import Path
import pandas as pd


CSVfolder = Path("pathcsv")
XlsFolder = Path("pathxlsx")

for f in CSVfolder.glob("*.csv"):
    df = pd.read_csv(f)
    xlsfn = XlsFolder / f.with_suffix('.xlsx').name
    df.to_excel(xlsfn, index=False)
© www.soinside.com 2019 - 2024. All rights reserved.