classer un variant en 3 variants

Le
merguez07
Bonjour à tous


Mon pb est assez simple mais je trouve pas une technique simple

En VBA J'ai une variable de type variant qui contient 7 valeurs

A(1)= 20
A(2)= 10
A(3)= 10
A(4)= 5
A(5)= 5
A(6)= 2
A(7)= 15

Je voudrais créer 3 variables contenant les index de A contenant les 3
plus fortes valeurs

B(1)= 1 "B contient les index A A ayant la 1ere plus grande valeur"

C(1)= 7 "C contient les index de A ayant la 2eme plus grande valeur"

D(1)= 2 "D contient les index de A ayant les 3eme plus grande valeur
D(2)= 3


Any Idea ?
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
DanielCo
Le #23142881
Bonjour,
Sub test()
Dim a(7), b(), c(), d()
'a(1) = 20
'a(2) = 10
'a(3) = 10
'a(4) = 5
'a(5) = 5
'a(6) = 2
'a(7) = 15
ReDim b(1), c(1), d(1)
For i = 1 To 7
If Application.Max(a) = a(i) Then
x = x + 1
ReDim Preserve b(x)
b(x) = a(i)
ElseIf a(i) = Application.Large(a, 2) Then
y = y + 1
ReDim Preserve c(y)
c(y) = a(i)
ElseIf a(i) = Application.Large(a, 3) Then
Z = Z + 1
ReDim Preserve d(Z)
d(Z) = a(i)
End If
Next
End Sub
Cordialement.
Daniel


Bonjour à tous


Mon pb est assez simple mais je trouve pas une technique simple

En VBA J'ai une variable de type variant qui contient 7 valeurs

A(1)= 20
A(2)= 10
A(3)= 10
A(4)= 5
A(5)= 5
A(6)= 2
A(7)= 15

Je voudrais créer 3 variables contenant les index de A contenant les 3 plus
fortes valeurs

B(1)= 1 "B contient les index A A ayant la 1ere plus grande valeur"

C(1)= 7 "C contient les index de A ayant la 2eme plus grande valeur"

D(1)= 2 "D contient les index de A ayant les 3eme plus grande valeur
D(2)= 3


Any Idea ?
isabelle
Le #23142891
bonjour merguez,

Option Base 1
Sub test()
Dim A(7)
Dim B()
Dim C()
Dim D()
Dim x As Integer, i As Integer
x = 1
A(1) = 20
A(2) = 10
A(3) = 10
A(4) = 5
A(5) = 5
A(6) = 2
A(7) = 15

ReDim Preserve B(x)
ReDim Preserve C(x)
ReDim Preserve D(x)

B(x) = Application.Match(Application.Large(A, 1), A, 0)
C(x) = Application.Match(Application.Large(A, 2), A, 0)
D(x) = Application.Match(Application.Large(A, 3), A, 0)


For i = 1 To 7
If A(B(1)) = A(i) And B(1) <> i Then
x = x + 1
ReDim Preserve B(x)
B(x) = i
End If
Next

For i = 1 To 7
If A(C(1)) = A(i) And C(1) <> i Then
x = x + 1
ReDim Preserve C(x)
C(x) = i
End If
Next

For i = 1 To 7
If A(D(1)) = A(i) And D(1) <> i Then
x = x + 1
ReDim Preserve D(x)
D(x) = i
End If
Next

End Sub

isabelle



Le 2011-02-20 05:58, merguez07 a écrit :
Bonjour à tous


Mon pb est assez simple mais je trouve pas une technique simple

En VBA J'ai une variable de type variant qui contient 7 valeurs

A(1)= 20
A(2)= 10
A(3)= 10
A(4)= 5
A(5)= 5
A(6)= 2
A(7)= 15

Je voudrais créer 3 variables contenant les index de A contenant les 3
plus fortes valeurs

B(1)= 1 "B contient les index A A ayant la 1ere plus grande valeur"

C(1)= 7 "C contient les index de A ayant la 2eme plus grande valeur"

D(1)= 2 "D contient les index de A ayant les 3eme plus grande valeur
D(2)= 3


