Sommaire > 6. Traitement inter application

6. Traitement inter application

6.1. Introduction

COM (Component Object Model) permet aux utilisateurs de créer des documents ou des applications composés. La spécification COM définit la manière dont les applications gèrent les objets. Les applications sont susceptibles de partager des objets avec d'autres applications. Ce partage se réalise de deux façons :

  • On peut créer des documents composés dont les données proviennent de différents logiciels. Par exemple, un rapport Word peut contenir des données et des graphiques composés avec Excel.
  • On peut construire des applications qui utilisent des objets d'autres applications. Par exemple, une application de publipostage en Word pourra accéder aux données stockées dans Access ou une application Access pourra utiliser des fonctions financières d'Excel.

6.2. Création d'objets

Une variable objet peut être affectée à un objet d'une application autre que l'application hôte du projet. On peut ainsi exploiter des données issues d'une feuille de calcul Excel dans une procédure VBA de Word. La fonction « CreateObject » permet de définir une référence à une autre application hôte.

La syntaxe de cette fonction est la suivante :

Dim objVariable As Object
Set objVariable = CreateObject("NomApplication.TypeObjet")

Exemple :

Dim wdAppl As Word.Application
Set wdAppl = CreateObject("Word.Application")

Voici les noms qu'il faut utiliser pour appeler le serveur automation :

Application
Type d'objet
Classe
Excel
Application
Sheet
Chart
Excel.Application
Excel.Sheet
Excel.Chart
Word
Application
Word.Application
PowerPoint
Application
PowerPoint.Application
Access
Application
Access.Application
. . .


Pour qu'un projet puisse accéder à la bibliothèque d'objets d'une autre application, celle-ci doit être référencée. Pour cela :

  • 1 Dans la fenêtre « Code » de l'éditeur de projet, choisir : Référence / Outils
  • 2 Dans la boîte de dialogue qui s'affiche, cocher les bibliothèques désirées et valider


6.3. Exemple de communication entre Access et Word

Cet exemple montre comment enregistrer une macro dans Microsoft Word 97, et convertir le code ainsi généré pour pouvoir l'utiliser dans Microsoft Access 97.

  • 1 Démarrer Microsoft Word 97 et enregistrer une macro
  • 2 Nom de la macro « wdAuto » et valider
  • 3 Nouveau... / Fichier, et créer un nouveau document
  • 4 Introduire le texte : « Voici un exemple de procédure "inter application" »
  • 5 Sélectionner Tout / Edition
  • 6 Changer la police de caractère en « Arial »
  • 7 Arrêt de la macro
  • 8 Visualiser le code de la macro dans Visual Basic Editor (Alt+F11) :
Sub wdAuto()
'
' wdAuto Macro
' Macro enregistrée le 25/02/99 par Jean-Marie Lambert
'
    Documents.Add
    Selection.TypeText Text:= _
        "Voici un exemple de procédure ""inter application"""
    Selection.WholeStory
    Selection.Font.Name = "Arial"
End Sub
  • 9 Copier le code : Copier /  Edition
  • 10 Quitter Microsoft Word SANS enregistrer les modifications effectuées
  • 11 Démarrer Microsoft Access et créer un nouveau module
  • 12 Coller le code dans ce module : Coller /  Edition
  • 13 Ajouter une référence à Microsoft Word 8.0 Object Library (Références / Outils)
    (voir figure précédente)
  • 14 Il faut ajouter une variable objet pour créer une instance de Microsoft Word :
    Dim wdAppl As Word.Application
    Set wdAppl = CreateObject("Word.Application")
    wdAppl.Visible = True
  • 15 et utiliser cette variable pour accéder aux objets de Word :
    wdAppl.Documents.Add
    wdAppl.Selection.TypeText Text:= _
        "Voici un exemple de procédure ""inter application"""
    wdAppl.Selection.WholeStory
    wdAppl.Selection.Font.Name = "Arial"
  • 16 Quitter Microsoft Word et libérer la variable objet de la façon suivante :
    wdAppl.quit
    Set wdAppl = Nothing
  • 17 Exécuter cette macro dans Access (F5) :
Sub wdAuto()
'
    Dim wdAppl As Word.Application
    Set wdAppl = CreateObject("Word.Application")
    wdAppl.Visible = True
