从python运行excelmacros

我正在使用以下代码从Python运行Excelmacros:

import pymysql import datetime import csv import math import os import glob import sys import win32com.client import numpy from tkinter import * from tkinter import ttk import tkinter.messagebox def run_macro(): print('macro') #this if is here because if an executable is created, __file__ doesn't work if getattr(sys, 'frozen', False): name = (os.path.dirname(sys.executable) + '\\Forecast template.xlsm') else: name = str(os.path.dirname(os.path.realpath(__file__)) + '\\Forecast template.xlsm') print(name) #this part runs the macro from excel if os.path.exists(name): xl=win32com.client.Dispatch("Excel.Application") xl.Workbooks.Open(Filename=name, ReadOnly=1) xl.Application.Run("ThisWorkbook.LoopFilesInFolder") xl.Application.Quit() # Comment this out if your excel script closes del xl print('File refreshed!') 

我似乎是有这个问题,运行后,我去打开任何Excel文件,我只得到一个灰色的窗口:

在这里输入图像说明

任何想法为什么发生这种情况? 另外我如何添加到代码的东西,只需在Excel中打开一个文件? (不要获取这些信息,而只需要在Excel中打开该文件)

额外的问题:我怎么得到这个不closures所有打开的Excel文件?

编辑 :我只是检查了macros,并且工作得很好,问题似乎来自当我运行的代码。

新编辑:

这是macros的代码:

 Sub LoopFilesInFolder() Dim wb1 As Workbook Dim wb2 As Workbook Dim path As String Dim file As String Dim extension As String Dim myFileName As String Application.ScreenUpdating = False Application.DisplayAlerts = False Set wb1 = ActiveWorkbook path = ActiveWorkbook.path & "\csvs\" extension = "*.csv" file = Dir(path & extension) Do While file <> "" Set wb2 = Workbooks.Open(Filename:=path & file) wb2.Activate 'this section is for the avail heads file, basically it just opens it and copies the info to the template If wb2.Name = "avail_heads.csv" Then Range("A1").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy wb1.Activate Worksheets("raw data").Range("B88").PasteSpecial xlPasteValues End If 'this section is for the forecast file, basically it just opens it and copies the info to the template If wb2.Name = "forecast.csv" Then Range("A1").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy wb1.Activate Worksheets("raw data").Range("B74").PasteSpecial xlPasteValues End If 'this section is for the income file, basically it just opens it and copies the info to the template If wb2.Name = "income volume.csv" Then Range("A1").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy wb1.Activate Worksheets("raw data").Range("B3").PasteSpecial xlPasteValues End If 'this section is for the outgoing volume file, basically it just opens it and copies the info to the template If wb2.Name = "outgoing_volume.csv" Then Range("A1").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy wb1.Activate Worksheets("raw data").Range("B36").PasteSpecial xlPasteValues End If 'this section is for the required heads file, basically it just opens it and copies the info to the template If wb2.Name = "required_heads.csv" Then Range("A1").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy wb1.Activate Worksheets("raw data").Range("B102").PasteSpecial xlPasteValues End If wb2.Close file = Dir Loop 'myFileName = ActiveWorkbook.path & "\forecast_for_w" & Format(Now, "ww") + 1 myFileName = ActiveWorkbook.path & "\yoda_forecast" ActiveWorkbook.SaveAs Filename:=myFileName, FileFormat:=xlWorkbookNormal 'MsgBox "Done!" Application.DisplayAlerts = True End Sub 

我已经有了这个奖金差不多一个星期了,我真的不知道有多less人有过这个问题。 我把头发拉出一个多星期后,考虑多次跳出办公室的窗户,我觉得是什么问题。

你的问题是不是在Python(有点),但大部分在VBA代码,我刚刚添加

 Application.ScreenUpdating = True 

最后,问题停止了。 不知道,如果一个Excelmacros未完成时更新错误,或者一旦macros完成后不允许更新屏幕的Python错误。 但是,现在一切都好了。

谢谢!!

分派后需要将可见性设置为True:

 xl = win32com.client.Dispatch("Excel.Application") xl.Application.Visible = True 

而且,调用macros应该不需要ThisWorkbook

 xl.Application.Run("LoopFilesInFolder") 

要能够再次closures工作簿,您需要将其分配给一个variables:

 wb = xl.Workbooks.Open(Filename=name, ReadOnly=1) wb.Close(SaveChanges=False) 

我编写了xlwings包,以使事情变得更简单:

 from xlwings import Workbook, Range wb = Workbook(r'C:\path\to\workbook.xlsx') # open a workbook if not open yet Range('A1').value = 123 # Write a value to cell A1 wb.close() # close the workbook again 

运行macros还没有实现,但有一个问题可以打开。 与此同时,你可以通过这个方法解决这个问题(从上面开始):

 wb.xl_app.Run("macro_name")