OVH Cloud OVH Cloud

Ordre du tri

7 réponses
Avatar
Papy Jean
Bonjour !

Comment peut-on faire respecter au tri VBA l'ordre des caractères ASCII ?

Par exemple:
Comment trier par ordre alphabétique sur une colonne qui contient des noms,
dont certains sont entre {Accolades}
Le tri met ces personnes en tête, alors que je les désire en fin.

De même, il met systématiquement à la fin, les lignes d'argument vide, alors
que Rien, c'est < à qqch.

Actuellement, j'utilise une colonne auxiliaire pour m'en sortir.

Merci d'avance

Papy Jean

7 réponses

Avatar
PMO
Bonjour,

Voici un code qui peut-être va solutionner votre problème.
ATTENTION: testez sur une copie de votre classeur.

CELA FAIT:
1) On monte dans un variant simulant un tableau VB toutes
les valeurs de la plage préselectionnée au moyen de l'InputBox
2) On balaie les valeurs et on leur octroie la chaîne {1000 + la valeur ASCII
de l'initiale } en la concaténant devant. Ouf!
Ex: TOTO (dont l'Asc de l'initiale "T" est 84) donne 1084TOTO
3) On inscrit le variant dans la plage concernée et on effectue un tri
4) On remonte la plage concernée dans le variant et, à la suite d'un
balayage, on retire les 4 premiers caractères.
5) On réinscrit le variant dans la plage concernée et on a le résultat.

'*****************************
Option Explicit
Sub TriAscendASCII()
Dim R As Range
Dim var
Dim i&
Dim Col&
Dim Lig&
Dim A$
On Error GoTo Erreur
Set R = Application.InputBox(prompt:= _
"Veuillez sélectionner la plage à trier" & _
vbCrLf & "(uniquement sur une colonne)", _
Title:="Tri par ordre ASCII", Type:=8)
On Error GoTo 0
If R.Columns.Count > 1 Then
MsgBox "Veuillez ne sélectionner qu'une seule colonne"
Exit Sub
End If
var = R
For i& = 1 To UBound(var, 1)
If Not IsEmpty(var(i&, 1)) Then
var(i&, 1) = 1000 + Asc(var(i&, 1)) & var(i&, 1)
Else
var(i&, 1) = 1000 & var(i&, 1)
End If
Next i&
R = var
A$ = R.Address(ReferenceStyle:=xlR1C1)
Lig& = CLng(Mid(A$, 2, InStr(1, A$, "C") - 2))
A$ = Mid(A$, 1, InStr(1, A$, ":") - 1)
Col& = CLng(Mid(A$, InStr(1, A$, "C") + 1))
R.Sort Key1:=Range(Cells(Lig&, Col&), Cells(Lig&, Col&)), _
Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:úlse, _
Orientation:=xlTopToBottom
var = R
For i& = 1 To UBound(var, 1)
var(i&, 1) = Mid(var(i&, 1), 5)
Next i&
R = var
Erreur:
End Sub
'*****************************

Est-ce que ça vous convient ?

PMO
Patrick Morange



Bonjour !

Comment peut-on faire respecter au tri VBA l'ordre des caractères ASCII ?

Par exemple:
Comment trier par ordre alphabétique sur une colonne qui contient des noms,
dont certains sont entre {Accolades}
Le tri met ces personnes en tête, alors que je les désire en fin.

De même, il met systématiquement à la fin, les lignes d'argument vide, alors
que Rien, c'est < à qqch.

Actuellement, j'utilise une colonne auxiliaire pour m'en sortir.

Merci d'avance

Papy Jean






Avatar
Papy Jean
Bonjour !
Merci de votre réponse,
J'avais fait quelque chose de voisin, mais j'espérais qu'il y aurait un des
paramètres de SORT qui permettrait de trier dans l'ordre des codes ASCII.

Salutations
Papy Jean

"PMO" a écrit dans le message de news:

Bonjour,

Voici un code qui peut-être va solutionner votre problème.
ATTENTION: testez sur une copie de votre classeur.

CELA FAIT:
1) On monte dans un variant simulant un tableau VB toutes
les valeurs de la plage préselectionnée au moyen de l'InputBox
2) On balaie les valeurs et on leur octroie la chaîne {1000 + la valeur
ASCII
de l'initiale } en la concaténant devant. Ouf!
Ex: TOTO (dont l'Asc de l'initiale "T" est 84) donne 1084TOTO
3) On inscrit le variant dans la plage concernée et on effectue un tri
4) On remonte la plage concernée dans le variant et, à la suite d'un
balayage, on retire les 4 premiers caractères.
5) On réinscrit le variant dans la plage concernée et on a le résultat.

