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 :

Comment trier numéros sur plusieurs colonnes par ordre croissant


Sujet :

OpenOffice & LibreOffice

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Comment trier numéros sur plusieurs colonnes par ordre croissant
    Bonjour,

    Avec OPEN OFFICE

    J'ai crée un tableau de 70 N°

    de 10 cases vertical 1 à 10

    sur 7 cases horizontal de B à H

    Comment TRIER par ordre croissant dans le sens vertical ,svp

    les N° du 1er tableau en retirant les N° doubles ou triples si il y en a ?

    Merci pour votre aide

    PS j'ai fait comme sur une vidéo

    " TUTO OPENOFFICE CALC : Trier et filtrer un tableau "

    1) clic sur tout le tableau

    2) données > trier > option > clic sur la plage contient des étiquettes de colonne

    MAIS il ne m'a trié que les 10 N° de la 1ére colonne ?? pourquoi svp ?

    De plus il ne me retire pas les doubles , ce que je cherche à faire

    Merci encore pour votre aide
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    Bonjour,

    Vous ne pourrez pas faire un tel tri avec l'IHM, il vous faudra passer par du code. Voici un tuto Utiliser oBasic dans le Tableur (Calc) où vous trouverez tous les éléments pour y arriver.

    N'oubliez pas le Tag afin de faciliter la recherche, et en votant cela permet de mieux la cibler.

    Je ne réponds pas aux messages privés s'ils sont liés à une question technique

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 007
    Points : 9 401
    Points
    9 401
    Par défaut
    hello,
    zoom61, je me suis un peu penché sur le problème, histoire de faire un peu de code, je récupère les valeurs de la plage du tableau dans un tableau comme ceci en macro basic:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim a, ada, aRow,aCol, x, y,valeur,plage,ligne,tableau(100)
    ' on sélectionne la zone à trier de la première feuille
    a = ThisComponent.Sheets(0).getCellRangeByName("A1:G10")
    ' on récupère les données en une seule fois
    plage = a.DataArray   ' This is synonymous to a.getDataArray()
    ' on balaie l'ensemble de la plage pour mettre les valeurs dans un tableau
    x=0
    For Each ligne in plage
      For Each valeur in ligne
      tableau(x) = valeur
      x = x + 1 
      Next valeur
    Next ligne
    mais après je coince : comment trier le tableau ? est-ce faisable facilement en basic ? Ne faut-il pas mieux utiliser une macro en python ?


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

  4. #4
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    Voici ce que j'ai pu faire rapidement :
    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 Tableau1()
        Dim a, ada, aRow,aCol, x, y,valeur,plage,ligne,tableau(100)
     
        ' on sélectionne la zone à trier de la première feuille
        a = ThisComponent.Sheets(0).getCellRangeByName("A1:G10")
        ' on récupère les données en une seule fois
        plage = a.DataArray   ' This is synonymous to a.getDataArray()
        ' on balaie l'ensemble de la plage pour mettre les valeurs dans un tableau
        x=0
        For Each ligne in plage
          For Each valeur in ligne
          tableau(x) = valeur
          x = x + 1 
          Next valeur
        Next ligne
     
        Dim I%, J%, K%, tmp
     
        For I = LBound(tableau) To UBound(tableau)
            J = I
            For K = J + 1 To UBound(tableau)
                If tableau(K) >= tableau(J) Then J = K
            Next K
            If I <> J Then
                tmp = tableau(J): tableau(J) = tableau(I): tableau(I) = tmp
            End If
        Next I
     
        monDocument = ThisComponent
        lesFeuilles = monDocument.Sheets
        maFeuille = lesFeuilles.getByName("Feuille1")
     
        ValRef = 0
        Cmpt = 1
     
        For i = 1 to x
            if ValRef <> tableau(i) then 
                Cmpt = Cmpt + 1 
                ValRef = tableau(i)
            end if
        Next
     
        ValRef = 0
        j = Cmpt  +20
        For i = 0 to x-1
            maCellule = maFeuille.getCellByPosition(1,j)
            if ValRef <> tableau(i) then
                maCellule.Value = tableau(i)
                ValRef =  tableau(i)
                j = j-1
            end if
        Next
     
        msgbox "Fin"
     
    End Sub
    N'oubliez pas le Tag afin de faciliter la recherche, et en votant cela permet de mieux la cibler.

    Je ne réponds pas aux messages privés s'ils sont liés à une question technique

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 007
    Points : 9 401
    Points
    9 401
    Par défaut
    Ok merci zoom61, j'ai eu un peu de mal à comprendre ce que tu avais fait , en final je vois bien qu'on arrive à une liste ordonnée des nombres sans doublon. Cela me conforte dans l'idée que par basic ce n'est pas très facile de trier un tableau. Je vais essayer de voir du côté de python qui offre plus de possibilité dans le tri de tableau. Ou alors en réalisant les fonctions de tris dans la feuille.

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

  6. #6
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    L'inconvénient de Python est que la fonctionnalité "Macro/Python" n'est pas active sur tous les postes qui sont LibreOffice ou OpenOffice, il est parfois nécessaire d'installer la commande avant. Donc, il faut bien vérifier que cela est possible.
    N'oubliez pas le Tag afin de faciliter la recherche, et en votant cela permet de mieux la cibler.

    Je ne réponds pas aux messages privés s'ils sont liés à une question technique

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 007
    Points : 9 401
    Points
    9 401
    Par défaut
    hello,
    bon ben finalement j'y suis arrivé avec une macro LibreOffice en Python dont 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
    def test_tableau():
        desktop = XSCRIPTCONTEXT.getDesktop()
        calc = desktop.getCurrentComponent()
        sheet = calc.getSheets().getByIndex(0)
        a = sheet.getCellRangeByName("A1:G10")
    	# on récupere les data en une seule fois
        plage = a.getDataArray()
    	# on crée une liste à une dimension à partir de la plage
        listeNombre = [item for sublist in plage for item in sublist]
    	# on classe par ordre croissant les nombres et on enlève les doublons
        matrice = sorted(set(listeNombre))
    	# on recrée la plage à partir de la liste triée sans doublon
    	# en inversant les lignes et les colonnes
        totallist = []
        for i in range(0,10,1):
            rowlist = []
            for j in range(0,7,1):
                try:
                    rowlist.append(matrice[j*7 +i])
    	# si matrice[x] n'existe pas on met un élément vide
                except:
                    rowlist.append('')
            totallist.append(tuple(rowlist) )  
        # on définit la plage ou on va écrire
        b = sheet.getCellRangeByName("I1:O10")
        # on écrit en une fois la plage résultat
        b.setDataArray(tuple(totallist))
     
    g_exportedScripts = test_tableau,
    et voici le résultat :
    Nom : trie_colonnes.PNG
