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 :

Classer des cellules colorees par couleur


Sujet :

OpenOffice & LibreOffice

  1. #1
    Candidat au Club
    Homme Profil pro
    gendarme
    Inscrit en
    Avril 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : gendarme
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2016
    Messages : 13
    Points : 3
    Points
    3
    Par défaut Classer des cellules colorees par couleur
    Bonjour a tous

    j aimerai une macro qui trie des cellules colorer par formatage conditionnel par couleur - je joins le fichier en question - C'est la plage A5:A11 que j'aimerai reportee en AB5:AB11 et triée par couleur - C'est compliqué pour moi car déja je n'arrive pas a trier des cellules qui ont un formatage conditionnel -
    Merci de votre aide
    Bob
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    puisque tes conditions ont l'air d'être liées au classement, pourquoi ne fais-tu pas un tri en fonction du classement ?

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Candidat au Club
    Homme Profil pro
    gendarme
    Inscrit en
    Avril 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : gendarme
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2016
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    j ai un classement effectivement sur une autre colonne avec les memes couleurs mais le tri dans le menu "donnée" "trier "ne fonctionne pas si j ai un formatage conditionnel sur les cellules a trier c est pour cela qu une macro me serait utile et je voudrais garder le nom des communes avec les couleurs dans la colonne a trier et surtout reporter la colonne a trier sur d autre plage pour ne pas bouger les cellules de mon tableau de donnees

    En fait pour etre vraiment plus precis je ne voudrais pas toucher au tableau des colonnes A à M et simplement copier la colonne A sur la col AB et faire le classement par couleur sur la col AB pour plus de lisibilité au niveau stat
    merci

  4. #4
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    puisque la gestion des tableaux et le tri des tableaux n'est pas facile en oo Basic, je te propose une macro en python (pour changer un peu de la routine )

    Le principe :
    je crée une classe Commune qui comprend trois éléments : le nom , la place , la couleur. La couleur est calculée au moment de l'initialisation de la classe en fonction de la place.

    la macro consiste à 1 :
    - Balayer les lignes 5 à 11 de la feuille et récupérer le nom de la commune et sa place pour créer une instance de classes. Cette instance de classe est mise dans un tableau (mesCommunes)
    - Ensuite on trie le tableau en fonction de la place.
    - Ensuite on écrit les communes du tableau en colonne X avec la couleur qui va bien.

    voici le code :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #   exemple de macro python pour libreoffice
    #   macro en : C:\Users\<nom du user>\AppData\Roaming\LibreOffice\4\user\Scripts\python\classement.py
    #   Outils/Macros/Gérer les Macros/Python  Mes Macros/classement   exécuter test_classement
    #   testé avec Libreoffice 5.1 sous WINDOWS 7
    #   J.P  mai 2016
    #
    class Commune():
        "Enregistre des proprietes"
        def __init__(self, nom,place):
            self.nom = nom
            self.place = place
            self.couleur = self.calcCouleur()
     
        def calcCouleur(self):
            if self.place <= 2:
                couleur = 0xff8080 # rouge
            elif  2 < self.place < 5:
                couleur = 0xffff80 # jaune
            elif self.place > 4:
                couleur = 0x80ff80 # vert
            else:
                couleur = 0xffffff # blanc
            return couleur
     
     
    def test_classement( ):
        """on Balaie les communes,on les trie, on les écrit ailleurs"""
    #get the doc from the scripting context which is made available to all scripts
        desktop = XSCRIPTCONTEXT.getDesktop()
        calc = desktop.getCurrentComponent()
        sheet = calc.getSheets().getByIndex(0) #1ere feuille du classeur
        # on balaie les lignes pour tester les Communes
        mesCommunes = []
        for i in range(4,11):
            # nom en colonne A (0)
            nom = sheet.getCellByPosition(0, i).getString()
            # place en colonne M (12)
            place = sheet.getCellByPosition(12, i).Value
            mesCommunes.append(Commune(nom,place))
        # on trie le tableau de communes en fonction de la place
        mesCommunes.sort(key=lambda Commune: Commune.place)
        # on écrit les communes triées par place en colonne X
        for i in range(0,7):
            cell = sheet.getCellByPosition(23, i+4)
            cell.String = mesCommunes[i].nom
            # place en W si on veut
            #sheet.getCellByPosition(22, i).Value = mesCommunes[i].place    
            cell.CellBackColor = mesCommunes[i].couleur
        return None
    et voilà que cela donne en exécution de macro :
    Nom : LibreOffice-python-Communes.jpg