'
    wdAppl.Documents.Add
    wdAppl.Selection.TypeText Text:= _
        "Voici un exemple de procédure ""inter application"""
    wdAppl.Selection.WholeStory
    wdAppl.Selection.Font.Name = "Arial"
'
    wdAppl.quit
    Set wdAppl = Nothing
End Sub

6.4. Exemples

6.4.1. Utilisation de la fonction « Arrondi[1] » d'Excel dans Word

Function Arrondi(Nombre, Optional Précision)
    Dim xlAppl As Excel.Application
    Set xlAppl = CreateObject("Excel.Application")
    If IsMissing(Précision) Then Précision = 0
    Arrondi = xlAppl.WorksheetFunction.Round(Nombre, Précision)
    xlAppl.Quit
    Set xlAppl = Nothing
End Function

Sub TestArrondi()
    Nb = InputBox(Prompt:="Entrer un nombre :", Title:="Nombre")
    If IsEmpty(Nb) Or Not IsNumeric(Nb) Then Exit Sub
    Pr = InputBox(Prompt:="Précision :", Title:="Précision", Default:=0)
    If IsEmpty(Pr) Or Not IsNumeric(Pr) Then Exit Sub
    MsgBox Arrondi(Nb, Pr)
End Sub

6.4.2. Transfert des données d'une table Access dans Excel

Il s'agit de remplacer les données du classeur « Histo.xls » par les données en provenance de la table « tblClients » de la base de données Access « Clients.mdb ». Après incorporation de ces nouvelles données, on exécute la macro « Graphique » (voir le point 2.2.1 : Commande qui permet de générer un graphique).

Ajout du bouton « cmdExcel »

Voici la marche à suivre :

  • 1 Modifier le formulaire « frmClients »
    sélectionner l'onglet « Formulaires », le formulaire « frmClients » et le bouton « Modifier »
  • 2 Choisir successivement les boutons « Assistant contrôle » et « Bouton de commande » et dessiner le bouton sur le formulaire.
    (Voir le point 2.3.2 : Ajout du bouton ...).
  • 3 Choisir les différentes options de « l'assitant Bouton de commande »



  • 4 Nommer ce bouton « cmdExcel ».

A la place de la procédure générée, introduire le code suivant :

Private Sub cmdExcel_Click()
    TrfExcel
End Sub

Voici le texte de la macro (à insérer dans un nouveau module) :

Sub TrfExcel()
    Dim xlAppl As Excel.Application
    Dim dbClients As Database
    Dim Clients As Recordset

    Set xlAppl = CreateObject("Excel.Application")
    xlAppl.Visible = True
    xlAppl.WindowState = xlMaximized

'   Ouverture du classeur "histo.xls"
    xlAppl.Workbooks.Open FileName:=CurrentProject.Path & _
        "\Histo.xls"

'   Traitement
'   Ligne 3 : titre des colonnes
    xlAppl.Sheets("Données").Range("A:C").ClearContents
    xlAppl.Sheets("Données").Cells(1, 1). _
        Value = "Age au " & Date
    With xlAppl.Sheets("Données")
        .Rows(3).Font.Bold = True
        .Cells(3, 1).Value = "Nom"
        .Cells(3, 2).Value = "Date de" & vbLf & "naissance"
        .Cells(3, 3).Value = "Age"
    End With
'   Lecture des données
    Set dbClients = CurrentDb
    Set Clients = dbClients.OpenRecordset( _
        "select prénom & ' ' & nom, [DateNaissance], " & _
        "Int((Date() - [DateNaissance])/365 + 0.5) " & _
        "from tblClients")
'   Transfert des données à partir de la ligne 4
    xlAppl.Cells(4, 1).CopyFromRecordset Clients
    xlAppl.Sheets("Données").Range("A:C").Columns.AutoFit
    Clients.Close
    dbClients.Close
'   Exécution de la procédure "Graphique"
    xlAppl.Run "Histo.xls!Graphique"

    Set xlAppl = Nothing
End Sub

[1] Il est évident que la fonction « Arrondi » qui est décrite au point 4.1.4 sera beaucoup plus performante.

Sommaire - Début de cette page

Imprimer cet article