2016-12-23 1 views
0

Merci d'avance pour votre aide/conseil. J'essaie de créer un programme qui utilise tkinter en tant que GUI pour collecter des informations, puis utilise win32com pour envoyer ces informations à un fichier Excel existant. Sur ma fenêtre Tk, j'ai un bouton qui fait basculer la visibilité du fichier excel, en utilisant l'attribut 'visible' de l'objet Com. Cela fonctionne correctement, sauf si le curseur est toujours actif dans une cellule lorsque vous tentez de masquer à nouveau le fichier (définissez 'visible' sur Faux). Quand je fais cela, il lance une AttributeError. Y a-t-il une solution de contournement?Python win32com Excel.Application renvoie une erreur si le curseur est dans une cellule lorsque 'visible' est défini sur False

Voici le code que je suis en utilisant comme commande pour mon bouton:

def buttonShow(XL): 
     XL.visible ^= 1 

Edit:This a été suggéré comme réponse précédente, mais la question et les solutions sont en C#, alors que je demandais une solution en Python. Les problèmes sont similaires, mais je crois que la solution que j'ai trouvée dans Python est plus simple.

+0

Si une cellule est en mode d'édition, à peu près toutes les opérations échouent. Peut-être que vous pourriez simplement sélectionner une cellule arbitraire comme "A1" et sortir du mode d'édition. [Bien que, si vous changez une cellule par programme, je n'ai pas vu la cellule le problème du mode édition] – dgorti

+0

J'ai essayé de sélectionner une autre cellule, mais cette opération échoue également lorsqu'une cellule est en mode d'édition. Je veux faire en sorte que seuls les champs communs soient disponibles dans la fenêtre Tk, mais des champs plus obscurs peuvent être accédés directement en utilisant le bouton Afficher. Il se peut que je doive juste apprendre à m'en occuper ou trouver un travail de non-programmation. – FoitGuy

+0

Copie possible de [Comment puis-je forcer une cellule à cesser d'être modifiée dans Excel interop?] (Http://stackoverflow.com/questions/22482935/how-can-i-force-a-cell-to-stop-edit- in-excel-interop) – Schollii

Répondre

1

J'ai trouvé une solution efficace. En vérifiant l'attribut Application.Ready, vous pouvez déterminer si le fichier Excel est en mode édition. Malheureusement, si le fichier est en mode d'édition, cela génère toujours une erreur. J'ai été capable de contourner le problème en utilisant une instruction try pour interroger et attraper l'exception pywintypes.com_error.

J'ai simplement modifié mon code en ajoutant une nouvelle fonction pour vérifier l'état:

from pywintypes import com_error 

def isReady(XL): 
    try: return XL.Ready 
    except com_error: return False 

def buttonShow(XL): 
    if isReady(XL): 
     XL.Visible ^= 1 

Cela semble fonctionner. Maintenant, si l'application Excel est toujours en mode édition, le bouton ne fait rien. Si l'application Excel n'est pas en mode édition, elle fonctionne comme prévu et active la visibilité.