2010-06-17 13 views
4

Je voudrais créer un Excel dans lequel créer des barres d'outils et des boutons de menu supplémentaires. Mais je veux que cet addin se charge uniquement lorsqu'un classeur spécifique est ouvert. Je ne veux pas charger l'Addin si un autre classeur est ouvert.Comment créer un Excel spécifique à un classeur Ajouter

Je voudrais savoir quelles sont les façons possibles de résoudre ce problème et quelle est la meilleure approche pour implémenter cet ajout (XLA ou VSTO ou COM Addin).

Je ne veux pas que l'utilisateur connaisse mon chemin Addin, le code VbA requis pour charger/initialiser l'addin.

Répondre

5

Cela semble être un bon exemple pour un projet de document VSTO; Contrairement aux compléments, qui étendent l'ensemble de l'application, et s'appliquent par conséquent à tout document ouvert, un projet de document VSTO est une personnalisation d'un document spécifique, auquel un code supplémentaire est attaché.

+0

L'inconvénient est que le projet de document VSTO nécessite le chargement de l'assembly spécifique à la GAC lorsque vous effectuez un déploiement de production, ce qui peut poser un problème de sécurité dans certains environnements d'entreprise. Sinon, un bon chemin à prendre. – code4life

4

Créez la barre d'outils au début, mais définissez la visibilité de la barre d'outils sur false. Capturez le classeur en cours d'ouverture avec un gestionnaire d'événements pour l'événement AddIn.Application.WorkbookOpen et déterminez si le classeur est celui que vous souhaitez. À ce stade, vous pouvez définir la visibilité de la barre d'outils.

Vous pouvez également intercepter l'événement AddIn.Application.WorkbookActivate et masquer à nouveau la barre d'outils si le classeur actif n'est pas le classeur spécifique. N'oubliez pas d'avoir une variable membre déclarée au niveau ThisAddIn pour conserver une référence à la barre d'outils!

+0

Cela fonctionne, avec une mise en garde: le complément sera chargé quel que soit le classeur ouvert. Si je comprends ce que vous décrivez, vous déclenchez réellement si le complément est visible en fonction du classeur. – Mathias

+0

@ Mathias, le complément doit toujours être chargé. C'est exactement comme ça que fonctionne le chargeur additionnel VSTO. Si vous voulez contrôler le chargement/déchargement physique du complément, vous devez écrire votre propre AddInLoader.dll. – code4life

+0

Je suis d'accord avec @Mathais. Je ne veux même pas charger l'addin. – Ankit

2

Si vous voulez vraiment que le Addin à charger quand un certain classeur ouvre pourquoi ne pas le charger dans l'événement Open du classeur correspondant

' code in the ThisWorkbook module 

Private Sub Workbook_Open() 

Dim wb As Workbook 

    On Error Resume Next 
    Set wb = Workbooks("myAddin.xla") 
    If wb Is Nothing Then 
     Set wb = Application.Workbooks.Open("c:\path\myAddin.xls") 
    End If 

End Sub 

Sinon, tout autre classeur ou Addin peut inlcude code piège Excel Les événements Niveau d'application tels que Workbook.Open, et si le nom du travail récemment ouvert est celui que vous êtes intéressé à faire quoi que ce soit, à savoir charger l'Addin

+0

Je ne veux pas non plus que l'utilisateur sache comment mon addin est chargé, quel est le chemin d'addin et le code pour charger/initialiser l'addin – Ankit

+0

@Ankit, si vous utilisez VBA vous pouvez passerwork protéger le projet. Ce n'est pas totalement sécurisé mais cela découragera la plupart des utilisateurs. Le "chemin" de l'addin est partout où vous avez installé l'addin. Si c'est dans la même pathe que le classeur, en se référant à l'exemple ci-dessus, vous pouvez utiliser Set wb = Application.Workbooks.Open (ThisWorkbook.Path & "\ myAddin.xla"). Vous ne savez pas ce que vous voulez dire par "initialiser" l'addin. Normalement, vous devez inclure du code pour créer/supprimer des menus, etc. dans les événements Ouvrir/Fermer de l'add –