2017-04-13 8 views
0

Mon Excel peut télécharger des données à partir d'un fournisseur de données via un AddIn. A partir des pages d'aide du fournisseur, j'ai découvert (et testé) qu'il est possible de « Actualiser » les données en appelant la commande suivante dans VBA:Méthode d'appel d'Excel COM Addin à partir de C#

Application.COMAddIns("PowerlinkCOMAddIn.COMAddIn").Object.RefreshWorkbook 

Après avoir passé quelques heures à la recherche sur la Internet Je n'ai pas trouvé de réponse sur la façon dont je peux appeler exactement la même méthode en utilisant C#.

Comme j'ai beaucoup de ces feuilles de calcul qui doivent être mises à jour régulièrement, j'essaie d'automatiser le processus.

  1. Une façon d'atteindre probablement ce serait d'injecter une nouvelle macro chaque fois que j'ouvre les feuilles de calcul avec la commande ci-dessus et l'appeler, mais je préfère l'appeler directement avec C# si possible.
  2. Une deuxième solution serait d'utiliser Python ou un autre langage pour télécharger les données au format CSV et de lier mes feuilles de calcul aux fichiers CSV mais ce processus semble également excessif.

Merci beaucoup à l'avance.

+1

dynamic obj = Application ... Objet; obj.Whatever(); –

+0

Merci pour cela. J'ai maintenant changé mon code en fonction de votre exemple. dynamic obj = Application.COMAddIns ("PowerlinkCOMAddIn.COMAddIn"). Objet mais quand j'essaye d'exécuter obj.RefreshWorkbook() il indique que la méthode n'existe pas. Une idée? – stratar

+0

Je me suis retrouvé avec un travail autour de: insertion (injection) d'une procédure Sub dans un module VBA par programmation via C# qui appelle ensuite le code ci-dessus. Le problème que j'ai rencontré en utilisant cette solution est que parfois, lorsque j'essayais d'exécuter la macro, j'obtenais une erreur 438. J'ai réussi à m'en débarrasser en utilisant 'System.Threading.Thread.Sleep (10000);' après l'ouverture d'Excel, ce qui signifie que je recevais l'erreur car probablement le COM Addin n'était pas chargé quand je voulais exécuter le code VBA. Ainsi, la question devient maintenant: "Comment puis-je m'assurer que tous les Addins dans Excel sont chargés" avant d'essayer d'y accéder? – stratar

Répondre

-1

Vous pouvez utiliser la technologie de retouche tardive (Reflection in .net) pour appeler des méthodes et des propriétés sans mouler un objet dans le type réel, voir Type.InvokeMember pour plus d'informations.

Application.COMAddIns("PowerlinkCOMAddIn.COMAddIn").Object.GetType().InvokeMember("RefreshWorkbook" ... 

Aussi vous pouvez trouver l'article utile HowTo: Communicate with a COM add-in from a standalone application. Un exemple de code en C# est inclus.