Any Idea ?
merguez07
Le #23144021
Merci à tous les 2 mais j'ai un petit pb avec le code application.large

en effet si ma variable A contient les données suivantes

A(1)=0
A(2)=0
A(3)=2
A(4)=0
A(5)=2
A(6)=8
A(7)=2
A(8)=2
A(9)=0
A(10)=0
A(11)=1
A(12)=1
A(13)=2
A(14)=0
A(15)=0

Application.large(A,1) me donne 8. C'est bon
Application.large(A,2) me donne 2. C'est bon
Application.large(A,3) me donne 2 au lieu de 1. Là c'est pas terrible

Quel est ce mystère ?


Xavier


Le 20.02.2011 13:01, isabelle a écrit :
bonjour merguez,

Option Base 1
Sub test()
Dim A(7)
Dim B()
Dim C()
Dim D()
Dim x As Integer, i As Integer
x = 1
A(1) = 20
A(2) = 10
A(3) = 10
A(4) = 5
A(5) = 5
A(6) = 2
A(7) = 15

ReDim Preserve B(x)
ReDim Preserve C(x)
ReDim Preserve D(x)

B(x) = Application.Match(Application.Large(A, 1), A, 0)
C(x) = Application.Match(Application.Large(A, 2), A, 0)
D(x) = Application.Match(Application.Large(A, 3), A, 0)


For i = 1 To 7
If A(B(1)) = A(i) And B(1) <> i Then
x = x + 1
ReDim Preserve B(x)
B(x) = i
End If
Next

For i = 1 To 7
If A(C(1)) = A(i) And C(1) <> i Then
x = x + 1
ReDim Preserve C(x)
C(x) = i
End If
Next

For i = 1 To 7
If A(D(1)) = A(i) And D(1) <> i Then
x = x + 1
ReDim Preserve D(x)
D(x) = i
End If
Next

End Sub

isabelle



Le 2011-02-20 05:58, merguez07 a écrit :
Bonjour à tous


Mon pb est assez simple mais je trouve pas une technique simple

En VBA J'ai une variable de type variant qui contient 7 valeurs

A(1)= 20
A(2)= 10
A(3)= 10
A(4)= 5
A(5)= 5
A(6)= 2
A(7)= 15

Je voudrais créer 3 variables contenant les index de A contenant les 3
plus fortes valeurs

B(1)= 1 "B contient les index A A ayant la 1ere plus grande valeur"

C(1)= 7 "C contient les index de A ayant la 2eme plus grande valeur"

D(1)= 2 "D contient les index de A ayant les 3eme plus grande valeur
D(2)= 3


Any Idea ?
isabelle
Le #23144551
bonjour Xavier ,

non, c'est le comportement normal de la fonction grande.valeur
pour enlever les doublons avant

Option Base 1

Sub test()
Dim A()
Dim B()
Dim C()
Dim D()
Dim liste(15)
Dim x As Integer, y As Integer, z As Integer, i As Integer, w As
Integer, p As Integer
x = 1
y = 1
z = 1
liste(1) = 0
liste(2) = 0
liste(3) = 2
liste(4) = 0
liste(5) = 2
liste(6) = 8
liste(7) = 2
liste(8) = 2
liste(9) = 0
liste(10) = 0
liste(11) = 1
liste(12) = 1
liste(13) = 2
liste(14) = 0
liste(15) = 0

'enlever les doublons pour trouver grande.valeur
For w = 1 To 15
p = p + 1
ReDim Preserve A(p)
If IsError(Application.Match(liste(w), A, 0)) Then
A(p) = liste(w)
End If
Next

ReDim Preserve B(x)
ReDim Preserve C(x)
ReDim Preserve D(x)

B(1) = Application.Match(Application.Large(A, 1), A, 0)
C(1) = Application.Match(Application.Large(A, 2), A, 0)
D(1) = Application.Match(Application.Large(A, 3), A, 0)


For i = 1 To 15
If liste(B(1)) = liste(i) And B(1) <> i Then
x = x + 1
ReDim Preserve B(x)
B(x) = i
End If

If liste(C(1)) = liste(i) And C(1) <> i Then
y = y + 1
ReDim Preserve C(y)
C(y) = i
End If

