Trie alphabétique sur plusieurs colonnes
Bonjour,
Je voudrais trié par ordre alphabétique plusieurs colonnes, c'est à dire que mes colonnes ont un nombre limité de ligne par exemple 15
Les colonne A a des noms et la colonne B des X(où des croix)
La colonne C a aussi des noms et la colonne D des X(où des croix)
Comme je suis limité à 15 lignes mon ordre alphabétique doit s'étendre comme ceci:
Col A Col B Col C Col D
Albert X Nadine X
Annie Serge
Christianne X Valentine X
Françoise X
Jériémie
etc
Je voudrais donc que la colonne C suivit de sa colonne D soit la suite alphabétique de la colonne A suivit elle même de sa colonne B.
Voir fichier joint
Comment puis je faire ce tri?
Diiity
merci mais ça ne marche pas.
diiity
Bonsoir
ça ne marche pas ...
peux-tu être plus précis car chez moi cela marche...
il ne se passe rien, il y a un code erreur ????
Peux-tu envoyer le fichier tel que tu l'as testé
On verra
A+
Bonsoir, Salut Patty !
Un essai :
Sub Tri2Col()
Dim k1%, k2%, kk
With ActiveSheet
k1 = .Range("A1").End(xlDown).Row
k2 = .Range("C1").End(xlDown).Row
Application.ScreenUpdating = False
kk = .Range("A1").Resize(k1, 2).Value
.Range("AA1").Resize(k1, 2).Value = kk
kk = .Range("C1").Resize(k2, 2).Value
.Range("AA" & k1 + 1).Resize(k2, 2).Value = kk
.Range("AA1").Resize(k1 + k2, 2).Sort key1:=.Range("AA1"), _
order1:=xlAscending, Header:=xlNo
kk = .Range("AA1").Resize(k1, 2).Value
.Range("A1").Resize(k1, 2).Value = kk
kk = .Range("AA" & k1 + 1).Resize(k2, 2).Value
.Range("C1").Resize(k2, 2).Value = kk
.Range("AA1").CurrentRegion.Clear
End With
End SubCordialement.
Bonjour à tous ! MFerrand, au premier abord je n'ai pas compris, après lecture lente et attentive j'ai fini par comprendre !
on copie la première colonne en AA1, on copie la deuxième colonne en AA + nombre de ligne de la première colonne +1
On tri la colonne AA1, puis on découpe cette colonne et colle sur les colonnes A et C ! Magique !
Il faut absolument que j'apprenne cette façon de faire !
vbMBHB
Bonjour vmbhb, mferrand
C'est exactement ce que j'ai fait dans les colonnes Z et AA, puis report et effacement de ces dernières!!!!
Bonne soirée à tous
En fait Patty5046, le problème n'est pas que votre code ne fonctionne pas, c'est qu'il écrit le résultat sur les même cellules que le résultat souhaité par diiity... du coup on pense que cela ne marche pas. Celui de MFerrand remplace la position de départ et on peut comparer la "bonne résolution"...
En fait pas tout à fait car vous aviez effacer les données "voulues"... Mais si diiity fait un copier coller de votre code sur son fichier....
Bref je ne sait pas pourquoi dit-il qu'il ne marche pas, votre code fonctionne mis à par le Application.ScreenUpDating pour éviter le scintillement de l'écran
vbMBHB
bonjour
comme d'hab , un essai pour les privés de VBA
j'ai laissé la macro de tri ,
cordialement
Bonjour à tous ! MFerrand, au premier abord je n'ai pas compris, après lecture lente et attentive j'ai fini par comprendre !
C'est assez basique, et la réalisation de Patty repose sur le même principe, et elle fonctionnait !
J'avais commencé, et ce qui m'a icité à coder ça, c'est pour faire au plus court autant que possible, et notamment en ce qui concerne le tri proprement dit...
L'exemple le plus flagrant est qu'on ne manque généralement pas d'y trouver le paramétrage de la méthode xlPinYin dont la documentation à ce sujet a toujours précisé que cela ne concernait que les langue chinoises !
Bonne fin de soirée.
Bonjour diiity,
En feuille2 du fichier joint,
coller à partir de la troisième ligne de la colonne A, la liste à trier,
coller à partir de la troisième ligne de la colonne B, les annotations à trier.
En A2 se calcule le nombre d'éléments à trier.
En B2 choisir un nombre de groupes de colonnes, inférieur à 6.
En C2 le nombre d'éléments dans le dernier groupe de colonnes.
En D2 le nombre de lignes dans les groupe de colonnes complètes.
En vert en colonne A, les éléments que j'ai rajoutés pour vérifier le bon fonctionnement.
Correction en A1 de la Feuil1 =SI(Feuille2.$B$2>1;"Noms";"") devenu =SI(Feuille2.$B$2>=1;"Noms";"")
Bonjour mferrand, bonjour à tous
L'utilisation de la méthode Worksheet.Sort m'irrite toujours quelque peu
Désolée de t'avoir irrité, mais je suis très loin d'être aussi forte que toi, et ta méthode, je vais bien la regarder pour bien la comprendre. En effet le code est bien plus court. Mais je ne connais pas toutes les possibilités de VBA....
Bravo à toi encore une fois
Bonne journée
Bonjour Patty !
Désolée de t'avoir irrité
Il n'y a pas outrage !
Façon de parler. Disons que ça me chatouille, pas très agréablement, de voir les mêmes choses se pérenniser alors qu'on peut faire plus simple.
Et si je n' m'irritais plus c'est que je serais devenu complètement atone...
Le tri est typique à cet égard. La méthode vulgarisée par l'enregistreur est une méthode plus élaborée que la précédente, qui comporte les mêmes éléments de paramétrages et d'autres supplémentaires qui étendent les possibilités. Ce n'est certes pas inintéressant, mais elle est nettement plus complexe à maîtriser, et sachant que l'enregistreur produit en moyenne au moins 50% de code inutile, il conviendrait d'épurer le résultat enregistré, mais la complexité de la méthode fait que personne ne se risque trop généralement à y toucher...
L'"ancienne" méthode est classique, méthode Sort appliquée à un objet Range, on définit les paramètres utiles de la méthode et le tri se fait, et ça fonctionne toujours dans la plupart des cas habituels aussi efficacement que la "nouvelle" méthode, avec beaucoup moins de code !
Cette méthode procède un peu différemment, elle renvoie un objet Sort rattaché à la feuille dont les paramètres sont définies par des propriétés de cet objets ou dans des sous-objets SortFields dont les propriétés définissent les paramètres de tri. Et l'application du tri relève d'une méthode de Sort... Cet éclatement fait qu'on n'y retrouve pas aisément ses petits et qu'un débutant n'a quasiment aucune chance de s'y retrouver, car il n'est pas vraiment naturel de penser le tri en tant qu'objet, quelque peu composite qui plus est, d'en fignoler les critères par touches, à la manière dont on composerait un tableau, avant de dire Ça y est ! Applique maintenant !
Dans le début des années 90 lors de la mise en place de VBA, dans un premier temps avec Excel 5, Microsoft avait fourni une documentation d'accompagnement de qualité qui apportait véritablement une aide pour maîtriser l'utilisation de VBA. L'enregistreur existait déjà (moins perfectionné sans doute) mais l'accent n'était pas mis dessus, et de fait à mes débuts je n'ai jamais utilisé l'enregistreur... Des explications étaient par contre fournies sur la façon d'épurer le code si on l'avait enregistré, et diverses techniques pour optimiser le code...
Politique qui a radicalement changé : l'aide n'est plus fournie en local avec les dernières versions, alors qu'on a très fréquemment besoin lorsqu'on code de vérifier tel ou tel point de syntaxe, ce qui rend le recours à l'aide quasi-permanent pour coder correctement. Et j'ai même lu quelque part une phrase anodine visant à encourager l'utilisation de l'enregistreur, dont j'ai oublié la teneur depuis, mais qui pour moi signifiait clairement : on vous fournit le plat, consommez sans vous soucier des ingrédients ni de leur apprêt, on s'en occupe pour vous...
Un type de démarche que je combats depuis mon plus jeune âge, et ce n'est pas maintenant que cela va s'arrêter !
Cordialement et bonne journée.
Bonjour,
Sub TriMC2()
Set rng1 = Range("A2:A10,C2:C10") ' à adapter
Dim temp(), temp2()
ReDim temp(rng1.Count)
ReDim temp2(rng1.Count)
lig = 0
For i = 1 To rng1.Areas.Count
For j = 1 To rng1.Areas(i).Count
If rng1.Areas(i)(j) <> "" Then
lig = lig + 1
temp(lig) = rng1.Areas(i)(j)
temp2(lig) = rng1.Areas(i)(j).Offset(, 1)
End If
Next j
Next i
Call Tri2(temp, temp2, 1, lig)
lig = 0
For i = 1 To rng1.Areas.Count
For j = 1 To rng1.Areas(i).Count
lig = lig + 1
rng1.Areas(i)(j) = temp(lig)
rng1.Areas(i)(j).Offset(, 1) = temp2(lig)
Next j
Next i
End Sub
Ceuzin