Передайте переменную от python до vba - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь преобразовать некоторые документы .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

Также он работает нормально при запуске из python с аддоном win32. Проблема возникает, когда я пытаюсь определить переменную и передать ее в 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

Я нашел этот поток с почти тот же вопрос, но я получаю ошибку:

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)

что я делаю не так?

1 Ответ

0 голосов
/ 25 апреля 2020

Вам может потребоваться изменить функцию 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...