If liste(D(1)) = liste(i) And D(1) <> i Then
z = z + 1
ReDim Preserve D(z)
D(z) = i
End If
Next
End Sub

isabelle

Le 2011-02-20 12:57, merguez07 a écrit :
Merci à tous les 2 mais j'ai un petit pb avec le code application.large

en effet si ma variable A contient les données suivantes

Application.large(A,1) me donne 8. C'est bon
Application.large(A,2) me donne 2. C'est bon
Application.large(A,3) me donne 2 au lieu de 1. Là c'est pas terrible

Quel est ce mystère ?


Xavier


DanielCo
Le #23144751
Sub test()
Dim a(15), b(), c(), d()
a(1) = 0
a(2) = 0
a(3) = 2
a(4) = 0
a(5) = 2
a(6) = 8
a(7) = 2
a(8) = 2
a(9) = 0
a(10) = 0
a(11) = 1
a(12) = 1
a(13) = 2
a(14) = 0
a(15) = 0
Set Robert = CreateObject("scripting.dictionary")
For i = 1 To UBound(a)
If Not Robert.exists(a(i)) Then
Robert.Add a(i), a(i)
End If
Next i
With Application
Un = .Max(Robert.Items)
Deux = .Large(Robert.Items, 2)
Trois = .Large(Robert.Items, 3)
End With
ReDim b(1), c(1), d(1)
For i = 1 To UBound(a)
If a(i) = Un Then
x = x + 1
ReDim Preserve b(x)
b(x) = a(i)
ElseIf a(i) = Deux Then
y = y + 1
ReDim Preserve c(y)
c(y) = a(i)
ElseIf a(i) = Trois Then
Z = Z + 1
ReDim Preserve d(Z)
d(Z) = a(i)
End If
Next
End Sub

Daniel


Merci à tous les 2 mais j'ai un petit pb avec le code application.large

en effet si ma variable A contient les données suivantes

A(1)=0
A(2)=0
A(3)=2
A(4)=0
A(5)=2
A(6)=8
A(7)=2
A(8)=2
A(9)=0
A(10)=0
A(11)=1
A(12)=1
A(13)=2
A(14)=0
A(15)=0

Application.large(A,1) me donne 8. C'est bon
Application.large(A,2) me donne 2. C'est bon
Application.large(A,3) me donne 2 au lieu de 1. Là c'est pas terrible

Quel est ce mystère ?


Xavier


Le 20.02.2011 13:01, isabelle a écrit :
bonjour merguez,

Option Base 1
Sub test()
Dim A(7)
Dim B()
Dim C()
Dim D()
Dim x As Integer, i As Integer
x = 1
A(1) = 20
A(2) = 10
A(3) = 10
A(4) = 5
A(5) = 5
A(6) = 2
A(7) = 15

ReDim Preserve B(x)
ReDim Preserve C(x)
ReDim Preserve D(x)

B(x) = Application.Match(Application.Large(A, 1), A, 0)
C(x) = Application.Match(Application.Large(A, 2), A, 0)
D(x) = Application.Match(Application.Large(A, 3), A, 0)


For i = 1 To 7
If A(B(1)) = A(i) And B(1) <> i Then
x = x + 1
ReDim Preserve B(x)
B(x) = i
End If
Next

For i = 1 To 7
If A(C(1)) = A(i) And C(1) <> i Then
x = x + 1
ReDim Preserve C(x)
C(x) = i
End If
Next

For i = 1 To 7
If A(D(1)) = A(i) And D(1) <> i Then
x = x + 1
ReDim Preserve D(x)
D(x) = i
End If
Next

End Sub

isabelle



Le 2011-02-20 05:58, merguez07 a écrit :
Bonjour à tous


Mon pb est assez simple mais je trouve pas une technique simple

En VBA J'ai une variable de type variant qui contient 7 valeurs

A(1)= 20
A(2)= 10
A(3)= 10
A(4)= 5
A(5)= 5
A(6)= 2
A(7)= 15

Je voudrais créer 3 variables contenant les index de A contenant les 3
plus fortes valeurs

B(1)= 1 "B contient les index A A ayant la 1ere plus grande valeur"

