Excel 2003 trie via vba sur plusieur plages

Résolu/Fermé
jerem - 15 mai 2009 à 08:43
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 - 25 mai 2009 à 21:17
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
A voir également:

9 réponses

gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
15 mai 2009 à 10:03
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
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
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
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
15 mai 2009 à 15:12
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
!!!!!!!

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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
15 mai 2009 à 18:28
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
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
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
19 mai 2009 à 23:20
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
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
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
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
20 mai 2009 à 19:21
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
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
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
25 mai 2009 à 21:17
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