'*****************************
Option Explicit
Sub TriAscendASCII()
Dim R As Range
Dim var
Dim i&
Dim Col&
Dim Lig&
Dim A$
On Error GoTo Erreur
Set R = Application.InputBox(prompt:= _
"Veuillez sélectionner la plage à trier" & _
vbCrLf & "(uniquement sur une colonne)", _
Title:="Tri par ordre ASCII", Type:=8)
On Error GoTo 0
If R.Columns.Count > 1 Then
MsgBox "Veuillez ne sélectionner qu'une seule colonne"
Exit Sub
End If
var = R
For i& = 1 To UBound(var, 1)
If Not IsEmpty(var(i&, 1)) Then
var(i&, 1) = 1000 + Asc(var(i&, 1)) & var(i&, 1)
Else
var(i&, 1) = 1000 & var(i&, 1)
End If
Next i&
R = var
A$ = R.Address(ReferenceStyle:=xlR1C1)
Lig& = CLng(Mid(A$, 2, InStr(1, A$, "C") - 2))
A$ = Mid(A$, 1, InStr(1, A$, ":") - 1)
Col& = CLng(Mid(A$, InStr(1, A$, "C") + 1))
R.Sort Key1:=Range(Cells(Lig&, Col&), Cells(Lig&, Col&)), _
Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:úlse, _
Orientation:=xlTopToBottom
var = R
For i& = 1 To UBound(var, 1)
var(i&, 1) = Mid(var(i&, 1), 5)
Next i&
R = var
Erreur:
End Sub
'*****************************

Est-ce que ça vous convient ?

PMO
Patrick Morange



Bonjour !

Comment peut-on faire respecter au tri VBA l'ordre des caractères ASCII ?

Par exemple:
Comment trier par ordre alphabétique sur une colonne qui contient des
noms,
dont certains sont entre {Accolades}
Le tri met ces personnes en tête, alors que je les désire en fin.

De même, il met systématiquement à la fin, les lignes d'argument vide,
alors
que Rien, c'est < à qqch.

Actuellement, j'utilise une colonne auxiliaire pour m'en sortir.

Merci d'avance

Papy Jean








Avatar
Clément Marcotte
Bonjour,

Si j'ai bien compris

Option compare binary

dans l'entête du module.


"Papy Jean" a écrit dans le message de
news:41b5bf2f$0$2769$
Bonjour !
Merci de votre réponse,
J'avais fait quelque chose de voisin, mais j'espérais qu'il y aurait
un des

paramètres de SORT qui permettrait de trier dans l'ordre des codes
ASCII.


Salutations
Papy Jean

"PMO" a écrit dans le message de
news:


Bonjour,

Voici un code qui peut-être va solutionner votre problème.
ATTENTION: testez sur une copie de votre classeur.

CELA FAIT:
1) On monte dans un variant simulant un tableau VB toutes
les valeurs de la plage préselectionnée au moyen de l'InputBox
2) On balaie les valeurs et on leur octroie la chaîne {1000 + la
valeur


ASCII
de l'initiale } en la concaténant devant. Ouf!
Ex: TOTO (dont l'Asc de l'initiale "T" est 84) donne
1084TOTO


3) On inscrit le variant dans la plage concernée et on effectue un
tri


4) On remonte la plage concernée dans le variant et, à la suite
d'un


balayage, on retire les 4 premiers caractères.
5) On réinscrit le variant dans la plage concernée et on a le
résultat.



'*****************************
Option Explicit
Sub TriAscendASCII()
Dim R As Range
Dim var
Dim i&
Dim Col&
Dim Lig&
Dim A$
On Error GoTo Erreur
Set R = Application.InputBox(prompt:= _
"Veuillez sélectionner la plage à trier" & _
vbCrLf & "(uniquement sur une colonne)", _
Title:="Tri par ordre ASCII", Type:=8)
On Error GoTo 0
If R.Columns.Count > 1 Then
MsgBox "Veuillez ne sélectionner qu'une seule colonne"
Exit Sub
End If
var = R
For i& = 1 To UBound(var, 1)
If Not IsEmpty(var(i&, 1)) Then
var(i&, 1) = 1000 + Asc(var(i&, 1)) & var(i&, 1)
Else
var(i&, 1) = 1000 & var(i&, 1)
End If
Next i&
R = var
A$ = R.Address(ReferenceStyle:=xlR1C1)
Lig& = CLng(Mid(A$, 2, InStr(1, A$, "C") - 2))
A$ = Mid(A$, 1, InStr(1, A$, ":") - 1)
Col& = CLng(Mid(A$, InStr(1, A$, "C") + 1))
R.Sort Key1:=Range(Cells(Lig&, Col&), Cells(Lig&, Col&)), _
Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:úlse, _
Orientation:=xlTopToBottom
var = R
For i& = 1 To UBound(var, 1)
var(i&, 1) = Mid(var(i&, 1), 5)
Next i&
R = var
Erreur:
End Sub
'*****************************

Est-ce que ça vous convient ?

PMO
Patrick Morange



Bonjour !

Comment peut-on faire respecter au tri VBA l'ordre des caractères
ASCII ?




