2010-11-02 7 views
1

J'écris actuellement un utilitaire qui prend deux ensembles de données différents à partir d'un document Excel et l'envoie à deux services Web différents. Chaque ensemble de données possède son propre bouton qui envoie les données au service Web. Lorsque vous cliquez sur le bouton a, le service Web correspondant renvoie les données en fonction des valeurs d'entrée. Ce que j'essaie de faire est que cet utilitaire peut être distribué et utilisé par une grande variété de personnes. Ce qu'ils vont faire, c'est qu'ils vont synchroniser là des cellules particulières de leur propre document Excel à la cellule correspondante dans mon utilitaire. En utilisant des formules simples d'Excel. Par exemple:VB - Excel automatisé dans Visual Studio 2010 - Selection Changé Question

c:\temp\[book1.xls]sheet1'!a1 

Maintenant, ce que je suis en train de faire est « cliquer » automatiquement sur le bouton ou la mise à jour, sur mon utilité lorsque l'utilisateur relie leur cellule à sa cellule correspondante sur mon utilité.

J'ai essayé l'événement de changement de sélection sur ma page. Mais il ne traite pas réellement jusqu'à ce que mon utilitaire soit actif, ou cliqué sur.

Existe-t-il un moyen de mettre à jour automatiquement mon utilitaire? Ce serait particulièrement génial si, en quelque sorte, cela a été fait pendant que mon utilitaire était fermé. Ainsi, lorsque l'utilisateur l'ouvre, il est déjà rempli avec leurs informations, et les sorties sont correctes.

+1

Votre utilitaire est-il dans Excel ou un projet VB.NET? Parce que si c'est dans Excel, faites-en un modèle. – JeffO

+0

Projet VB.net. – Johnrad

Répondre

2

Les exigences:
vous devez garantir que lorsqu'un utilisateur utilise Excel votre application peut collecter les données. Votre application peut ne pas être en cours d'exécution à ce moment-là. Vous avez besoin que l'événement Worksheet_SelectionChange() se déclenche automatiquement non seulement lorsque votre application est active.

Solution:
Fondamentalement, afin de garantir que le Worksheet_SelectionChange() est en cours d'exécution tout le temps, et afin de garantir que chaque fois que l'utilisateur ouvre une instance d'Excel que vous êtes en mesure de recueillir et de traiter les données/formules entrées dans l'adresse de plage cible particulière, vous devez câbler l'événement selectionchange à l'intérieur d'une extension COM VB.NET Excel. Il y a plusieurs façons de le faire, mais depuis que vous utilisez VB.NET, vous utilisez au mieux l'approche la plus récente qui est la construction d'un add-in VSTO COM.
Il existe de nombreuses autres questons disponibles sur la meilleure façon de construire un add-in VSTO (certains dans C# certains dans VB.NET mais toutes ces informations sont exactement les mêmes pour les deux, juste une syntaxe différente).
Vous aurez donc besoin de deux projets. Votre existant, plus un Excel VSTO addin (que vous pouvez également faire dans VB.NET).

Maintenant, dans l'événement selectionchange, vous devez vous assurer que votre code gère correctement la plage cible; c'est à dire. assurez-vous de vérifier les groupes de plages non contigus avec une sélection ... A1: B1; D2: E2 et copiez les données dans votre application. Vous pouvez envisager d'utiliser un format tel que xml pour sérialiser les dernières données d'Excel de sorte que si votre application n'est pas ouverte à ce moment, elle peut désérialiser et relire les données stockées pour la prochaine fois qu'elle est ouverte. Je suppose que cela dépend vraiment de la manière dont vous gérez les données (c'est-à-dire de charger dans une grille de données?) Et si vous allez les traiter plus tard et les stocker ailleurs (dans ce cas, vous pouvez les mettre directement dans une base de données) l'addin dans Excel).

+0

En passant, assurez-vous de récupérer une copie du VSTO powertools (pour VSTO 3.0 et supérieur je crois) qui vous donne l'espace de noms Microsoft.office.interop.excel.extensions. Cela rend la tâche beaucoup plus facile lorsque vous travaillez avec des objets communs tels que l'objet Range, car cela réduit le nombre d'appels de méthode Get_someProperty. Vous n'êtes pas limité à utiliser cet espace de noms dans les projets VSTO non plus. –