Académique Documents
Professionnel Documents
Culture Documents
Par SilkyRoad
Ce tutoriel montre comment manipuler des fichiers Open Office en VBA Excel.
Le principe de fonctionnement est identique en VB6.
Tous les exemples ont été testés avec Excel2002, OOo2.0.1 & WinXP.
Piloter Open Office depuis Excel par SilkyRoad
I - Préambule............................................................................................................................................................... 3
II - Manipuler les fichiers Open Office........................................................................................................................ 4
II-A - Ouvrir un fichier Writer et y ajouter des données à la suite de la dernière ligne.......................................... 4
II-B - Coller une plage de cellules Excel dans un nouveau document Writer, puis sauvegarder le document....... 4
II-C - La Fonction de conversion ConvertToURL...................................................................................................5
II-D - Ouvrir un document Open Office protégé par mot de passe....................................................................... 5
II-E - Modifier l'entête et le pied de page d'un document OOo............................................................................. 6
II-F - Fermer toutes les fenêtres Open office sans sauvegarde............................................................................7
II-G - Lister les documents Open Office ouverts................................................................................................... 7
III - Utiliser les filtres de conversion Open Office....................................................................................................... 9
III-A - Lister les filtres de conversion disponibles.................................................................................................. 9
III-B - Sauvegarder un fichier CALC et créer une copie au format .xls................................................................. 9
III-C - Utiliser le convertisseur PDF..................................................................................................................... 10
IV - Piloter une base Open Office (.ODB) depuis Excel........................................................................................... 11
IV-A - Effectuer une requête dans une base.......................................................................................................11
IV-B - Ajouter un enregistrement dans une table OOo....................................................................................... 12
IV-C - Supprimer un enregistrement dans une table OOo.................................................................................. 13
IV-D - Mettre à jour les enregistrements dans une table OOo............................................................................13
IV-E - Ajouter une nouvelle table dans une base Open Office........................................................................... 13
V - Déclencher une macro Open Office depuis Excel.............................................................................................. 15
VI - Piloter un publipostage Writer depuis VB6/VBA................................................................................................ 16
VI-A - Lancer un publipostage pour l'ensemble des enregistrements................................................................. 16
VI-B - Lancer un publipostage en appliquant un filtre sur la valeur d'un champ................................................. 17
VII - Récupérer les macros d'un classeur Excel endommagé.................................................................................. 20
VIII - Conclusion........................................................................................................................................................ 21
IX - Téléchargement.................................................................................................................................................. 22
X - Remerciements.................................................................................................................................................... 23
-2-
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
I - Préambule
OpenOffice.org (aussi appelé OOo) est une suite bureautique libre, constituée:
D'un traitement de texte (.odt)
D'un tableur (.ods)
D'un module de présentations (.odp)
D'un module de dessins (.odg)
D'un module pour les bases de données (.odb)
Vous trouverez une description détaillée dans ce lien, ainsi que l'application en téléchargement:
http://fr.openoffice.org/
Si vous recherchez des informations pour comparer les suites bureautiques gratuites et commerciales:
Consultez le tutoriel de Netah25.
Si vous débutez dans l'utilisation des bases de données Open Office:
Consultez le tutoriel de Cyril Beaussier.
Il n'existe pas de bibliothèque pour piloter OOo depuis VB & VBA mais il est possible d'utiliser les API d'Open Office
pour manipuler les fichiers:
C'est l'objet de ce tutoriel.
Vb
CreateInstance("com.sun.star.frame.Desktop")
-3-
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
II-A - Ouvrir un fichier Writer et y ajouter des données à la suite de la dernière ligne
Vb
Sub ModifierFichierOpenOffice()
'macro testée avec Excel2002 et OOo 2.0.1
Dim serviceManager As Object, oText As Object, oCursor As Object
Dim Desktop As Object, Document As Object
Dim Fichier As String
Dim args()
'Ouverture du fichier
Set Document = Desktop.loadComponentFromURL(Fichier, "_blank", 0, args)
Set oText = Document.getText()
II-B - Coller une plage de cellules Excel dans un nouveau document Writer, puis sauvegarder
le document
Vb
Sub creerNouveauDocumentWriter()
Dim oServiceManager As Object, oDispatcher As Object
Dim Desktop As Object, Document As Object
Dim args()
Dim Chemin As String, Fichier As String
Dim T As Date
-4-
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
Vb
'Conversion de l'emplacement de sauvegarde au format URL
Chemin = Replace(ThisWorkbook.Path, "\", "/")
Fichier = "file:///" & Chemin & "/essai.odt"
'------
'--------
'ajoute une temporisation de 2 secondes pour empécher que le fichier
'ne se ferme avant la fin de la création
T = Timer + 2: Do Until Timer > T: DoEvents: Loop
'--------
'Fermeture du fichier
'L'argument True indique que les modifications vont être sauvegardées à la fermeture
Document.Close (True)
End Sub
Comme vous avez pu le constater dans les exemples précédents, le chemin des fichiers est indiqué au format URL.
file:///C:/Documents And Settings/Repertoire/le Document.odt
Open Office possède une fonction spécifique qui permet cette conversion: ConvertToURL.
Cette fonction n'est pas disponible depuis VB/VBA mais vous pouvez créer une fonction personnelle en
remplacement.
(Un exemple dans Excel):
Vb
Sub Test()
Dim serviceManager As Object, Desktop As Object, Document As Object
Dim Fichier As String
Dim args()
'Ouverture du fichier
Set Document = Desktop.loadComponentFromURL(Fichier, "_blank", 0, args)
End Sub
Vb
Sub ouvrirDocOpenOfficeProtegeParPassword()
Dim serviceManager As Object, Desktop As Object, Document As Object
-5-
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
Vb
Dim Fichier As String
Dim Args(0) As Object
Exit Sub
Fin:
If Err.Number = 424 Then MsgBox "Vérifiez le mot de passe indiqué dans votre procédure."
End Sub
Remarques:
La procédure renvoie une Erreur 424 "Objet Requis" , si le mot de passe est erroné ou non précisé.
L'indication d'un mot de passe dans la macro alors que le classeur n'est pas protégé , ne renvoie pas d'erreur.
Vb
Sub modificationEnteteTableur_OpenOffice()
Dim serviceManager As Object
Dim Desktop As Object, Document As Object
Dim Chemin As String, Fichier As String
Dim args()
Dim Feuille As Object, leStyle As Object, Entete As Object, piedPage As Object
Dim oText As Object, Curseur As Object, leChamp As Object
-6-
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
Vb
Curseur.CharWeight = 150 'Gras(indiquez la valeur 100 pour un format normal)
Curseur.CharPosture = 0 '(indiquez la valeur 2 pour afficher le texte en italique)
Curseur.CharFontName = "Arial"
Curseur.CharHeight = "12" 'taille caractères
oText.insertString Curseur, "Les données à insérer", False
'-------------------------------------------------------
leStyle.RightPageHeaderContent = Entete
leStyle.RightPageFooterContent = piedPage
End Sub
Vb
Sub fermerToutesLesFenetresOOoSansSauvegarde()
Dim serviceManager As Object, Desktop As Object
Dim i As Byte
Vb
Sub listeDocumentsOpenOfficeOuverts()
Dim oComponents As Object, Cible As Object
Dim Desktop As Object, oServiceManager As Object, oComponent As Object
Dim Nombre As Byte
Dim listeDoc As String, leFichier As String
-7-
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
Vb
Set Cible = oComponents.createEnumeration()
MsgBox "Nombre de documents Open Office ouverts : " & Nombre & vbLf & vbLf & listeDoc
End Sub
-8-
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
Pour moi, un des points forts d'Open Office réside dans la liste des filtres de conversion disponibles.
Ces filtres permettent de créer un document dans Open Office et de le sauvegarder dans un format compatible vers
une autre application (Par exemple Microsoft Office).
Voici 3 exemples d'utilisation:
Vb
Sub ListerNomsFiltresConversion()
Dim serviceManager As Object, filtresFact As Object
Dim nomFiltres As Variant
Dim i As Integer
Cette procédure:
Crée un nouveau fichier Open Office Calc,
y transfère les données de la plage A1:A10 (du classeur Excel contenant cette macro)
Sauvegarde le fichier au format .ods,
puis fait une copie de sauvegarde du fichier ODS au format Excel
Vb
Sub Sauvegardes_OOo_XLs()
Dim Args(), Args2(0)
Dim oServ As Object, oDesk As Object, oSheet As Object, Doc As Object
Dim Donnees As String
Dim i As Byte
'Boucle sur la plage de cellules Excel A1:A10 pour un transfert dans Calc
For i = 0 To 9
Donnees = Cells(i + 1, 1)
'remarque:
'Dans OOo les cellules sont indiquées ainsi :
'getCellByPosition(NumeroColonne, NumeroLigne)
'L'index de la 1ere ligne et de la 1ere colonne ont la valeur 0
oSheet.getCellByPosition(0, i).SetString (Donnees)
Next i
-9-
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
Vb
Doc.StoreAsURL "file:///C:/monClasseur.ods", Args
'-----------
'Crée une copie du document Open Office au format Excel
Set Args2(0) = oServ.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Args2(0).Name = "FilterName"
Args2(0).Value = "MS Excel 97"
Doc.StoreToURL "file:///C:/monClasseur.xls", Args2
DoEvents
'-----------
Cette procédure:
Ouvre un document Word dans Open Office (module Writer)
Convertit le document au format PDF
Referme le document
Vb
Sub convertirDocumentWord_En_PDF()
Dim serviceManager As Object, Desktop As Object, Fichier As Object
Dim TabOuv() As Variant
Dim Args(1) As Object
Dim T As Date
'--------
'ajoute une temporisation de 2 secondes pour empécher que le fichier
'ne se ferme avant la fin de la conversion
T = Timer + 2: Do Until Timer > T: DoEvents: Loop
'--------
'Fermeture du fichier
Fichier.Dispose
End Sub
- 10 -
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
Un exemple pour effectuer une requête dans la base de données "Bibliography" (Base démo fournie dans le pack
d'installation Open Office)
Vb
Sub requeteBase_ODB()
Dim oDB As Object, oBase As Object
Dim oStatement As Object
Dim rSQL As String
Dim oRequete As Object
Dim oServiceManager As Object, CreateUnoService As Object
Dim i As Integer
'Connection
Set oBase = oDB.getConnection("", "")
Set oStatement = oBase.createStatement
'Création requète
rSQL = "SELECT ""Identifier"",""Publisher"",""ISBN"" FROM ""biblio"" " & _
"WHERE ""Author""='Böhm, Franz'"
Set oRequete = oStatement.ExecuteQuery(rSQL)
oRequete.Close
oStatement.Close
End Sub
Remarque 1:
Si la base est protégée par un mot de passe vous devez remplacer la ligne
Vb
Set oBase = oDB.getConnection("", "")
Par
Vb
Set oBase = oDB.getConnection("Login", "MotDePasse")
- 11 -
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
Remarque 2:
Le nom des champs et des tables doit être encadré par des doubles guillemets:
Vb
rSQL = "SELECT ""Champ1"" FROM ""maTable"""
Remarque 3:
Si la base n'est pas enregistrée, vous devez utiliser cette syntaxe:
Vb
Dim Fichier As String
Fichier = "file:///C:/Documents and Settings/michel/dossier/OOoBase.odb"
Une base est dite enregistrée lorsque vous pouvez la visualiser en utilisant le menu Afficher/Sources de données.
(ou par la touche raccourci F4).
Pour enregistrer une Base:
Menu Outils
Options
Sélectionnez "OpenOffice.org Base" dans l'arborescence
Double cliquez sur "Bases de données"
Cliquez sur le bouton "Nouveau"
Utilisez le bouton "Parcourir" pour rechercher la base sur le disque
Puis Validez en cliquant sur OK dans toutes les boîtes de dialogue.
Cet exemple ajoute un enregistrement dans la table "maTable" d'une base enregistrée nommée OOoBase
Vb
Sub ajoutEnregistrement_Base_ODB()
Dim oDB As Object, oBase As Object
Dim oStatement As Object
Dim rSQL As String
Dim oRequete As Object
Dim oServiceManager As Object, CreateUnoService As Object
'Connection
Set oBase = oDB.getConnection("", "")
Set oStatement = oBase.createStatement
'Ajoute un enregistrement
rSQL = _
"INSERT INTO ""maTable"" (""ChampTexte"", ""ChampNum"") Values('Nouvelle ligne', 12345)"
Set oRequete = oStatement.ExecuteQuery(rSQL)
oRequete.Close
oStatement.Close
End Sub
- 12 -
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
Remarque
En fonction de la version d'Open Office, il faut parfois remplacer
Vb
Set oRequete = oStatement.ExecuteQuery(rSQL)
par
Vb
Set oRequete = oStatement.ExecuteUpdate(rSQL)
Vb
'Supprime les enregistrements si le Champ2 contient la valeur 12345
rSQL = "DELETE FROM ""maTable"" WHERE ""Champ2""=12345 "
Set oRequete = oStatement.executeQuery(rSQL)
Vb
'Mise à jour d'enregistrements
'Insère le mot "Cloture" dans le Champ1 si le Champ2 contient la valeur 10
rSQL = "UPDATE ""maTable"" SET ""Champ1""='Cloture' WHERE ""Champ2"" = 10"
Set oRequete = oStatement.executeQuery(rSQL)
IV-E - Ajouter une nouvelle table dans une base Open Office
Vb
Sub creationTable_Dans_Base_ODB()
Dim oDB As Object, oBase As Object
Dim oServiceManager As Object, CreateUnoService As Object
Dim NouvelleTable As Object, CollectionTables As Object, NouveauChamp As Object
'Connection
Set oBase = oDB.getConnection("", "")
- 13 -
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
Vb
NouveauChamp.Name = "NomProduit" 'nom champ
NouveauChamp.Type = 1 'champ type texte
NouveauChamp.Precision = 200
NouvelleTable.Columns.appendByDescriptor NouveauChamp 'ajout du champ
End Sub
- 14 -
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
Cette procédure permet de déclencher la macro d'un document Open Office ouvert et non sauvegardé, nommé "Sans
nom1".
Vb
oURL.Complete = "macro://Sans nom1/Standard.Module1.nomMacroOOo"
Vb
Private Sub Command1_Click()
Dim oServiceManager As Object, oURL As Object
Dim oTrans As Object
Dim Desktop As Object, Args(1) As Object, oDisp As Object
Si le document Open Office est déjà sauvegardé (OOoTableurTest.ods par exemple), vous pouvez utiliser ce type
de syntaxe:
Vb
oURL.Complete = "macro://OOoTableurTest/Standard.Module1.nomMacroOOo"
Remarque:
il ne faut pas indiquer l'extension du document ( .ods , .odt ...)
Attention:
la procédure est sensible aux majuscules et aux minuscules
Si la procédure est stockée dans "Mes macros" (macros personnelles), vous pouvez utiliser:
Vb
oURL.Complete = "macro:///Standard.Module1.nomMacroOOo"
- 15 -
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
Ce chapitre propose 2 exemples pour lancer des publipostages Open Office depuis VB/VBA.
Vb
Option Explicit
Sub Test()
Set oServiceManager = CreateObject("com.sun.star.ServiceManager")
If OutType = 2 Then
- 16 -
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
Vb
ReDim Args(6)
Else
ReDim Args(4)
End If
Set objMailMerge = _
oServiceManager.createInstance("com.sun.star.text.MailMerge")
If OutType = 2 Then
Set Args(5) = OOoNamedValue("OutputURL", CheminFichierFusion)
Set Args(6) = OOoNamedValue("FileNamePrefix", NomFichierFusion)
End If
objMailMerge.Execute Args()
End Sub
Set objCoreReflection = _
oServiceManager.createInstance("com.sun.star.reflection.CoreReflection")
- 17 -
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
Vb
Option Explicit
Sub Test()
Set oServiceManager = CreateObject("com.sun.star.ServiceManager")
PublipostageFiltre _
"OOoBase", _
"file:///C:/repertoire/monDocument.odt", _
0, _
"maTable", _
1, _
"""Champ1"" = 'credit'"
End Sub
Set objMailMerge = _
oServiceManager.createInstance("com.sun.star.text.MailMerge")
objMailMerge.Execute Args()
End Sub
Set objCoreReflection = _
oServiceManager.createInstance("com.sun.star.reflection.CoreReflection")
- 18 -
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
Vb
End Function
- 19 -
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
Lorsqu'un classeur Excel est endommagé, une solution de dépannage consiste à l'ouvrir dans Open Office. Il est
possible d'automatiser le processus de récupération et de remise en forme des macros contenues dans un classeur
corrompu.
Récupérer les macros d'un classeur endommagé
- 20 -
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
VIII - Conclusion
L'utilisation de toutes ces procédures sur différents PC a mis en évidence des fonctionnements disparates d'un poste
de travail à l'autre.
Des adaptations seront peut être nécessaires au cas par cas, en fonction de votre configuration.
Configurations de Test:
WinXP , Excel2002 , OOo2.0.1
WinXP , Excel2000 , OOo2.0.3
- 21 -
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
IX - Téléchargement
- 22 -
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/
Piloter Open Office depuis Excel par SilkyRoad
X - Remerciements
- 23 -
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à
l'obtention préalable de l'autorisation de l'auteur.
http://silkyroad.developpez.com/VBA/PiloterOpenOffice/