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
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
A voir également:
- Excel 2003 trie via vba sur plusieur plages
- Trier sur excel - Guide
- Liste déroulante excel - Guide
- Comment calculer la moyenne sur excel - Guide
- Si et excel - Guide
- Comment aller à la ligne sur excel - Guide
9 réponses
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 714
15 mai 2009 à 10:03
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.
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
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
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
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
Maintenant ca marche !! Un grand merci à gbinforme !!!2 jours que je planchais la dessus .
Cordialement,
Jeremy
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 714
15 mai 2009 à 15:12
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.
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.
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.
!!!!!!!
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
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
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 714
15 mai 2009 à 18:28
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 ?
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 ?
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
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
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 714
19 mai 2009 à 23:20
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
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
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
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
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
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
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 714
20 mai 2009 à 19:21
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.
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.
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
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
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 714
25 mai 2009 à 21:17
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
Si ton titre est en ligne 222 (on ne sait jamais) tu adaptes le chiffre gras.
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.