Affichages : 4779
Taille : 63,1 Ko

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

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 007
    Points : 9 401
    Points
    9 401
    Par défaut
    Arf ! je viens de constater qu'il y a une erreur dans le résultat certainement due au fait qu'il n'y a pas le même nombre de lignes que de colonnes dans la plage de départ . Donc code à revoir !

    Bon , j'ai trouvé l'erreur voici le bout de code corrigé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       totallist = []
        for i in range(0,10,1):
            rowlist = []
            for j in range(0,7,1):
                try:
                    rowlist.append(matrice[j*10 +i])
    	# si matrice[x] n'existe pas on met un élément vide
                except:
                    rowlist.append('')
            totallist.append(tuple(rowlist) )
    et voici le résultat :
    Nom : trie_colonnes_new.PNG
Affichages : 3199
Taille : 80,5 Ko
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  9. #9
    Membre du Club
    Profil pro
    Bricoleur
    Inscrit en
    Septembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Bricoleur

    Informations forums :
    Inscription : Septembre 2011
    Messages : 56
    Points : 61
    Points
    61
    Par défaut
    Voici une petite fonction pour supprimer les doublons d'un tableau :

    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
     
    Function unique(maliste()) 
      Dim arr As New Collection, a 
      Dim Tableau() As Variant 
      Dim i As Long 
     
      On Error Resume Next 'Les clés d'une collection doivent être unique
      For Each a In maListe 
         arr.Add a, a 
      Next 
     
      For i = 1 To arr.Count 'les collections commencent à 1
         Tableau(i-1) = arr(i) 'les tableau à 0
         redim preserve Tableau(i) 
      Next 
     unique=Tableau
    End function
    Ubuntu 14.04 LTS
    LibreOffice 4.4

Discussions similaires

  1. Optimisation de tri de nombres sur plusieurs colonnes par ordre croissant
    Par jurassic pork dans le forum Général Python
    Réponses: 5
    Dernier message: 05/02/2015, 22h56
  2. Réponses: 6
    Dernier message: 11/03/2009, 12h43
  3. tri par moyenne sur plusieurs colonnes
    Par adr22 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/12/2007, 16h19
  4. Réponses: 2
    Dernier message: 12/06/2006, 18h18
  5. trier un stringgrid sur plusieurs colonnes
    Par renegade55 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 13/12/2005, 16h30

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