OVH Cloud OVH Cloud

Valeurs uniques triées dans un tableau VBA

54 réponses
Avatar
Herdet
Bonsoir à tous,
Après une recherche infructueuse et des tests un peu laborieux je fais appel
à vous.
J'ai tableau VBA de 10 à 1200 lignes ( 1 colonne) nommé TAval
Je cherche à supprimer tous les doublons puis à le trier par ordre croissant
(ou décroissant).
Et bien sûr le tout en VBA ou bien en API Windows (plus rapides) sans
utiliser les filtres de feuille de calcul
Merci
Cordiales salutations
Robert Dezan

10 réponses

2 3 4 5 6
Avatar
michdenis
Bonjour Daniel, Frédéric,

Serait-ce envisageable d'utiliser comme tableau une plage de cellules plutôt qu'une liste de data.

En pratique, remplacer cette ligne :
'tableau exemple
Arr = Array(5, 8, 1, 1, 21, 4, 5, 8, 9, 1, 2, 4, _
5, 12, 4, 21, 3, 6)

Par
Arr = range("A1:A20")

Merci pour votre collaboration,


Salutations!






"Daniel.M" a écrit dans le message de news:
Salut Frédéric, Robert,

On peut économiser quelques bouclettes en utilisant un objet Dictionary au
lieu

d'une collection (toujours en utilisant le QuickSort pour trier) :



Dans les cas où il faut faire le tri de toute façon, on peut en profiter pour
remettre l'évaluation des doublons à plus tard et ainsi contourner l'usage d'une
collection ou d'un objet Dictionary. Dans le code qui suit, j'ai omis de
recopier QuickSort.

'================== ' DMA
' On trie d'abord
' et on élimine ensuite en sachant que les
' semblables sont obligatoirement consécutifs
'
Sub TabValUniquesTriées()
Dim Arr(), Arr2()
Dim i&, j&, k&, m&, s As String

'tableau exemple
Arr = Array(5, 8, 1, 1, 21, 4, 5, 8, 9, 1, 2, 4, _
5, 12, 4, 21, 3, 6)

j = LBound(Arr)
k = UBound(Arr)

QuickSort Arr(), j, k
ReDim Arr2(j To k)

m = j
Arr2(m) = Arr(m) ' le premier est unique!

For i = j + 1 To k ' commence au deuxième
If Arr(i) <> Arr(i - 1) Then
m = m + 1
Arr2(m) = Arr(i)
End If
Next i

ReDim Preserve Arr2(j To m)

'Affiche le résultat
For i = j To m
s = s & " " & Arr2(i)
Next
MsgBox s

End Sub
'==================
Salutations,

Daniel M.

Avatar
Daniel.M
Hello,

Serait-ce envisageable d'utiliser comme tableau une plage de
cellules plutôt qu'une liste de data.


Oui Denis, avec la précaution qu'on aurait alors un tableau bi-dimensionnel (1
To 20, 1 To 1), donc les procédures TabValUniquesTriées et QuickSort à adapter.

C'est seulement que la question de Robert avait au départ seulement un tableau
VBA (et comme je me suis déjà fait rappeler à l'ordre là-dessus plus haut dans
ce fil...).

Mais on peut évidemment récupérer les données d'une plage.
Et pour tout te dire, en plus, je ferais de cette procédure, une fonction.

Mais Robert ne donne pas signe de vie... :­~|

Daniel M.

"michdenis" wrote in message
news:
Bonjour Daniel, Frédéric,

Serait-ce envisageable d'utiliser comme tableau une plage de cellules plutôt
qu'une liste de data.


En pratique, remplacer cette ligne :
'tableau exemple
Arr = Array(5, 8, 1, 1, 21, 4, 5, 8, 9, 1, 2, 4, _
5, 12, 4, 21, 3, 6)

Par
Arr = range("A1:A20")

Merci pour votre collaboration,


Salutations!


Avatar
Frédéric Sigonneau
Bonsoir Denis,

Oui, certainement. Juste ne pas oublier que le tableau obtenu avec ce genre
d'affectation est un tableau à 2 dimensions, de base 1.
En passant, il me parait préférable pour que les choses soient claires de
préciser ce que tu affectes :
Arr = Range("A1:A20").Value
plutôt que
Arr = Range("A1:A20")
(dont je ne suis pas sûr d'ailleurs qu'il passe avec toutes les versions).
Et puis c'est une bonne habitude à prendre, de mon point de vue, d'éviter
d'utiliser les propriétés par défaut des objets. Ça économise les doigts mais je
ne trouve pas ça pédagogique. Prendre la peine d'écrire .Value, c'est une sorte
de recordatorio pour se souvenir que l'objet Range a d'autres propriétés comme
Value2 (très pratique pour les dates) ou Text (qui permet de travailler le
contenu d'une cellule comme une chaine de caractères).
Je constate souvent que nous ne sommes pas nombreux à partager cet avis ici,
mais bon, on ne se refait pas comme on dit :)

