Excel 2003 trie via vba sur plusieur plages

Résolu
jerem -  
gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Nouvelle question, je veux trier par ordre alphabétique plusieurs plages de cellules différentes via LE VBA. Pour une plage c'est ça (la liste 1 se treira indépendemment de la liste 2):

Range("A37:A57").Select
Selection.Sort Key1:=Range("A37"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

Quelqu'un peut m'aider?

Cordialement,

Jérémy
Configuration: Windows XP Internet Explorer 6.0

9 réponses

  1. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Tu peux le faire sans sélection sur la plage que tu désignes et tu lances autant de tris que tu as de plages.
    Range("A:A").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes, _
           OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
    Range("B:B").Sort Key1:=Range("B1"), Order1:=xlDescending, Header:=xlGuess, _
           OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
    1
  2. jerem
     
    Ok je n'ai pas été assez complet dans ma description.. Cela marche mais pas si dans la suite on a une macro de type ci dessous permettant de masquer les lignes vides d'un tableau ou d'en rajouter lorsque l'on rajouter un élément!!

    Sub Masquer_Lignes_Vides()

    Application.ScreenUpdating = False

    Sheets("recap AGENCE").Select
    Range("B6:B26").Select
    For Each Cell In Selection
    Cpt = 0
    For i = 0 To 11
    If Cell.Offset(0, i) <> "" Then
    Cpt = Cpt + 1
    End If
    Next
    If Cpt = 0 Then
    Cell.EntireRow.Hidden = True
    Else
    Cell.EntireRow.Hidden = False
    End If
    Next
    Application.ScreenUpdating = True

    Application.ScreenUpdating = False

    Sheets("recap ").Select
    Range("B32:B58").Select
    For Each Cell In Selection
    Cpt = 0
    For i = 0 To 11
    If Cell.Offset(0, i) <> "" Then
    Cpt = Cpt + 1
    End If
    Next
    If Cpt = 0 Then
    Cell.EntireRow.Hidden = True
    Else
    Cell.EntireRow.Hidden = False
    End If
    Next
    Application.ScreenUpdating = True

    Application.ScreenUpdating = False

    Sheets("recap AGENCE ").Select
    Range("B63:B75").Select
    For Each Cell In Selection
    Cpt = 0
    For i = 0 To 11
    If Cell.Offset(0, i) <> "" Then
    Cpt = Cpt + 1
    End If
    Next
    If Cpt = 0 Then
    Cell.EntireRow.Hidden = True
    Else
    Cell.EntireRow.Hidden = False
    End If
    Next
    Application.ScreenUpdating = True

    Application.ScreenUpdating = False

    Sheets("recap AGENCE ").Select
    Range("B80:B113").Select
    For Each Cell In Selection
    Cpt = 0
    For i = 0 To 11
    If Cell.Offset(0, i) <> "" Then
    Cpt = Cpt + 1
    End If
    Next
    If Cpt = 0 Then
    Cell.EntireRow.Hidden = True
    Else
    Cell.EntireRow.Hidden = False
    End If
    Next
    Application.ScreenUpdating = True

    End Sub

    En gros mon objectif est à partir de tableaux qui sert de base de données, modifier des autres tableaux qui seront exploiter. Pour l'instant j'avais réussi à regler le pb d'ajout et suppression de ligne ds le tableau en fonction des élément que l'on tape dans le tableau de base, et je voulais maintenant que les nouvelles lignes se mettent par ordre alphabétique!!!ce qui marche avec

    Range("A37:A57").Select
    Selection.Sort Key1:=Range("A37"), Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal

    Mais uniquement pour une plage.

    Si vous savez comment faire, vous m'enleveriez une grosse épine du pied!!

    Merci à gbinforme pour ta 1 ere réponse

    Cordialement Jérémy
    0
  3. jeremy
     
    Autant pour moi j'avais pas vu le descending qui faisait merder mon tri dans mon cas?

    Maintenant ca marche !! Un grand merci à gbinforme !!!2 jours que je planchais la dessus .

    Cordialement,

    Jeremy
    0
  4. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Ton Range("A37:A57") est à proscrire dans les macros car il est figé et ne permet pas d'ajouter dans ta plage.

    Tu devrais plutôt nommer tes plages "liste1", "liste2" par exemple et ainsi, si tu rajoutes des lignes dans ta plage, tu n'as rien à changer dans les macros. Pour rajouter des rubriques tu les mets en tête avec la même syntaxe et tu tries pour les positionner.
    Range("liste1").Sort Key1:=Cells([liste1].Row, [liste1].Column), _
        Order1:=xlDescending, Header:=xlYes, OrderCustom:=1, _
            Orientation:=xlTopToBottom
    Range("liste2").Sort Key1:=Cells([liste2].Row, [liste2].Column), _
        Order1:=xlAscending, Header:=xlNo, OrderCustom:=1, _
            Orientation:=xlTopToBottom
    

    Je t'ai mis 2 façons d'utiliser les plages nommées et ainsi tu peux ajouter des lignes mais aussi des colonnes avant ta plage sans perturber ton tri.
    0
    1. jeremy
       
      !!!!!!!

      Dmg que je n'ais pas vu ton message avant, j'ai utilisé une solution intermédiaire (j'ai ajouter des lignes vides dans les tableaux de mes bases de données en esperant que l'on n'ajoute pas de plus de 10 cases pour chaque tableau (et j'ai prévu large!!!!)

      Ce qu''il e faudrait c'est une formule du même genre que la 1ère que j'ai donné mais pour les colonnes

      Range("B9:B12").Select
      Order1:=xlAscending, Header:=xlNo, OrderCustom:=1, _
      Orientation:=xlTopToBottom


      Ca marche pas !! :s
      Je ne suis pas très bon en macro (comme tu peuxx le voir ), donc si tu peux m'aider j'apprécierais volontiers!!!!

      Cordialement,

      Jérémy
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Ce qu''il e faudrait c'est une formule du même genre que la 1ère que j'ai donné mais pour les colonnes

    J'avoue que je ne comprend pas ta question.

    Veux-tu dire que tu veux faire un tri horizontal au lieu du vertical ?
    0
    1. Jerem
       
      Ca c'est la macro pour ajouter supprimer des lignes via le vba en fonction du contenu, si elles sont vides, elles n'apparaissent pas, et si elles sont pleines, ellles apparaissent.


      Voila le vba

      Application.ScreenUpdating = False

      Sheets("recap ").Select
      Range("B32:B58").Select
      For Each Cell In Selection
      Cpt = 0
      For i = 0 To 11
      If Cell.Offset(0, i) <> "" Then
      Cpt = Cpt + 1
      End If
      Next
      If Cpt = 0 Then
      Cell.EntireRow.Hidden = True
      Else
      Cell.EntireRow.Hidden = False
      End If
      Next
      Application.ScreenUpdating = True


      J'aimerais maintenant connaître le vba pour faire la même chose avec des colonnes. si elles sont vides elles "disparaissent", et des qu'elle sont pleines, elles apparaaissent.

      Merci par avance

      Cordialement,

      Jérémy LAMY
      0
  7. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    J'aimerais maintenant connaître le vba pour faire la même chose avec des colonnes. si elles sont vides elles "disparaissent", et des qu'elle sont pleines, elles apparaaissent.

    Il y a comme souvent, plusieurs méthodes pour le faire. Je t'en propose une qui peut avec le même principe faire les lignes et/ou les colonnes
    Public Sub masquage()
    Dim i As Long           ' indice
    Dim mxc As Long         ' maximum colones feuille
    Dim mxl As Long         ' maximum lignes feuille
    ' afin de traiter 97 - 2007
    mxc = [1:1].Columns.Count
    mxl = [A:A].Rows.Count
    Application.ScreenUpdating = False
    
    With Sheets("recap ")
    
    For i = 32 To 58 '       Range("B32:B58") de ton exemple
    'For i = 1 To mxl ' pour tout le classeur
        If .Cells(i, mxc).End(xlToLeft).Column > 2 Then
            .Rows(i).Hidden = False  ' lignes utilisées
        Else
            .Rows(i).Hidden = True   ' lignes inutilisées
        End If
    Next i
    
    For i = 1 To mxc
        If .Cells(mxl, i).End(xlUp).Row > 2 Then
            .Columns(i).Hidden = False  ' colonnes utilisées
        Else
            .Columns(i).Hidden = True   ' colonnes inutilisées
        End If
    Next i
    
    End With
    Application.ScreenUpdating = True
    
    End Sub
    0
    1. jeremy
       
      et donc si jeux traiter uniquement les colonnes la macro sera :

      With Sheets("recap ")

      For i = 1 To mxc
      If .Cells(mxl, i).End(xlUp).Row > 2 Then
      .Columns(i).Hidden = False ' colonnes utilisées
      Else
      .Columns(i).Hidden = True ' colonnes inutilisées
      End If
      Next i

      End With
      Application.ScreenUpdating = True

      C'est ça??

      En tout cas, merci pour ton aide gbinforme !

      Bon week end

      Cordialement ,

      Jérémy
      0
  8. jeremy
     
    Et donc si je veux traiter uniquement des colonnes (car j'ai déja une macro définie pour les lignes et je ne veux surtout pas la toucher!!!!)

    je mets :

    Application.ScreenUpdating = False

    With Sheets("recap ")

    For i = 1 To mxc
    If .Cells(mxl, i).End(xlUp).Row > 2 Then
    .Columns(i).Hidden = False ' colonnes utilisées
    Else
    .Columns(i).Hidden = True ' colonnes inutilisées
    End If
    Next i

    End With
    Application.ScreenUpdating = True

    C'est ca?

    Merci pour ton aide en tout cas gbinforme!

    Bon week end

    Cordialement,

    Jérémy LAMY
    0
  9. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Tu as bien vu et en fait la macro regarde pour chaque colonne la dernière ligne utilisée.

    Tu peux changer le 2 si tu veux car comme tu était parti de la colonne B, j'ai gardé la même chose pour les colonnes et donc si tu as un titre sur une seule ligne tu peux mettre 1.
    0
    1. jeremy
       
      Je n'arrive pas à faire fonctionner la macro, il semble qu'elle ne soit pas tout à fait correct( je pense que je me suis mal exprimé), le but est en fait :

      Si la cellule du titre est vide, alors je masque la colonne dans laquelle se situe cette cellule vide, on determinera alors uniquement grâce à cette cellule si la colonne doit s'afficher ou se masquer.

      Cordialement,

      Jérémy
      0
  10. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Si la cellule du titre est vide, alors je masque la colonne

    Moi je veux bien, mais une ligne titre avec des cellules vides c'est tout de même exceptionnel surtout parce que l'on se prive de pas mal de fonctionnalités comme les filtres, les TCD et autres fonctions bien utiles.

    Chacun fait ce qu'il veut et quand on a une Ferrari on peut aussi s'en servir comme bac à fleur.

    Dans ton cas, si ton titre est en ligne 1 cela devrait fonctionner
    With Sheets("recap ")
       For i = 1 To mxc
       If .Cells(1, i).value = "" Then
           .Columns(i).Hidden = False ' colonnes utilisées
       Else
           .Columns(i).Hidden = True ' colonnes inutilisées
       End If
       Next i
    End With 

    Si ton titre est en ligne 222 (on ne sait jamais) tu adaptes le chiffre gras.
    0