C(1)= 7 "C contient les index de A ayant la 2eme plus grande valeur"

D(1)= 2 "D contient les index de A ayant les 3eme plus grande valeur
D(2)= 3


Any Idea ?
merguez07
Le #23145041
merci à tous les 2. Les 2 méthodes fonctionnent

Cordialement
Xavier



Le 20.02.2011 22:37, DanielCo a écrit :
Sub test()
Dim a(15), b(), c(), d()
a(1) = 0
a(2) = 0
a(3) = 2
a(4) = 0
a(5) = 2
a(6) = 8
a(7) = 2
a(8) = 2
a(9) = 0
a(10) = 0
a(11) = 1
a(12) = 1
a(13) = 2
a(14) = 0
a(15) = 0
Set Robert = CreateObject("scripting.dictionary")
For i = 1 To UBound(a)
If Not Robert.exists(a(i)) Then
Robert.Add a(i), a(i)
End If
Next i
With Application
Un = .Max(Robert.Items)
Deux = .Large(Robert.Items, 2)
Trois = .Large(Robert.Items, 3)
End With
ReDim b(1), c(1), d(1)
For i = 1 To UBound(a)
If a(i) = Un Then
x = x + 1
ReDim Preserve b(x)
b(x) = a(i)
ElseIf a(i) = Deux Then
y = y + 1
ReDim Preserve c(y)
c(y) = a(i)
ElseIf a(i) = Trois Then
Z = Z + 1
ReDim Preserve d(Z)
d(Z) = a(i)
End If
Next
End Sub

Daniel


Merci à tous les 2 mais j'ai un petit pb avec le code application.large

en effet si ma variable A contient les données suivantes

A(1)=0
A(2)=0
A(3)=2
A(4)=0
A(5)=2
A(6)=8
A(7)=2
A(8)=2
A(9)=0
A(10)=0
A(11)=1
A(12)=1
A(13)=2
A(14)=0
A(15)=0

Application.large(A,1) me donne 8. C'est bon
Application.large(A,2) me donne 2. C'est bon
Application.large(A,3) me donne 2 au lieu de 1. Là c'est pas terrible

Quel est ce mystère ?


Xavier


Le 20.02.2011 13:01, isabelle a écrit :
bonjour merguez,

Option Base 1
Sub test()
Dim A(7)
Dim B()
Dim C()
Dim D()
Dim x As Integer, i As Integer
x = 1
A(1) = 20
A(2) = 10
A(3) = 10
A(4) = 5
A(5) = 5
A(6) = 2
A(7) = 15

ReDim Preserve B(x)
ReDim Preserve C(x)
ReDim Preserve D(x)

B(x) = Application.Match(Application.Large(A, 1), A, 0)
C(x) = Application.Match(Application.Large(A, 2), A, 0)
D(x) = Application.Match(Application.Large(A, 3), A, 0)


For i = 1 To 7
If A(B(1)) = A(i) And B(1) <> i Then
x = x + 1
ReDim Preserve B(x)
B(x) = i
End If
Next

For i = 1 To 7
If A(C(1)) = A(i) And C(1) <> i Then
x = x + 1
ReDim Preserve C(x)
C(x) = i
End If
Next

For i = 1 To 7
If A(D(1)) = A(i) And D(1) <> i Then
x = x + 1
ReDim Preserve D(x)
D(x) = i
End If
Next

End Sub

isabelle



Le 2011-02-20 05:58, merguez07 a écrit :
Bonjour à tous


Mon pb est assez simple mais je trouve pas une technique simple

En VBA J'ai une variable de type variant qui contient 7 valeurs

A(1)= 20
A(2)= 10
A(3)= 10
A(4)= 5
A(5)= 5
A(6)= 2
A(7)= 15

Je voudrais créer 3 variables contenant les index de A contenant les 3
plus fortes valeurs

B(1)= 1 "B contient les index A A ayant la 1ere plus grande valeur"

C(1)= 7 "C contient les index de A ayant la 2eme plus grande valeur"

D(1)= 2 "D contient les index de A ayant les 3eme plus grande valeur
D(2)= 3


Any Idea ?








Publicité
Poster une réponse
Anonyme