Par exemple:
Comment trier par ordre alphabétique sur une colonne qui contient
des



noms,
dont certains sont entre {Accolades}
Le tri met ces personnes en tête, alors que je les désire en fin.

De même, il met systématiquement à la fin, les lignes d'argument
vide,



alors
que Rien, c'est < à qqch.

Actuellement, j'utilise une colonne auxiliaire pour m'en sortir.

Merci d'avance

Papy Jean












Avatar
Papy Jean
Bonsoir !

merci d'avoir regardé
Ce que j'ai fait ne semble pas fonctionner:

Comme je ne connaissais pas, j'm'ai p't'être trompé:
J'ai ajouté l'instruction d'Option, tout au début du module dans les
Déclarations.
Est-ce là ??

La doc dit que cela concerne les comparaisons de chaînes, mais ne parle par
des tris.
J'aurais pourtant cru que c'était pareil ??

Salutations
Papy Jean


"Clément Marcotte" a écrit dans le message
de news: u21Ra$
Bonjour,

Si j'ai bien compris

Option compare binary

dans l'entête du module.


"Papy Jean" a écrit dans le message de
news:41b5bf2f$0$2769$
Bonjour !
Merci de votre réponse,
J'avais fait quelque chose de voisin, mais j'espérais qu'il y aurait
un des

paramètres de SORT qui permettrait de trier dans l'ordre des codes
ASCII.


Salutations
Papy Jean

"PMO" a écrit dans le message de
news:


Bonjour,

Voici un code qui peut-être va solutionner votre problème.
ATTENTION: testez sur une copie de votre classeur.

CELA FAIT:
1) On monte dans un variant simulant un tableau VB toutes
les valeurs de la plage préselectionnée au moyen de l'InputBox
2) On balaie les valeurs et on leur octroie la chaîne {1000 + la
valeur


ASCII
de l'initiale } en la concaténant devant. Ouf!
Ex: TOTO (dont l'Asc de l'initiale "T" est 84) donne
1084TOTO


3) On inscrit le variant dans la plage concernée et on effectue un
tri


4) On remonte la plage concernée dans le variant et, à la suite
d'un


balayage, on retire les 4 premiers caractères.
5) On réinscrit le variant dans la plage concernée et on a le
résultat.



'*****************************
Option Explicit
Sub TriAscendASCII()
Dim R As Range
Dim var
Dim i&
Dim Col&
Dim Lig&
Dim A$
On Error GoTo Erreur
Set R = Application.InputBox(prompt:= _
"Veuillez sélectionner la plage à trier" & _
vbCrLf & "(uniquement sur une colonne)", _
Title:="Tri par ordre ASCII", Type:=8)
On Error GoTo 0
If R.Columns.Count > 1 Then
MsgBox "Veuillez ne sélectionner qu'une seule colonne"
Exit Sub
End If
var = R
For i& = 1 To UBound(var, 1)
If Not IsEmpty(var(i&, 1)) Then
var(i&, 1) = 1000 + Asc(var(i&, 1)) & var(i&, 1)
Else
var(i&, 1) = 1000 & var(i&, 1)
End If
Next i&
R = var
A$ = R.Address(ReferenceStyle:=xlR1C1)
Lig& = CLng(Mid(A$, 2, InStr(1, A$, "C") - 2))
A$ = Mid(A$, 1, InStr(1, A$, ":") - 1)
Col& = CLng(Mid(A$, InStr(1, A$, "C") + 1))
R.Sort Key1:=Range(Cells(Lig&, Col&), Cells(Lig&, Col&)), _
Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:úlse, _
Orientation:=xlTopToBottom
var = R
For i& = 1 To UBound(var, 1)
var(i&, 1) = Mid(var(i&, 1), 5)
Next i&
R = var
Erreur:
End Sub
'*****************************

Est-ce que ça vous convient ?

PMO
Patrick Morange



Bonjour !

Comment peut-on faire respecter au tri VBA l'ordre des caractères
ASCII ?




Par exemple:
Comment trier par ordre alphabétique sur une colonne qui contient
des



noms,
dont certains sont entre {Accolades}
Le tri met ces personnes en tête, alors que je les désire en fin.

De même, il met systématiquement à la fin, les lignes d'argument
vide,



alors
que Rien, c'est < à qqch.

Actuellement, j'utilise une colonne auxiliaire pour m'en sortir.

Merci d'avance

Papy Jean















Avatar
Papy Jean
Bonsoir

J'ai honte, mais j'avais trompé: ça marche bien

Encore merci
Avatar
Papy Jean
Bonsoir

Désolé, je me suis effectivement trompé en faisant l'essai

ça marche bien

Merci beaucoup
Papy Jean
Avatar
Clément Marcotte
Bonjour,

J'ai honte, mais j'avais trompé: ça marche bien


Pas grave.

Encore merci


De rien.