Je n'ai absolument aucune idée de comment commencer à diagnostiquer cela, et je me demandais si quelqu'un avait des suggestions. Je génère une feuille de calcul Excel en appelant des macros à partir d'une application C#, et au cours du processus de génération, il se brise d'une manière ou d'une autre. J'ai une classe VBA contenant tout mon enregistrement/logique de gestion des erreurs, que j'instancier en utilisant un accesseur singleton-esque, ici:Automatiser Excel à travers le PIA rend VBA aller squiffy
Private mcAppFramework As csys_ApplicationFramework
Public Function AppFramework() As csys_ApplicationFramework
If mcAppFramework Is Nothing Then
Set mcAppFramework = New csys_ApplicationFramework
Call mcAppFramework.bInitialise
End If
Set AppFramework = mcAppFramework
End Function
Le code ci-dessus fonctionne bien avant que j'ai produit la feuille de calcul mais échoue ensuite. Le problème semble être la ligne suivante;
Set mcAppFramework = New csys_ApplicationFramework
que je n'ai jamais vu échouer avant. Si j'ajoute une montre à la variable étant assignée ici, le type montre comme csys_ApplicationFramework/wksFoo, où wksFoo est une feuille de calcul aléatoire dans le même classeur. Ce qui semble se produire est que si la variable est de type droit, plutôt que de remplir ce créneau avec une nouvelle instance de ma classe-cadre, il est fait pointer vers une feuille de calcul existant au lieu, l'équivalent de
Set mcAppFramework = wksFoo
ce qui est une erreur de compilation, comme on pourrait s'y attendre. Encore plus bizarre, si je mets un point d'arrêt sur la ligne fautive, édite la ligne, puis reprend l'exécution, ça marche. Par exemple, je supprime le mot «Nouveau» de la ligne, recule, ressaisit «Nouveau» et recommence l'exécution. Cela résout d'une manière ou d'une autre le classeur et ça marche bien pour toujours, avec le type de la variable dans ma fenêtre de surveillance affichant comme csys_ApplicationFramework/csys_ApplicationFramework comme je m'y attendais.
Cela implique que la manipulation du classeur via l'assembly PIA le brise d'une manière ou d'une autre. Tout ce que je fais dans le PIA est l'ouverture du classeur, l'appel de plusieurs macros en utilisant Excel.Application.Run(), et en l'enregistrant à nouveau. Je peux poster quelques détails supplémentaires si quelqu'un pense que c'est pertinent.
Je ne sais pas comment VBA crée des objets dans les coulisses ou comment déboguer cela. Je ne sais pas non plus comment la façon dont le code s'exécute peut changer sans que le code lui-même ne change.
Comme mentionné précédemment, VBA est franchement un peu carré sur moi ... Des pensées?
Il n'y a pas beaucoup d'aide, mais je l'ai rencontré de nombreux problèmes de VBA bizarre/inexplicables très similaires à ce sujet. Je suis curieux cependant, quel message d'erreur obtenez-vous? –
Le message d'erreur réel que j'obtiens est une erreur d'automatisation (le code d'erreur est -2147319784 (80028018)), et l'erreur indique que la méthode worksheet_deactivate() échoue. Cela se produit lors de l'appel à mcAppFramework.bInitialiser, sans doute parce que le type sous-jacent n'a pas cette méthode! –
Ainsi, le code échoue-t-il sur "Set mcAppFramework = New csys_ApplicationFramework" ou "Call mcAppFramework.bInitialise"? –