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

OpenOffice & LibreOffice Discussion :

Macro pour collage normal [LibreOffice][Tableur]


Sujet :

OpenOffice & LibreOffice

  1. #1
    Futur Membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Points : 6
    Points
    6
    Par défaut Macro pour collage normal
    Bonjour,

    Préambule :
    Désolé si la question a déjà été posée, j'ai passé des heures à chercher sur le net des questions approchant mais comme je comprends presque rien sur le code basic des macros et que la documentation semble inexistante je baisse les bras.

    Problème :
    je voudrais juste coller des lignes récupérées ailleurs (en l'occurrence ça vient d'un copier de données sur console linux) sans que le programme n'ouvre de fenêtre import de texte (surtout qu'à chaque fois je fais juste "entrée" puisque les options présélectionnées sont déjà les bonnes). Un enregistrement de macro sur un collage normal ou spécial ne fonctionne pas puisque visiblement il se fout que l'on appuie sur entrée et ne prend pas ça en compte.

    Format d'entrée (texte copié au préalable) :
    des lignes avec juste des nombres séparés par des ";" avec aussi des champs vides.
    exemple :
    1;4320;3;0;1;;;;;;;;0;1;18000;2;0;1;-1;-1;-1;-1;68,0
    2;26200;9;2;2;;;;;;;;18000;2;25000;4;25000;3;25000;5;10000;1;67,0

    Résultat voulu :
    les mêmes lignes de nombres répartis sur des colonnes différentes

    Si une bonne âme experte en ce genre d'obscur langage pouvait m'aider, je suis sûr que ça lui prendrait pas plus de 5mn.

  2. #2
    Membre averti Avatar de Mobydick_62
    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2009
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2009
    Messages : 260
    Points : 386
    Points
    386
    Par défaut Collage
    Bonjour,
    Si j'ai bien compris ton problème tu veux copier dans le presse papier une ligne contenant des données séparées par des ";" et ensuite coller le tout sur des colonnes de Calc (un peu comme l'import d'un ficher csv).
    Voici une solution par macro (voir pièce jointe).
    Il faut copier la ligne en question et la coller dans une cellule (A1) et ensuite cliquer sur le bouton insérer. La macro créée un tableau de données et les insère dans les colonnes.
    Ce n'est qu'un exemple. Si cela te convient il faudra changer le code pour savoir quelle sera la cellule source (celle qui contient les données) et les cellules de destination.
    Cordialement
    Fichiers attachés Fichiers attachés
    Libre Office Version: 7.4.3.2 (x64)
    Windows 10

  3. #3
    Futur Membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Bonjour et merci de s'intéresser au problème.
    En fait, c'est toujours plusieurs lignes de ce type que j'ai à copier coller. La question c'est : Comment coller le contenu du presse-papier (la macro ne s'occupe pas du copiage) qui contient ces lignes à l'endroit où je me trouve dans la feuille (c'est à dire donc en commençant par la cellule où je me trouve) mais sans remplir par des 0 les champs nuls ?

  4. #4
    Membre averti Avatar de Mobydick_62
    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2009
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2009
    Messages : 260
    Points : 386
    Points
    386
    Par défaut Collage
    Bonjour,
    Pour ce qui de ne pas insérer les zéros, il suffit dans le code de mettre une condition IF .
    Pour l'insertion à l'endroit du curseur il faut récupérer les coordonnées de la cellule active. Le code ci dessous remplace l'autre :
    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
    Sub Insertion()
     Dim vTab() As Variant 
     Dim sReg As String 
     Dim oFeuille, oCellSource As Object
     Dim indexLigne, indexColonne
     oFeuille = ThisComponent.getSheets.getByName("Feuille1")
     'Cellule source dans laquelle se trouve le texte à traiter
     oCellSource = oFeuille.getCellRangeByName("A1")
     'Je récupère les coordonnées de la cellule active
     oCellDest = ThisComponent.CurrentSelection
     indexLigne = oCellDest.GetCellAddress.Row
     indexColonne = oCellDest.GetCellAddress.Column
     'Je récupérère la chaine de caractère collée dans la cellule A1
     sReg = oCellSource.String
     If sReg = "" Then 
      msgBox "La cellule A1 ne contient aucune données", 16, "ERREUR"
      Exit Sub 
     End If  
     'Je "split" la chaine séparée par un ";" pour en faire un tableau
     vTab = Split(sReg,  ";" ) 
     'Insertion des éléments du tableau dans les colonnes
     Dim x As Integer
     For x = LBound(vTab()) to Ubound(vTab())
      If Val(vTab(x)) = 0 Then GoTo JePasse
      oFeuille.getCellByPosition(indexColonne,indexLigne).Value = Trim(vTab(x)) 'Trim pour supprimer les espaces possibles
      JePasse:
      indexColonne = indexColonne+1 
     Next x
     End Sub
    Par contre pour ce qui est du presse papier il faut savoir que celui-ci est géré par le système d'exploitation et pas par Libre office ou open office.
    Des solutions semblent exister pour le SE Windows mais pour Linux je n'en sais rien.
    Cordialement
    Libre Office Version: 7.4.3.2 (x64)
    Windows 10

  5. #5
    Futur Membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Oui c'est dommage, à part le problème du presse-papier, ce serait tout à fait ça, bon boulot.
    Une macro générée à l'enregistrement donne un code avec cette instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
    Et je me demandais si y'avait pas des options de cette méthode pour se passer de l'apparition de la fenêtre d'import. Par exemple, je comprends pas à quoi sert le "" ni le 0 dans la commande vu que c'est super mal documenté.
    Sinon, si cette piste est fausse, y'a vraiment pas moyen de définir sReg autrement ?

  6. #6
    Membre averti Avatar de Mobydick_62
    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2009
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2009
    Messages : 260
    Points : 386
    Points
    386
    Par défaut Collage presse papier
    Bonjour
    y'a vraiment pas moyen de définir sReg autrement
    L'idéal serait de récupérer le presse papier dans la variable sReg et ensuite de traiter cette variable. Après avoir parcouru de nombreux forum je n'ai pas trouvé de solution pour Linux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
    L'utilisation du Dispatcher permet effectivement de copier dans le presse papier mais cette commande est interne à Open Office ou Libre office.
    Donc elle ne fonctionne qu'à l'intérieur de ces applications.

    Partant de ce principe et en utilisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dispatcher.executeDispatch(oCC.Frame, ".uno:Paste", "", 0, Args)
    on peut faire une bidouille.

    Je m'explique : on copie ta ligne dans le presse papier et ensuite on lance la macro qui va coller provisoirement dans une cellule. Le contenu de cette cellule est placée dans la variable sReg. Et là on peut traiter. A la fin on efface cette cellule provisoire. Cette cellule provisoire peut se trouver ailleurs que dans A1.

    Je te joins un nouveau fichier sur lequel j'ai associé une combinaison de touche pour lancer la macro (Ctrl+C)
    Donc pour faire clair : Tu ouvres le fichier. Ensuite tu copie ta fameuse ligne depuis ta console. Tu reviens sur le tableur et tu fait Ctrl+C et tout se fait automatiquement.
    C'est de la bidouille mais je n'ai rien trouver d'autre.
    Cordialement
    Fichiers attachés Fichiers attachés
    Libre Office Version: 7.4.3.2 (x64)
    Windows 10

  7. #7
    Membre averti Avatar de Mobydick_62
    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2009
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2009
    Messages : 260
    Points : 386
    Points
    386
    Par défaut Collage presse papier
    J'ai fait une petite erreur. La combinaison Ctrl+C fonctionne bien sur le fichier que j'ai joint. Mails comme cette combinaison est déjà affectée au collage normal, il est donc préférable de réaffecter la macro à une autre combinaison de touche.
    Désolé
    Libre Office Version: 7.4.3.2 (x64)
    Windows 10

  8. #8
    Futur Membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    On n'est pas très loin mais y'a encore des merdouilles. J'ai affecté la macro à la touche F2. Cela marche bien pour le collage d'une ligne mais comme je l'ai dit, je n'utilise jamais qu'une seule ligne, c'est toujours un ensemble de ligne que j'ai à traiter. Je comprends qu'il semble compliqué de récupérer le nombre de lignes et de faire le même traitement pour chacune parce que là évidemment non seulement ça relance la fenêtre d'import de texte mais évidemment ça ne traite jamais que la première ligne. Impasse ?

  9. #9
    Membre averti Avatar de Mobydick_62
    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2009
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2009
    Messages : 260
    Points : 386
    Points
    386
    Par défaut Collage presse papier
    Pas forcément. Quand je copie les deux lignes que tu mets dans ton exemple dans l'un de tes post, et que je colle, alors j'ai bien deux lignes dans la cellule.
    Ce qui veut dire que j'ai un retour à la ligne. Donc on peut normalement récupérer les lignes une par une et ensuite les traiter séparément.
    Il faut que je vois cela de près demain.
    Cordialement
    Libre Office Version: 7.4.3.2 (x64)
    Windows 10

  10. #10
    Futur Membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    merci Mobydick

  11. #11
    Membre averti Avatar de Mobydick_62
    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2009
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2009
    Messages : 260
    Points : 386
    Points
    386
    Par défaut Collage presse papier
    Bonjour,
    Après copie des deux lignes dans ton exemple, la macro colle dans autant de lignes Calc qu'il y a de lignes dans le presse papier.
    Donc voici en pièce jointe les changements effectués.
    Pour faire quelque chose de plus clair, la macro insère provisoirement les lignes dans la feuille 2. Ensuite la macro traite les lignes et les insère à partir de la cellule active de la feuille 1. Ensuite elle efface les données provisoire de la feuille 2.

    Macro déclenchée par la touche F2

    Par contre je ne saisi pas ce que tu dis ci-dessous
    ....que là évidemment non seulement ça relance la fenêtre d'import de texte.....
    Est-ce que ma macro déclenche t'elle une fenêtre d'import ? Parce que chez moi rien ne s'affiche. Tout se fait d'une manière transparente et immédiate.

    Cordialement
    Fichiers attachés Fichiers attachés
    Libre Office Version: 7.4.3.2 (x64)
    Windows 10

  12. #12
    Futur Membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    On est très proche du but, du beau boulot ! Par contre, oui la macro déclenche bien la fenêtre (je suis en 5.2.7.2, c'est peut-être la cause. J'avais installé justement cette version parce que par la suite, les champs vides collés écrasent les formules au lieu de les ignorer. D'ailleurs en version 6 normalement on pourra choisir d'ignorer ou pas les champs vides) et curieusement les 0 ne sont pas affichés et se comportent comme des champs nuls.

  13. #13
    Membre averti Avatar de Mobydick_62
    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2009
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2009
    Messages : 260
    Points : 386
    Points
    386
    Par défaut Collage presse papier
    Pour afficher les 0 il faut changer le code.
    Dans l'éditeur de code tu Clique sur "Affichage" et "numéro de ligne. Cela affiche les n° de ligne de code.

    Tu remplace la ligne 58
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Val(vTab(i)) = 0 Then GoTo JePasse
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If Trim(vTab(i)) = "" Then GoTo JePasse
    Pour ce qui est de la fenêtre d'import je confirme qu'elle ne s'affiche pas. Je suis sur Libre Office Version: 5.4.3.2 (x64) sous Windows 10. (Ordi perso)
    Je n'ai pas fait l'essai sous Linux car aujourd'hui je ne travaille pas et Linux c'est au bureau.

    Par contre
    les champs vides collés écrasent les formules au lieu de les ignorer
    Y a t'il quelque chose d'autre à faire ?
    Libre Office Version: 7.4.3.2 (x64)
    Windows 10

  14. #14
    Futur Membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    non non, c'était juste pour expliquer le choix de version. Et je viens de tester aussi dans une version de dev 6.1, effectivement ça fonctionne sans fenêtre qui apparaît.
    Donc on est bien arrivé au but. Par contre, si je veux éviter de passer en feuille 2 pour la copie provisoire, quel code est à mettre pour disons faire ça en BA1 de la feuille courante ?

  15. #15
    Membre averti Avatar de Mobydick_62
    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2009
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2009
    Messages : 260
    Points : 386
    Points
    386
    Par défaut Collage presse papier
    Bonjour,
    En pièce jointe le fichier corrigé.
    Cordialement
    Fichiers attachés Fichiers attachés
    Libre Office Version: 7.4.3.2 (x64)
    Windows 10

  16. #16
    Futur Membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Super, ne reste plus qu'à attendre la future version de LO. Du bon boulot, je te remercie énormément pour le temps passé à résoudre ce problème.

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

Discussions similaires

  1. [XL-2010] Modifier macro pour collage spécial
    Par Wazapala dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 11/12/2014, 15h28
  2. Réponses: 0
    Dernier message: 12/04/2014, 15h54
  3. macro pour un malloc
    Par salseropom dans le forum C
    Réponses: 4
    Dernier message: 15/02/2006, 11h53
  4. macro pour splashscreen
    Par stoads dans le forum IHM
    Réponses: 20
    Dernier message: 26/11/2005, 13h33
  5. [VBA-E] [help]macro pour dupliquer une feuille (en valeur)
    Par minikisskool dans le forum Macros et VBA Excel
    Réponses: 31
    Dernier message: 07/11/2005, 20h24

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