Affichages : 4265
Taille : 140,6 Ko

    Attention le code Python est très "chatouilleux" en ce qui concerne l'indentation (décalage par rapport au bord du texte). Un copier coller dans un fichier risque de ne pas fonctionner. En pièce jointe le fichier en python à mettre dans C:\Users\<nom du user>\AppData\Roaming\LibreOffice\4\user\Scripts\python\classement.py ou à un endroit équivalent suivant la version de LibreOffice et de l'O.S utilisé. Si une modification est à faire dans le code, attention aux indentations.
    La macro test_classement doit normalement apparaître dans Outils/Macros/Gérer les Macros/Python Mes Macros/


    Ami calmant, J.P
    Fichiers attachés Fichiers attachés
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #5
    Candidat au Club
    Homme Profil pro
    gendarme
    Inscrit en
    Avril 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : gendarme
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2016
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Merci JP pour ton boulot qui fonctionne a merveille sur mon ordi avec win 10 !!!
    en fait au boulot on a ubuntu et en plus on n a pas acces aux fichiers systemes donc impossible de mettre le fichier classement.py sans compter que mon fichier doit pour etre utilisable dans toutes les gendarmerie de France sans copier un fichier sous c:
    peux-tu la transformer en basic libreoffice pour que je puisse mettre la macro sous lafeuille de mon fichier
    il est vrai que je connais rien en python car j ai essayer de changer de colonne comme tu indique sur ta macro, j ai essaye avec notepad mais ca fonctionne plus ensuite
    (j ai remplace la ligne "cell = sheet.getCellByPosition(23, i+4)" par la ligne "sheet.getCellByPosition(22, i).Value = mesCommunes[i].place") mais j ai une erreur alors je ne sais pas si on peut modifier avec le bloc notes

    Enfin dans tous les cas merci pour le taf trop fort
    Bob

  6. #6
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    j'ai un programme en python qui permet "d'injecter" une macro en python dans le fichier libreoffice.
    pour pouvoir l'utiliser il faut avoir python version 3 installé et exécutable à partir d'une fenêtre console (windows) ou un terminal linux (sous ubuntu par exemple).
    ce programme s'appelle inserer_macro.py. Il faut mettre ce fichier , la macro et son fichier libreoffice dans le même répertoire.
    voici la syntaxe par exemple sous ubuntu : python3 inserer_macro.py "stat bta st gely.ods" classement.py
    un répertoire avec_macro est créé où l'on retrouve le fichier libreoffice avec la macro python inclus dedans :
    Nom : Capture LibreOffice Python.png
