Résumé

Lors de l’automatisation d’un produit Office à partir de Visual Basic, il peut être utile de déplacer une partie du code dans un Visual Basic pour Applications de Microsoft, module (VBA) qui peut s’exécuter à l’intérieur de l’espace de processus du serveur. Vous pouvez augmenter la vitesse d’exécution générale de votre application et aide à amoindrir les problèmes si le serveur n’effectue une action lorsqu’un appel est effectué dans le processus.

Cet article montre comment ajouter dynamiquement un module VBA d’une application Office en cours d’exécution, à partir de Visual Basic, puis appeler la macro pour remplir une feuille de calcul en cours.

Plus d'informations

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 ils intègrent tous deux le même moteur VBA.

L’exemple utilise un fichier texte statique pour le module de code inséré dans Excel. Vous pouvez déplacer le code dans un fichier de ressources que vous pouvez compiler dans votre application, puis extraire dans un fichier temporaire lorsque cela est nécessaire à l’exécution. Cela rendrait le projet plus gérable pour re-distribution.

Microsoft Office XP, un utilisateur doit accorder l’accès au modèle d’objet VBA avant que tout code Automation écrit pour manipuler VBA puisse fonctionner. Il s’agit d’une nouvelle fonctionnalité de sécurité d’Office XP. Pour plus d’informations, consultez l’article suivant de la base de connaissances :

l’accès par programme au projet Office XP VBA est refusé

Étapes pour créer l’exemple

  1. Tout d’abord, créez un nouveau fichier texte nommé KbTest.bas (sans l’extension .txt). C’est le module de code que nous insérerons dans Excel au moment de l’exécution.

  2. 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
  3. Enregistrez le fichier texte dans le répertoire C:\KbTest.bas, puis fermez le fichier.

  4. Démarrez Visual Basic et créez un projet standard. Form1 est créé par défaut.

  5. Dans le menu projet , cliquez surréférences, puis sélectionnez la version de bibliothèque de types appropriée qui vous permet d’utiliser une liaison anticipée à Excel.

    Par exemple, sélectionnez une des opérations 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.

  6. Ajoutez un bouton à Form1 et placez le code suivant dans le Gestionnaire de l’événement du bouton cliquez sur :

       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
  7. Pour Excel 2002 et les versions ultérieures d’Excel, vous devez activer l’accès au projet VBA. Pour ce faire, utilisez une des méthodes suivantes :

    • Dans Excel 2007, cliquez sur le Bouton de Microsoft Office, puis cliquez sur Options Excel. Cliquez sur Centre de gestion, puis cliquez sur Paramètres du centre de confiance. Cliquez sur Paramètres de la Macroet cliquez sur pour sélectionner la case à cocher Faire confiance à l’accès au modèle d’objet du projet VBA , puis cliquez sur OK à deux reprises.

    • Dans Excel 2003 et dans les versions antérieures d’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 cliquez sur pour sélectionner la case à cocher faire confiance au projet de Visual Basic .

  8. Exécutez le projet Visual Basic.

Références

Pour plus d’informations sur Automation d’Office à partir de Visual Basic, consultez le site du Support de développement Office à l’adresse suivante :


Besoin d’aide ?

Développez vos compétences
Découvrez des formations
Accédez aux nouvelles fonctionnalités en avant-première
Rejoindre Microsoft Insider

Ces informations vous ont-elles été utiles ?

Dans quelle mesure êtes-vous satisfait(e) de la qualité de la traduction ?

Qu’est-ce qui a affecté votre expérience ?

Avez-vous d’autres commentaires ? (Facultatif)

Nous vous remercions pour vos commentaires.

×