Sommaire > 6. Traitement inter application |
||||||||||||||||||
6. Traitement inter application6.1. IntroductionCOM (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 :
6.2. Création d'objetsUne 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 :
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 :
6.3. Exemple de communication entre Access et WordCet 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.
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
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
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. Exemples6.4.1. Utilisation de la fonction « Arrondi[1] » d'Excel dans WordFunction 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 ExcelIl 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 :
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. |
||||||||||||||||||