Affichages : 4385
Taille : 70,6 Ko
    j'ai édité le fichier classement.py avec gedit sous ubuntu, cela n'a pas l'air de le "véroler" . J'ai fait la modif que tu voulais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     for i in range(0,7):
            cell = sheet.getCellByPosition(23, i+4)
            cell.String = mesCommunes[i].nom
            # place en W si on veut
            sheet.getCellByPosition(22, i+4).Value = mesCommunes[i].place    
            cell.CellBackColor = mesCommunes[i].couleur
        return None
    En pièce jointe le programme python d'insertion de macro

    ami calmant, J.P
    Fichiers attachés Fichiers attachés
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  7. #7
    Candidat au Club
    Homme Profil pro
    gendarme
    Inscrit en
    Avril 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : gendarme
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2016
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    C est du nickel JP j ai pu changer ma colonne
    j ai un autre petit souci aurait tu la syntaxe sous windows pour python3 car le manuel n anglais est tres compliqué !!!! En plus les ordi linux Gendarmerie sont bloquer et je ne pourrais pas installer python3 donc je travaille sur mon perso !
    aurais tu le code couleur du noir car je vais rajouter une 4eme couleur - je ne trouve pas ces code sur le net ! en fait j ai modifie mon fichier stat d origine avec maintenant 27 commune et j essaye tout seul d y travailler dessus mais c'est dur car moi et le python n est pas copain !!
    et je t embete encore pour lancer la macro classement avec un bouton il me met une erreur et si j incorpore le nom de la macro dans une macro (comme semaine forte) pour qu il la lance ca marche pas
    peut etre une fois quelle sera incorporé avec python 3 ca ira mieux ?

    merci a toi JP

  8. #8
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    si tu as installé python 3.x (x = sous version exemple 5) sur ton ordi sous windows, il doit se trouver sous c:\python3x.
    Pour incorporer la macro de classement.py dans ton document, Il faut mettre classement.py, stat bta st gely.ods, inserer_macro.py dans le même répertoire et lancer dans une invite de commande : c:\python3x\python inserer_macro.py "stat bta st gely.ods" classement.py. Un répertoire avec_macro est créé où l'on retrouve le fichier libreoffice avec la macro python incluse dedans.
    Si à ton boulot tu es sous ubuntu, il y a de grandes chances que python soit déjà installé. Pour voir si cela est le cas, taper dans une fenêtre de terminal : python3
    En ce qui concerne l'affectation d'une macro python à un bouton il y a effectivement un problème : il faut rajouter un paramètre dans l'appel de la fonction test_classement dans le fichier classement.py :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def test_classement(*args):
    pour le noir c'est la valeur 0 ou 0x000000 . En fait on a 0xrrvvbb rr, vv , bb étant les valeurs des composantes rouge vert bleu en hexa max par composante = 255 en décimal = ff en hexa

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  9. #9
    Candidat au Club
    Homme Profil pro
    gendarme
    Inscrit en
    Avril 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : gendarme
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2016
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    merci encore JP pour ta disponibilite
    je suis arrive a integre la macro dans le fichier mais comme j utilise un nouveau fichier à 27 communes cette fois et 4 couleurs j'ai essayer de bidouiller ta macro pour l adapter au nouveau fichier mais forcement quand on y connait pas grand chose a python on se plante - je te joins le nouveau fichier avec macro integree tu vas y trouver certainement un paquet de non sens !!!!
    par contre j'ai essayer de mettre la ligne "def test_classement(*args):" mais la la macro n apparait carrement plus dans la liste des macro
    en gros je suis un gros nul en python et ailleurs je pense aussi
    mais je tenais a te remercier pour ta patience et ton talent
    Fichiers attachés Fichiers attachés

  10. #10
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    c'est normal que tu ais des problèmes avec la macro car il y a des "trous" dans les lignes où se trouvent les noms des communes. L'astuce consiste pendant le balayage à regarder si il y a quelque chose dans la colonne de la place (si il y a quelque chose alors valeur > 0) et ne mettre dans le tableau que si il y a une place > 0.
    Tu ne testes pas non plus la couleur jaune.
    Je n'ai pas de problème en mettant un paramètre *args dans la macro.
    Il y a aussi le balayage finale par rapport à la taille du tableau ( len(mesCommunes))
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    class Commune():
        "Enregistre des proprietes"
        def __init__(self, nom,place):
            self.nom = nom
            self.place = place
            self.couleur = self.calcCouleur()
     
        def calcCouleur(self):
            if self.place <= 4:
                couleur = 0x000000 # noir
            elif  4 < self.place < 10:
                couleur = 0xff8080 # rouge
            elif  9 < self.place < 15:
                couleur = 0xffff80 # jaune
            elif self.place > 14:
                couleur = 0x80ff80 # vert
            else:
                couleur = 0xffffff # blanc
            return couleur
     
    def test_classement(*args):
        """on Balaie les communes,on les trie, on les écrit ailleurs"""
    #get the doc from the scripting context which is made available to all scripts
        desktop = XSCRIPTCONTEXT.getDesktop()
        calc = desktop.getCurrentComponent()
        sheet = calc.getSheets().getByIndex(0) #1ere feuille du classeur
        # on balaie les lignes pour tester les Communes
        mesCommunes = []
        for i in range(5,46):
            # nom en colonne A (0)
            nom = sheet.getCellByPosition(0, i).getString()
            # place en colonne M (12)
            place = sheet.getCellByPosition(12, i).Value
            if place>0:
                mesCommunes.append(Commune(nom,place))
        # on trie le tableau de communes en fonction de la place
        mesCommunes.sort(key=lambda Commune: Commune.place)
        # on écrit les communes triées par place en colonne X
        for i in range(0,len(mesCommunes)):
            cell = sheet.getCellByPosition(41, i+4)
            cell.String = mesCommunes[i].nom
            # place en W si on veut
            #sheet.getCellByPosition(40, i).Value = mesCommunes[i].place
            cell.CellBackColor = mesCommunes[i].couleur
        return None
    En pièce jointe le fichier classement.py avec les corrections.

    Ami calmant, J.P
    Fichiers attachés Fichiers attachés
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  11. #11
    Candidat au Club
    Homme Profil pro
    gendarme
    Inscrit en
    Avril 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : gendarme
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2016
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Impeccable JP ca marche du tonnerre - par contre il manque une commune car y en a 27 et dans le tableau trier il y en a que 26 !!
    je vais essayer un bouton et une insertion de la macro dans le fichier et cela sera parfait
    grand merci a toi "maitre python" !

  12. #12
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    l'erreur vient de la ligne :
    il faut mettre :
    car 4 c'est la ligne 5
    0 -> ligne 1 1 -> ligne 2 etc ....
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  13. #13
    Candidat au Club
    Homme Profil pro
    gendarme
    Inscrit en
    Avril 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : gendarme
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2016
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Ah OK nickel je fais ca
    une derniere petite question (c est juré) !!!
    j ai integre la macro au fichier et fais un bouton et ca marche mais est il possible de mettre une commande a la fin des macro "semaine forte" et "semaine normale" afin de lancer la macro classement ?
    merci a toi JP

    Je viens de faire la modif "for i in range(4,46):" mais j ai toujours 26 communes au lieu de 27 !

  14. #14
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    moi j'ai bien 27 communes avec la modif. Peut-être n'as-tu pas mis à jour le fichier python où il faut.
    Pour appeler une macro python à partir du basic , ce n'est pas si facile que cela, il faut utiliser un bout de code à mettre dans son code basic :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub ClassementPython
    Dim scriptPro As Object, myScript As Object
    scriptPro = ThisComponent.getScriptProvider()
    oScript = scriptPro.getScript("vnd.sun.star.script:classement.py$test_classement?language=Python&location=document")
    oScript.invoke(Array(), Array(), Array() )
    End Sub
    Pour appeler la macro de classement à la fin d'exécution de semainesnormales et semainesfortes il suffit alors que tu appelles ClassementPython :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ClassementPython
    ProtegerFeuille 
    End Sub
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  15. #15
    Candidat au Club
    Homme Profil pro
    gendarme
    Inscrit en
    Avril 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : gendarme
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2016
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Ca y est tout marche a la perfection grace a ton génie
    j'aimerai manipuler les ligne de code comme toi
    je te remerci encore pour ta patience et merci de partager ton savoir avec d autre comme moi qui essaye de dechiffrer les codes avec plus ou moins de succes
    je reste en contact sur ce site on sait jamais je pourrais aider quelqu un qui sait !!!
    merci JP bon Week
    Bob

    Je reviens vers toi JP une fois de plus car je viens a nouveau de modifier mon fichier pour plus de lisibilité mais je coince - en fait j ai dessine chaque commune (outil dessin main levee) et j aimerai que la couleur de fond change comme dans le tableau (si st gely est noir dans le tableau la couleur de fond est noire sur la carte) mais en fait meme en donnant un nom a chaque dessin (commune) c est une cellule qui apparait en haut a gauche du tableur - peut on avoir une macro remplissant la couleur de fond d un dessin sous condition alors que ce dessin n a pas de nom ? je coince !
    je joins le nouveau fichier
    trop perfectionniste mais pas assez intelligent !!!!!!!
    merci
    Fichiers attachés Fichiers attachés

  16. #16
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    tu devrais t'en sortir avec cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def colore_zone(mesCommunes):
        desktop = XSCRIPTCONTEXT.getDesktop()
        calc = desktop.getCurrentComponent()
        sheet = calc.getSheets().getByIndex(0) #1ere feuille du classeur
        Page =  sheet.DrawPage
        for i in range(0,Page.Count):
            oShape = Page.getByIndex(i)
            if oShape.ShapeType == "com.sun.star.drawing.ClosedBezierShape":
                for j in range(0,len(mesCommunes)):
                    if oShape.Name == mesCommunes[j].nom:
                        oShape.FillColor =  mesCommunes[j].couleur
                        if oShape.FillColor == 0:
                            oShape.FillColor = 0xc080ff
                        break
    la fonction est appelée dans test_classement après le tri des communes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        # on trie le tableau de communes en fonction de la place
        mesCommunes.sort(key=lambda Commune: Commune.place)
        colore_zone(mesCommunes)
    principe :
    On balaie toutes les formes de la feuille. On teste si la forme est une courbe de béziers fermée (tes zones). On cherche le nom de la zone dans le nom des communes et si cela correspond on colore la zone en fonction de la couleur de la commune.
    Je change la couleur si c'est noir en mauve (car du texte noir sur fond noir on ne voit pas grand chose ).
    Attention tu as des noms de zone qui ne correspondent pas au nom des communes, il faut les corriger (par exemple nom de zone : STGELY devrait être ST GELY DU FESC
    Tout cela est aussi faisable en oo Basic mais je suis resté en Python
    voici ce que cela donne :
    Nom : Python_zone_calc.png
Affichages : 4016
Taille : 76,2 Ko

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  17. #17
    Candidat au Club
    Homme Profil pro
    gendarme
    Inscrit en
    Avril 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : gendarme
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2016
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    merci encore une fois JP pour ta science
    j ai modifie le fichier classement.py comme tu me l a indique ansi que le nom des courbes de bezier que j ai mis identique aux colonnes en A mais ca fonctionne pas
    je te joins le fichier py et l ods modifiés pour voir si j ai fait une erreur
    merci encore
    Bob
    Fichiers attachés Fichiers attachés

  18. #18
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    houla le def colore_zone(mesCommunes): tu ne l'as pas mis au bon endroit dans le fichier. Il coupe la fonction test_classement. Il faut le mettre devant comme ceci par exemple :
    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
    def colore_zone(mesCommunes):
        desktop = XSCRIPTCONTEXT.getDesktop()
        calc = desktop.getCurrentComponent()
        sheet = calc.getSheets().getByIndex(0) #1ere feuille du classeur
        Page =  sheet.DrawPage
        for i in range(0,Page.Count):
            oShape = Page.getByIndex(i)
            if oShape.ShapeType == "com.sun.star.drawing.ClosedBezierShape":
                for j in range(0,len(mesCommunes)):
                    if oShape.Name == mesCommunes[j].nom:
                        oShape.FillColor =  mesCommunes[j].couleur
                        if oShape.FillColor == 0:
                            oShape.FillColor = 0xc080ff
                        break
     
    def test_classement(*args):
    Ami calmant, J.P
    Fichiers attachés Fichiers attachés
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  19. #19
    Candidat au Club
    Homme Profil pro
    gendarme
    Inscrit en
    Avril 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : gendarme
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2016
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    ah oui effectivement j etais pas au bon endroit - grace a toi j ai une presentation du tonnerre de dieu !!! Macro inserer dans feuille tout est nickel
    je vais pourvoir me faire mousser aupres de mon patron
    Je me rends compte que tu as une préférence pour le python, j aimerai savoir si ce laguage est mieux que le basic car deja que je debute en basic libreoffice alors le python !!! y a une dizaine d annee j avais fait un progamme pour le boulot en VBA excel et je commencai a m amuser avec mais la Gendarmerie a dit aurevoir a microsoft et bonjour linux avec libreoffice (economie oblige) et lorsque j ai vu le basic libreoffice j ai compris que cela n avait rien a voir avec le VBA -
    pourrais tu me convertir le classement.py en basic libreoffice pour que j essaye de comprendre le cheminement si c est possible car vraiment tu as de la patience depuis quelques jours et je t en remercie et mon patron aussi t en remercie egalement car je lui ai parle de toi
    Bob

  20. #20
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    Hello,
    Bon j'ai réussi à faire l'équivalent du code en Python en LibreOffice Basic.
    Pour cela j'ai utilisé un module de classe (voir explication plus bas) et utilisé une fonction de tri (QuickSort)


    Création d'une classe qui s'appelle Commune et qui contient 3 propriétés : Nom, Place et Couleur
    Pour créer un module de classe il faut créer un module du nom de la classe (ici Commune) :
    Outils/Macros/Gérer les Macros/LibreOffice Basic
    Cliquez sur le bouton Gérer
    Dans l'onglet Modules cliquer sur le bouton Nouveau et rentrer le nom du module (ici Commune)
    Puis cliquer sur Editer
    Les 3 premières lignes d'un module de classe doivent être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Option Compatible
    Option ClassModule
    Option Explicit
    Ensuite on définit les variables internes
    Puis le constructeur et le destructeur de la classe ( Class_Initialize() et Class_Terminate())
    On définit ensuite les propriétés de la classe (attribut Public pour les voir de l'extérieur)
    Puis ensuite les méthodes de la classe (attribut Private pour méthode interne, Public pour accès de l'extérieur)
    voici ce que cela donne pour ma classe Commune :

    Nom : Commune.png
Affichages : 4057
Taille : 19,4 Ko

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    REM  *****  BASIC  *****
     
    Option Compatible
    Option ClassModule
    Option Explicit
     
    REM -----------------------------------------------------------------------------------------------------------------------
    REM --- Variables  Internes                                                                        ---
    REM -----------------------------------------------------------------------------------------------------------------------
     
    Private _Nom As String
    Private _Place As Integer
    Private _Couleur As Long
     
    REM -----------------------------------------------------------------------------------------------------------------------
    REM --- CONSTRUCTEURS / DESTRUCTEURRS                                                                    ---
    REM -----------------------------------------------------------------------------------------------------------------------
    Private Sub Class_Initialize()
     
    End Sub      '   Constructeur
     
    REM -----------------------------------------------------------------------------------------------------------------------
    Private Sub Class_Terminate()
     
    End Sub
     
    Public Property Get Nom As String
       Nom = _Nom
    End Property
     
    Public Property Let Nom(pValue As String)
       _Nom = pValue
    End property
     
    REM -----------------------------------------------------------------------------------------------------------------------
    Public Property Get Place As Integer
    Place = _Place
    End Property
     
    Public Property Let Place(ByVal pValue As Integer)
       _Place = pValue
    End property
     
    REM -----------------------------------------------------------------------------------------------------------------------
    Public Property Get Couleur As Long
    Couleur = _Couleur
    End Property
     
    Public Property Let Couleur(ByVal pValue As Integer)
       _Couleur = pValue
    End property
     
     
    REM -----------------------------------------------------------------------------------------------------------------------
    Public Property Get Dummy As Variant
       Dummy = Null
    End Property
     
    REM -----------------------------------------------------------------------------------------------------------------------
    REM --- METHODES DE CLASSES                                                                           ---
    REM -----------------------------------------------------------------------------------------------------------------------
     
    Private Sub CalcCouleur()
    IF       _Place <= 4 then 
    _Couleur = &H000000  REM NOIR
    ELSEIF  _Place < 10 then 
    _Couleur = &HFF8080  REM ROUGE
    ELSEIF  _Place < 15 then 
    _Couleur = &HFFFF80  REM JAUNE
    ELSEIF  _Place > 14 then
     _Couleur = &H80FF80  REM VERT
    ELSE 
    _Couleur = &HFF8080  REM BLANC
    END IF
    End Sub
     
     
    Public Sub Init(Nom As String, ByVal Place As Integer)
    _Nom = Nom
    _Place = Place
    CalcCouleur()
    End Sub
    voici la fonction de tri QuickSort en fonction de la place (je ne vais pas rentrer dans les détails car ce n'est pas moi qui l'ait inventé) :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    Sub QuickSort( mData, nLo as Long, nHi as Long )
     
        Dim nPivot as Long
     
        If nLo < nHi Then
            nPivot = QSPartition( mData, nLo, nHi )
            If nPivot > 0 Then
                QuickSort( mData, nLo, nPivot-1 )
            EndIf  
            QuickSort( mData, nPivot+1, nHi )
        EndIf
     
    End Sub
     
    '-----------------------------------------------------------------------------------
     
    Function QSPartition( mData, nLo as Long, nHi as Long ) as Long
     
        Dim nStoreIndex as Long
        Dim nPivotIndex as Long
        Dim vPivotValue as Variant
        Dim mDataCur as Variant
        Dim nI as Long
     
        nPivotIndex = (nLo + nHi) \ 2               'Choose pivot in the middle
        vPivotValue = mData( nPivotIndex )          'Save value to match
        SwapData( mData, nPivotIndex, nHi )         'Move pivot to the end
     
        nStoreIndex = nLo                           'Store starting with left
        For nI = nLo to (nHi-1)                     'Examine all but the pivot
               If ComparePlace(mData(nI),vPivotValue) < 0 Then  'Current < Saved?
                SwapData( mData, nI, nStoreIndex )  'Swap
                nStoreIndex = nStoreIndex + 1       'Increase storeIndex
            EndIf
        Next
     
        SwapData( mData, nStoreIndex, nHi )         'Move Saved to StoreIndex
        QSPartition = nStoreIndex                   'Return StoreIndex as Pivot
     
    End Function
     
    '-----------------------------------------------------------------------------------
    Function ComparePlace( a, b )
        ComparePlace = ( a.Place - b.Place )
    End Function
     
     
    Sub SwapData( mData, nI as Long, nJ as Long )
     
        Dim vSwapData as Variant
     
        vSwapData = mData(nI)
        mData(nI) = mData(nJ)
        mData(nJ) = vSwapData
     
    End Sub
    et voici les procédures équivalentes à ce qui était fait en Python :

    ColoreZone :
    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
    Sub ColoreZone(mesCommunes)
    Dim Feuille As Object, Page As Object
    Dim Forme As Object, Commune As Object
    'Définit une feuille nommée "Feuille1" dans le classeur 
    Feuille = ThisComponent.Sheets.getByName("Feuille1")
    Page =  Feuille.DrawPage
    For idx = 0 to Page.Count - 1
      Forme = Page.getByIndex(idx)
      If Forme.ShapeType = "com.sun.star.drawing.ClosedBezierShape" then
         For Each Commune in MesCommunes
              If Forme.Name = Commune.nom then
                    Forme.FillColor =  Commune.couleur
                        if Forme.FillColor = 0 then
                            Forme.FillColor = &HC080FF
                        End If
                        Exit For
              End If
         Next Commune
       End If
    Next idx
    End Sub

    ClassementCommunes :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    Sub ClassementCommunes
    Dim idx As Integer
    Dim Feuille As Object, PlageCellules As Object 
    Dim Plages As Object, oEnum As Object 
    Dim Cellule As Object,CellNom As Object,CellPlace As Object 
    Dim MesCommunes(100)
    'Définit une feuille nommée "Feuille1" dans le classeur 
    Feuille = ThisComponent.Sheets.getByName("Feuille1")  
    'Définit la plage de cellules 
    PlageCellules = Feuille.getCellRangeByName("A5:A46") 
    Plages = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")  
    Plages.insertByName("", PlageCellules) 
    oEnum = Plages.Cells.CreateEnumeration   
    'Boucle sur la plage 
    idx = 0
    While oEnum.hasMoreElements  
    'Nota: 
    'Ne renvoie rien si la cellule est vide 
    CellNom = oEnum.NextElement  
    CellPlace =   Feuille.getCellByPosition(12,CellNom.CellAddress.Row)
    IF CellPlace.Value > 0 Then 
    Dim Commune As New Commune
    Commune.Init(CellNom.String,CellPlace.Value)
    MesCommunes(idx)=Commune
    idx = idx+1
    End IF
    Wend
    Redim preserve MesCommunes(idx-1)
    QuickSort(MesCommunes,0,idx-1)
    ColoreZone(MesCommunes)
    idx = 0  
    For each Patelin in MesCommunes
    Cellule = Feuille.getCellByPosition(40, idx+4)
    Cellule.String = Patelin.nom
    'Feuille.getCellByPosition(39, idx+4).Value = Patelin.place
    Cellule.CellBackColor = Patelin.couleur
    'MsgBox Patelin.Nom  + " : " + Patelin.Place  + " : " + Patelin.Couleur
    idx = idx+1
    Next Patelin
    End Sub
    Il semblerait que le nom de la zone PRADES ne soit pas bonne (je l'ai renommé PRADES LE LEZ) et je ne vois pas St Vincent dans les zones :

    Nom : Classe_Communes.png
Affichages : 3989
Taille : 92,6 Ko

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

Discussions similaires

  1. [OpenOffice][Tableur] Compter des cellules avec une couleur
    Par cleroy61 dans le forum OpenOffice & LibreOffice
    Réponses: 11
    Dernier message: 29/06/2015, 23h40
  2. [XL-2000] compter des cellules avec une couleur de fond et une couleur de police
    Par darkvadave dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/11/2011, 16h36
  3. Dénombrer des cellules selon leurs couleurs avec formule
    Par Paenitentia dans le forum Excel
    Réponses: 5
    Dernier message: 14/03/2011, 14h38
  4. Réponses: 6
    Dernier message: 12/04/2007, 18h13
  5. [VBA-E]Remplir des cellules vides par des 0
    Par Tartenpion dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/03/2006, 13h58

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