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

OpenOffice & LibreOffice Discussion :

Communication Calc -> Writer


Sujet :

OpenOffice & LibreOffice

  1. #1
    Nouveau Candidat au Club
    Communication Calc -> Writer
    Bonjour tout le monde,

    Je débute dans les macros Calc, et j'aimerais faire la chose suivante : exporter dans un traitement de texte, à des endroits précis marqués par des sortes de balise, des données extraites de telle ou telle cellule d'un tableur. Après recherche, je constate que c'est assez courant pour Word-Excel (il suffit de taper "communication word excel vba" par exemple), avec pas mal de tuto disponibles, mais pour Libre office cela semble bien plus compliqué de trouver des infos.

    L'idée est, à terme, de pouvoir automatiser la rédaction de rapports sous Writer (en ne créant qu'un fichier mis en forme et prêt pour incorporation de données, ces dernières collectées sur le terrain sous tableur)


    Je suis à peu près certain que cela existe, mais je peine à trouver, peut-être parce que je n'emploie pas le bon vocabulaire, pourriez-vous m'aiguiller vers des tutos ou des discussions ? Désolé si le sujet a déjà été traité dans ces forums...

    Merci d'avance !

  2. #2
    Membre éclairé
    Bonjour Pseudopierre,

    La solution au problème que vous décrivez réside dans le publipostage.

    Pour lequel il faut une lettre-type (un fichier mis en forme et prêt pour incorporation de données)
    et une base de données (données collectées sur le terrain sous tableur)

    Il suffit de fusionner les entêtes de colonnes du tableur (champs) avec
    la lettre-type en les faisant glisser à l'endroit voulu, et de lancer le publipostage



    https://vviale.developpez.com/tutoriels/openoffice-libreoffice/publipostage/
    ou
    https://vviale.developpez.com/tutoriels/openoffice-libreoffice/apprendre-creer-ticket-texte-tableur/
    LibreOffice 6.3.5.2 (x64) FR-YT 07-03-20
    OS : Windows 10.0

  3. #3
    Nouveau Candidat au Club
    Eh bien merci beaucoup pour la réponse rapide !

    J'ai dû mal m'exprimer : à ma connaissance le publipostage sert surtout à éditer des documents courts (1/2, 1 page), dont autant d'exemplaires seront créés qu'il y a de lignes dans le tableur (pour cela, j'utilise plutôt scribus avec le script generator)

    Ici il serait plutôt question de documents longs (plusieurs dizaines de pages) bâtis sur le même modèle mais qui afficheraient au fil des pages, là où les signets sont posés, des données diverses dans le tableur (un peu comme ceci :


    Pour word - excel, facile de trouver des explications, ex : Exactement ce que je cherche à faire mais sur LO. Sur excel, la partie codage est un peu facilitée par l'enregistreur de macro, déjà moins complet dans LOCalc il me semble (mais vu l'intérêt de la manœuvre sur le long-terme, je veux bien mettre les mains dans le cambouis et manger du Basic...)

  4. #4
    Membre habitué
    Communication Calc -> Writer
    Bonjour,

    Un petit exemple de ce que l'on peut faire par macro pour ouvrir un document WRITER basé sur un modèle, et ensuite récupérer des données CALC et insertion dans le document.
    Ne connaissant pas ton niveau en macro j'ai détaillé et simplifié au mieux.

    ATTENTION : le fichier CALC et le modèle WRITER doivent se trouver dans le même répertoire.
    J'ai mis un bouton sur la feuille CALC pour lancer la macro.

    FONCTIONNEMENT : ouvrir le document CALC. Placer le curseur sur la ligne de données que l'on veut (1, 2 ou 3). Cliquer sur le bouton. La macro va ouvrir un document WRITER basé sur le modèle et insérer les données de la ligne sélectionnée.

    P.S : J'ai fait au plus simple car ne connaissant pas tes réels besoins.....




    Cordialement
    Libre Office Version: 6.3.4.2 (x64)
    Windows 10

  5. #5
    Nouveau Candidat au Club
    Wow, merci ! C'est incroyable de voir qu'en quelques heures, quelqu'un a déjà pris la peine de taper du code et créer des fichiers pour l'exemple !

    J'ai pris le temps de lire la macro et de tester avec des fichiers perso, et c'est presque ce dont j'ai besoin : l'incorporation des données calc sur writer à l'endroit indiqué par les repères de texte fonctionne parfaitement. Le seul petit problème réside dans la ligne suivante :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     'Récupération des coordonnées de la ligne de la cellule active
      oCell = ThisComponent.getCurrentSelection
      indexLigne = oCell.GetCellAddress.Row+1


    Ceci m'oblige à sélectionner une ligne à exporter, et limite l'édition automatisée du document Writer aux données de cette seule ligne. Est-ce que j'ai raison de penser qu'en farfouillant un peu, je pourrais mettre la main sur une commande définissant plutôt les cellules à exporter par leur coordonnées dans le tableur (et pas la cellulle sélectionnée + 1 colonne vers la droite comme ici si j'ai bien compris) ? L'idée serait de pouvoir exporter (en une fois et sur un seul document Writer) les données de 30, 50 ou 150 cellules (pas toutes situées sur la même ligne).

    Je m'emballe mais, au prix d'un gros travail de mise en page sur le document writer de base, et si c'est bien fait, on devrait pouvoir lancer la macro et regarder le fichier s'éditer page après page... Et même incorporer des diagrammes issus eux-mêmes de macro... Le délire !

    Bon, je comprendrais que vous ayez autre chose à faire que de taper des lignes de codes pour moi, je vais donc essayez de trouver la solution en ligne sur un tuto répertoriant les commandes basic les plus communes (mon niveau perso est à peu près nul), je devrais bien finir par trouver quelque chose (ici par exemple ? https://help.libreoffice.org/6.3/fr/...mp;System=UNIX)

    Merci encore !

  6. #6
    Membre habitué
    Communication Calc -> Writer
    je pourrais mettre la main sur une commande définissant plutôt les cellules à exporter par leur coordonnées dans le tableur
    Oui bien sûr il est possible très facilement de récupérer les valeurs de dizaines de cellules disséminées un peu partout dans le tableur

    Et même incorporer des diagrammes issus eux-mêmes de macro
    Là aussi c'est possible. Le plus simple est que le graphique existe déjà sur la tableur dans une autre feuille par exemple et par macro l'insérer dans le document WRITER. On peut aussi "fabriquer" le graphique de toute pièce en ligne de code mais c'est bien plus compliqué. C'est faisable car je l'ai déjà fait.

    Pour revenir aux cellules à récupérer on peut écrire directement :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    EcrireAuSignet("Pourcentage", oFeuille.getCellRangeByName("A2".String )
    EcrireAuSignet("Ville", oFeuille.getCellRangeByName("C20".String )
    'ect.....


    Par contre pour cela fait autant de lignes que de cellules à incorporer (150 dans ton exemple). Donc là il va falloir passer par un tableau contenant toutes les cellules à traiter du genre :
    En considérant que les cellules soient sur une même feuille. S'il existe plusieurs feuilles il faudra donc faire différemment.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    Dim tabCell() As String
    tabCell() = Array ("A2", "C12", "E15", "D3", "D22", "V40", "F5")


    Pour le document créer des signets du genre Signet1, Signet2, Signet3, Signet4......

    Et ensuite on fait une boucle pour insérer les données en ne faisant que 4 ou 5 lignes de code.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim a As Long
    a = 1
    For x = LBound(tabCell()) to Ubound(tabCell())
    EcrireAuSignet("Signet" & a, oFeuille.getCellRangeByName(tabCell(x).String )
    a = a+1
    Next x


    Cordialement
    Libre Office Version: 6.3.4.2 (x64)
    Windows 10

  7. #7
    Nouveau Candidat au Club
    J'ai un peu tardé à répondre, le temps de tester tout ça (et d'installer linux sur un smartphone, pas marrant...).

    La désignation des cellules par leurs coordonnées fonctionne très bien, pas de souci, en revanche je ne comprends pas tellement cette partie-ci :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    Dim tabCell() As String
    tabCell() = Array ("A2", "C12", "E15", "D3", "D22", "V40", "F5")


    ni cette histoire de boucle :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim a As Long
    a = 1
    For x = LBound(tabCell()) to Ubound(tabCell())
        EcrireAuSignet("Signet" & a, oFeuille.getCellRangeByName(tabCell(x).String )
        a = a+1
    Next x



    A la rigueur, peu importe pour le moment, la technique qui consiste à insérer autant de ligne de code type EcrireAuSignet("PourcentageBrest", oFeuille.getCellRangeByName("A3").String ) (en faisant bien gaffe à la correspondance signet - coordonnées de cellule) fonctionne parfaitement pour mon usage, c'est juste un peu lourd.

    Je reste la dessus pour l'instant, donc, et bosserai tout ça plus tard.

    La dernière chose pour parfaire le code que vous m'avez fourni reste donc la gestion de feuilles multiples dans le tableur. J'ai bêtement tenté de définir, part exemple, la cellule A3 de la deuxième feuille comme suit :
    oFeuille1.getCellRangeByName("A3") ou encore : oFeuille.getCellRangeByName("$Feuille2.A3")... Je sais pas pourquoi j'y ai cru... Je continue à chercher.

    Encore merci pour toutes ces lignes de code !

  8. #8
    Membre habitué
    Communication Calc -> Writer
    Bonjour,
    Pour récupérer les valeurs des cellules des autres feuilles, c'est simple. Dans le fichier que je t'ai fourni j'avais déclaré dans une variable objet "oFeuille" la feuille sur laquelle je voulais travailler.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    Dim oFeuille As Object
    oFeuille = ThisComponent.getSheets.getByName("Feuille1")


    Si tu veux insérer des valeur d'autres feuilles, plusieurs solutions :
    1. Déclarer autant de variables objets que de feuilles du genre :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim oFeuille1 As Object, oFEuille2 As Object, oFeuille3 As Object
    oFeuille1 = ThisComponent.getSheets.getByName("Feuille1")
    oFeuille2 = ThisComponent.getSheets.getByName("Feuille2")
    oFeuille3 = ThisComponent.getSheets.getByName("Feuille3")
    EcrireAuSignet("PourcentageBrest", oFeuille1.getCellRangeByName("A3").String )
    ...ect...
    EcrireAuSignet("PourcentageNantes", oFeuille2.getCellRangeByName("B2").String )
    ...ect...
    EcrireAuSignet("PourcentageLille", oFeuille3.getCellRangeByName("L6").String )
    ...ect...


    ou bien ne garder que la variable oFeuille et la re-déclaler au fur et à mesure du genre :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    oFeuille = ThisComponent.getSheets.getByName("Feuille1")
    EcrireAuSignet("PourcentageBrest", oFeuille.getCellRangeByName("A3").String )
    EcrireAuSignet("PourcentageNantes", oFeuille.getCellRangeByName("B4").String )
    EcrireAuSignet("PourcentageLille", oFeuille.getCellRangeByName("L12").String )
    'JE désigne la nouvelle feuille
    oFeuille = ThisComponent.getSheets.getByName("Feuille2")
    EcrireAuSignet("PourcentageMarseille", oFeuille.getCellRangeByName("B1").String )
    EcrireAuSignet("PourcentageBordeaux", oFeuille.getCellRangeByName("E5").String )
    EcrireAuSignet("PourcentageNice", oFeuille.getCellRangeByName("P4").String )
    'JE désigne la nouvelle feuille
    oFeuille = ThisComponent.getSheets.getByName("Feuille3")
    EcrireAuSignet("PourcentageParis", oFeuille.getCellRangeByName("K2").String )
    ...etc.....


    Tu suis ?

    Cordialement
    Libre Office Version: 6.3.4.2 (x64)
    Windows 10

  9. #9
    Membre habitué
    Communication Calc -> Writer
    Pour ce que tu ne comprends pas, c'est juste que pour éviter d'écrire trop de lignes de code je passe par un tableau virtuel dans lequel je déclare les signets et les cellules à traiter.
    Et pour l'écriture je balaye le tableau du début à la fin en faisant ce que l'on appelle un boucle. Ce qui limite de réécrire (EcrireAuSignet........)

    Code :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
      'Déclaration des variables de type tableau à deux dimensions
      'Tableau contenant en 1ère valeur le signet et en 2ème la cellule correspondante
      Dim tabFeuille1(2) As Variant 'Feuille 1 à traiter
      'Tableau qui contient 3 lignes, donc index 2 entre parenthèses car un  tableau commence par 0 (0,1,2)
      tabFeuille1(0) = Array ("PourcentageBrest", "A2")
      tabFeuille1(1) = Array ("PourcentageNantes", "B5")
      tabFeuille1(2) = Array ("PourcentageLille", "E5")
     
      Dim tabFeuille2(4) As Variant 'Feuille 2 à traiter
      'Tableau qui contient 5 lignes, donc index 4 entre parenthèses car un  tableau commence par 0 (0,1,2,3,4)
      tabFeuille2(0) = Array ("Nom", "A2")
      tabFeuille2(1) = Array ("Prenom", "B5")
      tabFeuille3(2) = Array ("Adresse", "F6")
      tabFeuille3(3) = Array ("Profession", "A7")
      tabFeuille3(4) = Array ("Voiture", "H3")
     
     
     Dim x As Long  
     'Ecriture dans le document du tableau de la feuille 1 (tabFeuille1)
     For x = LBound(tabFeuille1()) to Ubound(tabFeuille1())
        'Pour info x correspond à la ligne du tableau à traiter. Elle s'incrémente de 1 au fur et à mesure jusqu'à la lecture complète jusqu'à la dernière ligne.
        'tabFeuille1(x)(0) : (0) correspond à la 1ère valeur (signet)
        'tabFeuille1(x)(1) : (1) correspond à la 2ème valeur (cellule à traiter)
        EcrireAuSignet(tabFeuille1(x)(0), tabFeuille1(x)(1))
     Next x  
     
     'Ecriture dans le document du tableau de la feuille 2 (tabFeuille2)    
     For x = LBound(tabFeuille2()) to Ubound(tabFeuille2())
        EcrireAuSignet(tabFeuille2(x)(0), tabFeuille2(x)(1))
     Next x


    Cordialement
    Libre Office Version: 6.3.4.2 (x64)
    Windows 10

###raw>template_hook.ano_emploi###