IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

OpenOffice/LibreOffice OLE Automation: Executer une macro


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut OpenOffice/LibreOffice OLE Automation: Executer une macro
    Bonjour,

    Je souhaite simplement exécuter une macro qui est dans un document Ooffice, depuis Delphi via l'OLE comment faire ?

    Je peux charger le document
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //------------------------------------------------------------------------------------------------------------------------------
    procedure TForm1.BtnLoadDocumentClick(Sender: TObject);
    var
      LoadParams : Variant;
      NomFichier : AnsiString;
    begin
      OpenOffice  := CreateOleObject('com.sun.star.ServiceManager');
      OpenDesktop := OpenOffice.createInstance('com.sun.star.frame.Desktop');
      LoadParams  := VarArrayCreate([0, -1], varVariant);
      NomFichier  := StringReplace(DocumentFileName, '\', '/', [rfReplaceAll, rfIgnoreCase]);
      OLEDocument := openDesktop.LoadComponentFromURL( 'file:///'+NomFichier, '_blank', 0,  LoadParams);
    end;
    Je peux mettre à jour un signet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm1.BtnSetDateTimeClick(Sender: TObject);
    var
     bmk : variant;
    begin
      try 
        bmk := OLEDocument.Bookmarks.getByName('DateTime').Anchor; 
      except  
        bmk:=null; 
      end;
      if not(VarIsEmpty(bmk)) then bmk.setString('The date and time') else ShowMessage('Repere de texte non trouvé');
    end;
    Mais impossible de trouver comment executer une macro..
    Merci

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 426
    Points : 24 790
    Points
    24 790
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Merci mais j'ai trouvé cela mais j'ai un message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      // MyScript est un variant
      // Le nom de la macro est "test"
      MyScript := OLEDocument.getScriptProvider.getScript('vnd.sun.star.script:Standard.Module1.test?language=Basic&location=Document');
    Mais j'ai le message suivant:
    The following basic script could not be found:
    library: 'Standard'
    module: 'Module1'
    method: 'test'
    location: 'Document'
    Ma macro se trouve bien dans "Mes macros et boites de dialogue/Standard/Module1" avec comme nom "sub test"

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par franckcl Voir le message
    avec comme nom "sub test"
    alors la commande ne serait pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyScript := OLEDocument.getScriptProvider.getScript('vnd.sun.star.script:Standard.Module1.sub%20test?language=Basic&location=Document');
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Toutes les macros commencent pas sub...
    J'ai quand même fait l'essai mais ça ne change rien, même type d'erreur.

    Dans le document office que j'utilise, voici le contenu de "Mes macros et boîtes de dialogue" /Standard/Module1

    Code oBasic : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    REM  *****  BASIC  *****
     
    Sub Main
     
    End Sub
    '-----------------------------------------------------------------------------------------------
    Sub test
    	MsgBox("Test macro success !!!")
    end sub
    '-----------------------------------------------------------------------------------------------
    Sub PrintPDF
       theDoc           = ThisComponent
    	docUrl             = theDoc.URL
    	If NOT FileExists(docUrl) Then  
    	MsgBox("The document must be saved to an URL for this routine to work.")
        Exit Sub
    	End If
    	If NOT theDoc.supportsService("com.sun.star.text.TextDocument") Then
        MsgBox("This routine can only export Writer documents.")
        Exit Sub
       End If
    docURLsplit        = Split(docURL, ".")
    docExt             = docURLsplit(Ubound(docURLsplit))
    pdfURL             = Left(docURL, Len(docURL) - Len(docExt) -1) & ".pdf"
    Dim storeArgs(0) As New com.sun.star.beans.PropertyValue
    storeArgs(0).Name  = "FilterName"
    storeArgs(0).Value = "writer_pdf_Export"
    theDoc.storeToURL(pdfUrl, storeArgs())
     
    end sub
    '-----------------------------------------------------------------------------------------------

  6. #6
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Je progresse...mais il y a encore une dernière étape.

    En fait la location doit être "application"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyScript := OLEDocument.getScriptProvider.getScript('vnd.sun.star.script:Standard.Module1.test?language=Basic&location=application');
    Maintenant j'ai bien un objet MyScript valide et sans qu'aucune erreur ne soit executée.

    Comment lancer le script ?

    En cherchant, j'ai trouvé ça mais je ne sais pas comment le porter en Delphi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      MyScript.invoke(Array(), Array(), Array())

  7. #7
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    C'est bon, je tiens la solution, voici le code résultant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm1.BtnRunMacroClick(Sender: TObject);
    var
     MyScript : variant;
     P1,P2,P3: variant;
    begin
      MyScript := OLEDocument.getScriptProvider.getScript('vnd.sun.star.script:Standard.Module1.test?language=Basic&location=application');
      P1  := VarArrayCreate([0, -1], varVariant);
      P2  := VarArrayCreate([0, -1], varVariant);
      P3  := VarArrayCreate([0, -1], varVariant);
      MyScript.invoke(P1,P2,P3)
    end;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Executer une Macro Access à partir d'Excel (avec VBA)
    Par math78 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 08/11/2006, 15h05
  2. [Macro] Exécuter une macro en fonction d'un contrôle
    Par sugan dans le forum VBA Access
    Réponses: 6
    Dernier message: 02/10/2006, 17h02
  3. Executer une macro Word depuis VB 6.0
    Par benos59 dans le forum VBA Word
    Réponses: 1
    Dernier message: 10/08/2006, 18h37
  4. comment executer une macro?$
    Par khaliloum dans le forum IHM
    Réponses: 1
    Dernier message: 11/06/2006, 17h41
  5. execute une macro via vba sous access
    Par nes dans le forum Access
    Réponses: 4
    Dernier message: 29/03/2006, 00h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo