|
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. |
||||||||||||||||||