FS
---
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://frederic.sigonneau.free.fr
Si votre question sur Excel est urgente, évitez ma bal !

Bonjour Daniel, Frédéric,

Serait-ce envisageable d'utiliser comme tableau une plage de cellules plutôt qu'une liste de data.

En pratique, remplacer cette ligne :
'tableau exemple
Arr = Array(5, 8, 1, 1, 21, 4, 5, 8, 9, 1, 2, 4, _
5, 12, 4, 21, 3, 6)

Par
Arr = range("A1:A20")

Merci pour votre collaboration,


Salutations!






"Daniel.M" a écrit dans le message de news:
Salut Frédéric, Robert,


On peut économiser quelques bouclettes en utilisant un objet Dictionary au


lieu

d'une collection (toujours en utilisant le QuickSort pour trier) :




Dans les cas où il faut faire le tri de toute façon, on peut en profiter pour
remettre l'évaluation des doublons à plus tard et ainsi contourner l'usage d'une
collection ou d'un objet Dictionary. Dans le code qui suit, j'ai omis de
recopier QuickSort.

'================== > ' DMA
' On trie d'abord
' et on élimine ensuite en sachant que les
' semblables sont obligatoirement consécutifs
'
Sub TabValUniquesTriées()
Dim Arr(), Arr2()
Dim i&, j&, k&, m&, s As String

'tableau exemple
Arr = Array(5, 8, 1, 1, 21, 4, 5, 8, 9, 1, 2, 4, _
5, 12, 4, 21, 3, 6)

j = LBound(Arr)
k = UBound(Arr)

QuickSort Arr(), j, k
ReDim Arr2(j To k)

m = j
Arr2(m) = Arr(m) ' le premier est unique!

For i = j + 1 To k ' commence au deuxième
If Arr(i) <> Arr(i - 1) Then
m = m + 1
Arr2(m) = Arr(i)
End If
Next i

ReDim Preserve Arr2(j To m)

'Affiche le résultat
For i = j To m
s = s & " " & Arr2(i)
Next
MsgBox s

End Sub
'================== >
Salutations,

Daniel M.






Avatar
jps
c'était pour voir si je suivais la démo, frédéric?
jps

"Frédéric Sigonneau" a écrit dans le message de
news:Oe$e$
Bonsoir Denis,
....c'est une sorte de recordatorio ....


Avatar
michdenis
Bonsoir Frédéric, Daniel,

Merci pour l'information.

Lorsqu'on utilise la propriété des objets comme dans l'exemple que tu as mentionné, on a l'impression que plus le code
s'allonge plus la durée de traitement va en souffrir ! D'où la tendance en s'en tenir au strict minimum ! ;-))


Salutations!




"Frédéric Sigonneau" a écrit dans le message de news:
Oe$e$
Bonsoir Denis,

Oui, certainement. Juste ne pas oublier que le tableau obtenu avec ce genre
d'affectation est un tableau à 2 dimensions, de base 1.
En passant, il me parait préférable pour que les choses soient claires de
préciser ce que tu affectes :
Arr = Range("A1:A20").Value
plutôt que
Arr = Range("A1:A20")
(dont je ne suis pas sûr d'ailleurs qu'il passe avec toutes les versions).
Et puis c'est une bonne habitude à prendre, de mon point de vue, d'éviter
d'utiliser les propriétés par défaut des objets. Ça économise les doigts mais je
ne trouve pas ça pédagogique. Prendre la peine d'écrire .Value, c'est une sorte
de recordatorio pour se souvenir que l'objet Range a d'autres propriétés comme
Value2 (très pratique pour les dates) ou Text (qui permet de travailler le
contenu d'une cellule comme une chaine de caractères).
Je constate souvent que nous ne sommes pas nombreux à partager cet avis ici,
mais bon, on ne se refait pas comme on dit :)

FS
---
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://frederic.sigonneau.free.fr
Si votre question sur Excel est urgente, évitez ma bal !

Bonjour Daniel, Frédéric,

Serait-ce envisageable d'utiliser comme tableau une plage de cellules plutôt qu'une liste de data.

En pratique, remplacer cette ligne :
'tableau exemple
Arr = Array(5, 8, 1, 1, 21, 4, 5, 8, 9, 1, 2, 4, _
5, 12, 4, 21, 3, 6)

