Résumé
Lorsque vous automatisez un produit Office à partir d’Visual Basic, il peut être utile de déplacer une partie du code dans un module Microsoft Visual Basic pour Applications (VBA) qui peut s’exécuter dans l’espace de processus du serveur. Cela peut accélérer la vitesse d’exécution globale de votre application et réduire les problèmes si le serveur ne comporte une action qu’en cours de traitement.
Cet article montre comment ajouter dynamiquement un module VBA à une application Office en cours d’exécution à partir de Visual Basic, puis appeler la macro pour remplir une feuille de calcul en cours de traitement.
Informations supplémentaires
L’exemple suivant illustre l’insertion d’un module de code dans Microsoft Excel, mais vous pouvez utiliser la même technique pour Word et PowerPoint, car les deux intègrent le même moteur VBA.
L’exemple utilise un fichier texte statique pour le module de code qui est inséré dans Excel. Vous pouvez déplacer le code dans un fichier de ressource que vous pouvez compiler dans votre application, puis l’extraire dans un fichier temporaire au moment de l’utilisation. Cela rendrait le projet plus gérable pour la distribution à nouveau.
À partir Microsoft Office XP, un utilisateur doit accorder l’accès au modèle d’objet VBA pour que tout code Automation écrit pour manipuler VBA fonctionne. Il s’agit d’une nouvelle fonctionnalité de sécurité Office XP. Pour plus d’informations, consultez l’article suivant de la Base de connaissances :
282830 Accès par programme à Office XP VBA pour Project est refusé
Étapes de la build de l’exemple
-
Tout d’abord, créez un fichier texte nommé KbTest.bas (sans l’extension .txt texte). Il s’agit du module de code que nous allons insérer dans Excel au moment de l’run-time.
-
Dans le fichier texte, ajoutez les lignes de code suivantes :
Attribute VB_Name = "KbTest"
' Your Microsoft Visual Basic for Applications macro function takes 1
' parameter, the sheet object that you are going to fill.
Public Sub DoKbTest(oSheetToFill As Object)
Dim i As Integer, j As Integer
Dim sMsg As String
For i = 1 To 100
For j = 1 To 10
sMsg = "Cell(" & Str(i) & "," & Str(j) & ")"
oSheetToFill.Cells(i, j).Value = sMsg
Next j
Next i
End Sub -
Enregistrez le fichier texte dans le répertoire C:\KbTest.bas, puis fermez le fichier.
-
Démarrez Visual Basic et créez un projet standard. Form1 est créé par défaut.
-
Dans le menu Project, cliquez surRéférences, puis sélectionnez la version de bibliothèque de types appropriée qui vous permet d’utiliser la liaison anticipée pour Excel.
Par exemple, sélectionnez l’une des sélections suivantes :-
Pour Microsoft Office Excel 2007, sélectionnez la bibliothèque 12.0.
-
Pour Microsoft Office Excel 2003, sélectionnez la bibliothèque 11.0.
-
Pour Microsoft Excel 2002, sélectionnez la bibliothèque 10.0.
-
Pour Microsoft Excel 2000, sélectionnez la bibliothèque 9.0.
-
Pour Microsoft Excel 97, sélectionnez la bibliothèque 8.0.
-
-
Ajoutez un bouton à Formulaire1 et placez le code suivant dans le handler pour l’événement Click du bouton :
Private Sub Command1_Click()
Dim oXL As Excel.Application
Dim oBook As Excel.Workbook
Dim oSheet As Excel.Worksheet
Dim i As Integer, j As Integer
Dim sMsg As String
' Create a new instance of Excel and make it visible.
Set oXL = CreateObject("Excel.Application")
oXL.Visible = True
' Add a new workbook and set a reference to Sheet1.
Set oBook = oXL.Workbooks.Add
Set oSheet = oBook.Sheets(1)
' Demo standard Automation from out-of-process,
' this routine simply fills in values of cells.
sMsg = "Fill the sheet from out-of-process"
MsgBox sMsg, vbInformation Or vbMsgBoxSetForeground
For i = 1 To 100
For j = 1 To 10
sMsg = "Cell(" & Str(i) & "," & Str(j) & ")"
oSheet.Cells(i, j).Value = sMsg
Next j
Next i
' You're done with the first test, now switch sheets
' and run the same routine via an inserted Microsoft Visual Basic
' for Applications macro.
MsgBox "Done.", vbMsgBoxSetForeground
Set oSheet = oBook.Sheets.Add
oSheet.Activate
sMsg = "Fill the sheet from in-process"
MsgBox sMsg, vbInformation Or vbMsgBoxSetForeground
' The Import method lets you add modules to VBA at
' run time. Change the file path to match the location
' of the text file you created in step 3.
oXL.VBE.ActiveVBProject.VBComponents.Import "C:\KbTest.bas"
' Now run the macro, passing oSheet as the first parameter
oXL.Run "DoKbTest", oSheet
' You're done with the second test
MsgBox "Done.", vbMsgBoxSetForeground
' Turn instance of Excel over to end user and release
' any outstanding object references.
oXL.UserControl = True
Set oSheet = Nothing
Set oBook = Nothing
Set oXL = Nothing
End Sub -
Pour Excel 2002 et les versions ultérieures de Excel, vous devez activer l’accès au projet VBA. Pour cela, appliquez l’une des méthodes suivantes :
-
Dans Excel 2007, cliquez sur le Microsoft Office Bouton Droit, puis cliquez Excel Options disponibles. Cliquez sur Centre de gestion de la confidentialité, puis sur Paramètres du Centre de gestion de la confidentialité. Cliquez sur Macro Paramètres, cochez la case Faire confiance à Access au modèle objet de projet VBA, puis cliquez deux fois sur OK.
-
Dans Excel 2003 et les versions antérieures de Excel, pointez sur Macro dans le menu Outils, puis cliquez sur Sécurité. Dans la boîte de dialogue Sécurité, cliquez sur l’onglet Sources fiables, puis cochez la case Accès approuvé Visual Basic Project données.
-
-
Exécutez le Visual Basic projet.
Références
Pour plus d’informations sur l’automatisation des Office à partir Visual Basic, consultez le site de support technique Office au niveau de l’adresse suivante :