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

  • VBA macro utilisant countif avec trois colonnes
  • Comment fonctionne First.Cells (i, 1)?
  • Ajouter deux cellules dans la fonction personnalisée sans parameters
  • Dictionnaire Excel VBA Enregistrement et Récupération
  • VBA tente de faire correspondre une string complète à une string partielle pour searchr la valeur correspondante
  • Puis-je avoir une formule excel faire reference à une cellule d'une autre formule?
  • 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?

  • Comparer 2 colonnes dans excel
  • Changer la couleur d'arrière-plan d'une cellule si ce n'est entre deux valeurs et non vierges
  • Excel Interop obtient la largeur en pixels de text à l'intérieur de la cellule
  • Création d'inputs de lignes séparées pour les champs à valeurs multiples
  • Adresse de la première couche de cellules précédentes via VBA dans Excel
  • Trouvez la valeur minimale dans le groupe et ne countz pas 0s en tant que valeurs s'il existe d'autres valeurs également dans le même groupe dans Excel
  • Open Spreadsheet Partage de tableaux Microsoft Excel VBA Formulas et Excel Charts Tips.