Par
Arr = range("A1:A20")

Merci pour votre collaboration,


Salutations!






"Daniel.M" a écrit dans le message de news:
Salut Frédéric, Robert,


On peut économiser quelques bouclettes en utilisant un objet Dictionary au


lieu

d'une collection (toujours en utilisant le QuickSort pour trier) :




Dans les cas où il faut faire le tri de toute façon, on peut en profiter pour
remettre l'évaluation des doublons à plus tard et ainsi contourner l'usage d'une
collection ou d'un objet Dictionary. Dans le code qui suit, j'ai omis de
recopier QuickSort.

'================== > ' DMA
' On trie d'abord
' et on élimine ensuite en sachant que les
' semblables sont obligatoirement consécutifs
'
Sub TabValUniquesTriées()
Dim Arr(), Arr2()
Dim i&, j&, k&, m&, s As String

'tableau exemple
Arr = Array(5, 8, 1, 1, 21, 4, 5, 8, 9, 1, 2, 4, _
5, 12, 4, 21, 3, 6)

j = LBound(Arr)
k = UBound(Arr)

QuickSort Arr(), j, k
ReDim Arr2(j To k)

m = j
Arr2(m) = Arr(m) ' le premier est unique!

For i = j + 1 To k ' commence au deuxième
If Arr(i) <> Arr(i - 1) Then
m = m + 1
Arr2(m) = Arr(i)
End If
Next i

ReDim Preserve Arr2(j To m)

'Affiche le résultat
For i = j To m
s = s & " " & Arr2(i)
Next
MsgBox s

End Sub
'================== >
Salutations,

Daniel M.






Avatar
Frédéric Sigonneau
:-)

FS
---
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://frederic.sigonneau.free.fr
Si votre question sur Excel est urgente, évitez ma bal !

c'était pour voir si je suivais la démo, frédéric?
jps

"Frédéric Sigonneau" a écrit dans le message de
news:Oe$e$

Bonsoir Denis,
....c'est une sorte de recordatorio ....






