Annuler l'événement proche d'Excel en utilisant python et win32com

Actuellement, j'essaie d'annuler l'événement proche d'Excel en utilisant Python et Win32com. J'ai déjà réussi à résoudre ce problème avec IronPython il y a un mois. Mais pour d'autres raisons du département de mes entresockets, cela devrait également être possible avec Python. Suivi vous verrez deux extraits. Le premier contiendra le code IronPython actif

import clr clr.AddReference("Microsoft.Office.Interop.Excel") clr.AddReference("System.Windows.Forms") from Microsoft.Office.Interop import Excel from System.Windows.Forms import Form, Application, MessageBox, MessageBoxButtons, MessageBoxIcon, DialogResult class CloseEventTry(Form): def __init__(self): excel = Excel.ApplicationClass() excel.Visible = True excel.DisplayAlerts = False self.workbooks = excel.Workbooks.Add() self.Text = "Dummy GUI Window" #link "BeforeCloseEvent" to the "beforeClose" method self.workbooks.BeforeClose +=Excel.WorkbookEvents_BeforeCloseEventHandler(self.beforeClose) def beforeClose(self, cancel): print type(cancel) #Type: 'StrongBox[bool] choice = MessageBox.Show("Close Excel", "Close", MessageBoxButtons.YesNo, MessageBoxIcon.Information) if choice == DialogResult.Yes: cancel.Value = False #do't cancel the close action self.Close() elif choice == DialogResult.No: cancel.Value = True #prevent excel from closing Application.Run(CloseEventTry()) 

La seconde contiendra la version avec Python et Win32com. Celui-ci est basé sur mon extrait IronPython et l'exemple de ce lien

Events in Microsoft Word and Excel

 import clr clr.AddReference("System.Windows.Forms") from System.Windows.Forms import Form, Application, MessageBox, MessageBoxButtons, MessageBoxIcon, DialogResult import win32com.client as win32 #workbook event handler class. Needed according to this example https://win32com.goermezer.de/microsoft/office/events-in-microsoft-word-and-excel.html class WorkBookEvents(object): def OnBeforeClose(self, cancel): print(type(cancel)) #Type: class 'bool' choice = MessageBox.Show("Close Excel", "Close", MessageBoxButtons.YesNo, MessageBoxIcon.Information) if choice == DialogResult.Yes: #do't cancel the close action => raises AtsortingbuteError: 'bool' object has no atsortingbute 'Value' Exception cancel.Value = False self.Close() elif choice == DialogResult.No: #prevent excel from closing => raises AtsortingbuteError: 'bool' object has no atsortingbute 'Value' Exception cancel.Value = True class CloseEventTry(Form): def __init__(self): excel = win32.DispatchEx('Excel.Application') excel.Visible = True # makes the Excel application visible to the user excel.DisplayAlerts = False self.Text = "Dummy GUI Window" self.workbooks = excel.Workbooks.Add() #define event handler according to this example https://win32com.goermezer.de/microsoft/office/events-in-microsoft-word-and-excel.html self.workbooks = win32.DispatchWithEvents(self.workbooks, WorkBookEvents) Application.Run(CloseEventTry()) 

Comme vous verrez, je pourrais me connecter à l'événement "OnBeforeClose", mais je ne peux pas annuler l'événement close comme je l'ai fait avec la version IronPython. Comme mentionné dans le dernier commentaire de l'extrait de code, la version Python soulève une exception AtsortingbuteError. En outre, vous pouvez également voir que les types de la variable "annuler" nécessaire des gestionnaires d'events ont deux types différents. Dans la version IronPython, il s'agit d'un "StrongBox [bool]". D'autre part, le type de la version de Python est un type "bool" de class "courant" (ce qui explique l'exception). De cette façon, j'ai essayé de simplement taper

 cancel = True #prevent excel from closing 

Mais en utilisant cette façon, excel se ferme de toute façon. J'ai également fait des searchs mais je n'ai pas pu find une solution pour ce problème. Ma supposition est qu'il existe une sorte d'emballage nécessaire?

Open Spreadsheet Partage de tableaux Microsoft Excel VBA Formulas et Excel Charts Tips.