2015-01-23 12 views
1

Я использую следующий код для запуска макроса Excel из Python:Запуск первенствовать макрос из питона

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!') 

Я, кажется, быть имеет определенную проблему с этим, после выполнения этого, я иду, чтобы открыть любой первенствует файл и я получаю только серое окно:

enter image description here

любая идея, почему это происходит? Также как добавить в код что-то, чтобы просто открыть файл в Excel? (не получать информацию, а просто открыть этот файл в Excel)

Вопрос: Как мне заставить это не закрывать все открытые файлы Excel?

EDIT: Я только что проверил макрос, и это работает нормально, проблема, похоже, возникает только с момента запуска кода.

NEW EDIT:

Это код из макроса:

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 

ответ

3

Я имел это на Баунти в течение почти недели, и я действительно дон знаю, сколько людей имели этот вопрос раньше. После разрыва моих волос в течение недели и, рассматривая несколько раз, чтобы выскочить из окна офиса, я понял, в чем проблема.

проблема Thee не в питона (вроде), но в основном на коде VBA, я просто добавил

Application.ScreenUpdating = True 

В самом конце и проблема остановилась. Не уверен, что ошибка excel не обновляется при выполнении макроса или ошибка python, не позволяющая экрану обновляться после завершения макроса. Однако после этого все хорошо.

Спасибо!

0

Вы должны установить видимость Истина после отправки:

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

Кроме того, называя макрос не нужен ThisWorkbook:

xl.Application.Run("LoopFilesInFolder") 

Чтобы иметь возможность закрыть книгу снова, вам нужно присвоить его переменной:

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 

Запуск макроса еще не реализована, но для этого есть issue. В то же время, вы можете обойти это, выполнив (следуя сверху):

wb.xl_app.Run("macro_name") 
+0

Привет! Я попытался добавить 'xl.Application.Visible = True', и я продолжаю сталкиваться с той же проблемой. Чтобы избавиться от серого экрана, мне нужно запустить еще один макрос, и он будет выглядеть нормальным снова. Есть предположения? – rodrigocf

+0

Можете ли вы опубликовать полный образец кода в gist (https://gist.github.com/)? –

+0

На самом деле я не могу опубликовать весь код, но я добавил все свои импорт и код из макроса, если я запускаю только код выше, я получаю такое же поведение. – rodrigocf

Смежные вопросы