Avatar
Herdet
Bonsoir à tous,
Je remercie tout particulièrement Frédéric Sigonneau, DanielM, AV MichDenis
et JPS pour l'aide concernant le tri et la suppression de doublons dans un
tableau VBA (Fil : valeurs uniques triés dans un tableau VBA achevé le
30/11 ce n'est pas si vieux que cà.)
Mes excuses pour ce retard ( pas de commentaire JPS !)
Je mets les procédures proposées en test et en application et je vous tiens
au courant.
Cordialement
Robert
PS : pas mal la discussion animée sur les contrepèteries



"Daniel.M" a écrit dans le message de
news:
Hello,

Serait-ce envisageable d'utiliser comme tableau une plage de
cellules plutôt qu'une liste de data.


Oui Denis, avec la précaution qu'on aurait alors un tableau
bi-dimensionnel (1

To 20, 1 To 1), donc les procédures TabValUniquesTriées et QuickSort à
adapter.


C'est seulement que la question de Robert avait au départ seulement un
tableau

VBA (et comme je me suis déjà fait rappeler à l'ordre là-dessus plus haut
dans

ce fil...).

Mais on peut évidemment récupérer les données d'une plage.
Et pour tout te dire, en plus, je ferais de cette procédure, une fonction.

Mais Robert ne donne pas signe de vie... :­~|

Daniel M.

"michdenis" wrote in message
news:
Bonjour Daniel, Frédéric,

Serait-ce envisageable d'utiliser comme tableau une plage de cellules
plutôt


qu'une liste de data.

En pratique, remplacer cette ligne :
'tableau exemple
Arr = Array(5, 8, 1, 1, 21, 4, 5, 8, 9, 1, 2, 4, _
5, 12, 4, 21, 3, 6)

Par
Arr = range("A1:A20")

Merci pour votre collaboration,


Salutations!






Avatar
jps
des commentaires, moi, bobby?
ah si, juste un tout petit : quel honneur de voir figurer mes iniitales aux
côtés des plus émérites contributeurs de ce forum, avec une mention spéciale
à michel denis qui mériterait davantage les prénoms de vincent et de
paul...si ma plume était plus alerte, j'écrirais un roman "Le viel homme et
maher"
jps

"Herdet" a écrit dans le message de
news:OWnyow%
Bonsoir à tous,
Je remercie tout particulièrement Frédéric Sigonneau, DanielM, AV
MichDenis

et JPS pour l'aide concernant le tri et la suppression de doublons dans un
tableau VBA (Fil : valeurs uniques triés dans un tableau VBA achevé le
30/11 ce n'est pas si vieux que cà.)
Mes excuses pour ce retard ( pas de commentaire JPS !)
Je mets les procédures proposées en test et en application et je vous
tiens

au courant.
Cordialement
Robert
PS : pas mal la discussion animée sur les contrepèteries



"Daniel.M" a écrit dans le message de
news:
Hello,

Serait-ce envisageable d'utiliser comme tableau une plage de
cellules plutôt qu'une liste de data.


Oui Denis, avec la précaution qu'on aurait alors un tableau
bi-dimensionnel (1

To 20, 1 To 1), donc les procédures TabValUniquesTriées et QuickSort à
adapter.


C'est seulement que la question de Robert avait au départ seulement un
tableau

VBA (et comme je me suis déjà fait rappeler à l'ordre là-dessus plus
haut


dans
ce fil...).

Mais on peut évidemment récupérer les données d'une plage.
Et pour tout te dire, en plus, je ferais de cette procédure, une
fonction.



Mais Robert ne donne pas signe de vie... :­~|

Daniel M.

"michdenis" wrote in message
news:
Bonjour Daniel, Frédéric,

Serait-ce envisageable d'utiliser comme tableau une plage de cellules
plutôt


qu'une liste de data.

En pratique, remplacer cette ligne :
'tableau exemple
Arr = Array(5, 8, 1, 1, 21, 4, 5, 8, 9, 1, 2, 4, _
5, 12, 4, 21, 3, 6)

Par
Arr = range("A1:A20")

Merci pour votre collaboration,


Salutations!










Avatar
twinley
ouf, on l'a encore échappé belle...

twinley

jps wrote:
des commentaires, moi, bobby?
ah si, juste un tout petit : quel honneur de voir figurer mes iniitales aux
côtés des plus émérites contributeurs de ce forum, avec une mention spéciale
à michel denis qui mériterait davantage les prénoms de vincent et de
paul...si ma plume était plus alerte, j'écrirais un roman "Le viel homme et
maher"
jps

"Herdet" a écrit dans le message de
news:OWnyow%

Bonsoir à tous,
Je remercie tout particulièrement Frédéric Sigonneau, DanielM, AV


MichDenis

et JPS pour l'aide concernant le tri et la suppression de doublons dans un
tableau VBA (Fil : valeurs uniques triés dans un tableau VBA achevé le
30/11 ce n'est pas si vieux que cà.)
Mes excuses pour ce retard ( pas de commentaire JPS !)
Je mets les procédures proposées en test et en application et je vous


tiens

au courant.
Cordialement
Robert
PS : pas mal la discussion animée sur les contrepèteries



"Daniel.M" a écrit dans le message de
news:

Hello,


Serait-ce envisageable d'utiliser comme tableau une plage de
cellules plutôt qu'une liste de data.


Oui Denis, avec la précaution qu'on aurait alors un tableau


bi-dimensionnel (1

To 20, 1 To 1), donc les procédures TabValUniquesTriées et QuickSort à


adapter.

C'est seulement que la question de Robert avait au départ seulement un


tableau

VBA (et comme je me suis déjà fait rappeler à l'ordre là-dessus plus



haut

dans

ce fil...).

Mais on peut évidemment récupérer les données d'une plage.
Et pour tout te dire, en plus, je ferais de cette procédure, une



fonction.

Mais Robert ne donne pas signe de vie... :­~|

Daniel M.

"michdenis" wrote in message
news:

Bonjour Daniel, Frédéric,

Serait-ce envisageable d'utiliser comme tableau une plage de cellules



plutôt

qu'une liste de data.

En pratique, remplacer cette ligne :
'tableau exemple
Arr = Array(5, 8, 1, 1, 21, 4, 5, 8, 9, 1, 2, 4, _
5, 12, 4, 21, 3, 6)

Par
Arr = range("A1:A20")

Merci pour votre collaboration,


Salutations!












Avatar
Daniel.M
C'était avec plaisir, Robert.

Salutations,

Daniel M"

"Herdet" wrote in message
news:OWnyow%
Bonsoir à tous,
Je remercie tout particulièrement Frédéric Sigonneau, DanielM, AV MichDenis
et JPS pour l'aide concernant le tri et la suppression de doublons dans un
tableau VBA (Fil : valeurs uniques triés dans un tableau VBA achevé le
30/11 ce n'est pas si vieux que cà.)
Mes excuses pour ce retard ( pas de commentaire JPS !)
Je mets les procédures proposées en test et en application et je vous tiens
au courant.
Cordialement
Robert
PS : pas mal la discussion animée sur les contrepèteries



2 3 4 5 6