Tri et choix de valeurs [VBA]
Bonjour à tous!
Débutante en programmation, je suis entrain de réaliser un programme sous VBA-Excel avec des macros et je rencontre un petit problème pour l'un de mes modules. Si vous pouvez m'aider ce serait super!
Je tenais aussi à dire que ma programmation n'est sûrement pas optimisée mais étant débutante, tant que ça marche, je suis contente!
Explication de la situation et ce qui est réalisé :
Dans un de mes modules, je réalise un calcul nommé Vcopi(m,p) où les indices m et p sont respectivement lignes et colonnes par rapport au calcul qui réalise. A partir de cela les valeurs calculées sont donc stockées dans mon tableau "virtuel" Vcopi(m,p).
Pour la suite, je veux trouver la valeur maximale de Vcopi(m,p). J'ai réussi à le faire grâce à une boucle et même à récupérer pour quel m et p c'est.
Je fais ensuite avec cette valeur maximale d'autres calculs mais si les résultats de ces calculs ne remplissent pas certaines conditions (par exemple dépasse une valeur), alors je remonte un peu plus haut dans mon programme et refait la boucle avec la deuxième valeur maximale et ainsi de suite tant que je n'ai pas la valeur qui remplit toutes les conditions.
Problème à résoudre :
Mon problème est que je n'arrive pas à récupérer la deuxième valeur maximale ou troisième ou etc.. tout en récupérant pour quel m et p c'est.
Ce que j'ai actuellement :
Récupérer la valeur max:
vecteur_max = Vcopf(1, 1)
For m = 1 To 400
For p = 1 To 13
If Vcopf(m, p) > vecteur_max Then
vecteur_max = Vcopf(m, p)
indexp = p
indexm = m
End If
Next p
Next m
Ensuite je fais des calculs grâce à cette valeur et les index m et p puis je rentre cette valeur dans des boucles par rapport à des calculs :
If N <= Nmax Then
If aptotal <= apmax(indexp) Then
P = calcul_P(Vcopi(indexm, indexp), Kc, aptotal, avance(indexm, indexp))
Else
MsgBox "Pas bon ap"
End If
Else
MsgBox "Pas bon N"
End If
Pour l'instant j'ai mis des MsgBox quand la condition n'était pas respectée mais à la place il faut revenir à la recherche de la valeur maximale et obtenir la deuxième valeur maximale, troisième, etc..
Merci de votre aide!
Bonjour,
Sans fichier, on voit difficilement. Cependant compte tenu de la problématique que tu annonces, tu aurais peut-être intérêt à un tableau listant toutes les valeurs de 1 à n, n étant nb lignes * nb colonnes
Pour chaque valeur tu enregistres : valeur, ligne, colonne.
Soit un tableau : NomTableau(n, 2)
Une fois constitué tu le tries par valeurs décroissantes, donc tes valeurs max 1, 2, 3... seront dans l'ordre.
(J'ai laissé l'élément 0 de la 1re dimension inutilisé, je m'en sers habituellement pour "switcher" lors de routine de tri...)
Cordialement.
BONJOUR
Regarder ca peut etre va vous aider
Option Base 1
Sub maxx()
Dim i As Integer, P As Integer, m As Integer, c As Integer, posi As Integer
Dim L As Integer, ww As Integer, vecteur_max, indexp As Integer, indexm As Integer
Dim tabtemps(), ArrayName()
ReDim tabtemps(400 * 13, 3)
ReDim ArrayName(400 * 13, 3)
nb = 400 * 13
c = 0
For m = 1 To 400
For P = 1 To 13
c = c + 1
tabtemps(c, 1) = Vcopf(m, P)
tabtemps(c, 2) = m
tabtemps(c, 3) = P
Next P
Next m
For i = 1 To nb
posi = 1
For L = 1 To nb
If tabtemps(i, 1) < tabtemps(L, 1) And i <> L Then
posi = posi + 1
End If
Next
For ww = 1 To 1
If ArrayName(posi, 1) = "" Then
ArrayName(posi, 1) = tabtemps(i, 1)
ArrayName(posi, 2) = tabtemps(i, 2)
ArrayName(posi, 3) = tabtemps(i, 3)
Else
posi = posi + 1
ww = ww - 1
End If
Next
Next
'#################################################################
For x = 1 To nb
If n <= Nmax Then
If aptotal <= apmax(ArrayName(x, 3)) Then
P = calcul_P(Vcopi(ArrayName(x, 2), ArrayName(x, 3)), Kc, aptotal, avance(ArrayName(x, 2), ArrayName(x, 3)))
Next x
End SubJe tenais aussi à dire que ma programmation n'est sûrement pas optimisée mais étant débutant, tant que ça marche, je suis content!
BONJOUR
Regarder ca peut etre va vous aider jai change > par <
Option Base 1
Sub maxx()
Dim i As Integer, P As Integer, m As Integer, c As Integer, posi As Integer
Dim L As Integer, ww As Integer, vecteur_max, indexp As Integer, indexm As Integer
Dim tabtemps(), ArrayName()
ReDim tabtemps(400 * 13, 3)
ReDim ArrayName(400 * 13, 3)
nb = 400 * 13
c = 0
For m = 1 To 400
For P = 1 To 13
c = c + 1
tabtemps(c, 1) = Vcopf(m, P)
tabtemps(c, 2) = m
tabtemps(c, 3) = P
Next P
Next m
For i = 1 To nb
posi = 1
For L = 1 To nb
If tabtemps(i, 1) < tabtemps(L, 1) And i <> L Then
posi = posi + 1
End If
Next
For ww = 1 To 1
If ArrayName(posi, 1) = "" Then
ArrayName(posi, 1) = tabtemps(i, 1)
ArrayName(posi, 2) = tabtemps(i, 2)
ArrayName(posi, 3) = tabtemps(i, 3)
Else
posi = posi + 1
ww = ww - 1
End If
Next
Next
'#################################################################
For x = 1 To nb
If n <= Nmax Then
If aptotal <= apmax(ArrayName(x, 3)) Then
P = calcul_P(Vcopi(ArrayName(x, 2), ArrayName(x, 3)), Kc, aptotal, avance(ArrayName(x, 2), ArrayName(x, 3)))
Next x
End Sub
Merci beaucoup pour les réponses! Je vais essayer tout ça et je vous tiens au courant!
Bonjour AMIR,
Par rapport à votre programme, est-ce que vous pouvez me dire à quoi correspond ww?
Je ne vois pas à quoi sert cette boucle surtout qu'elle va de 1 à 1, j'ai du mal à me la représenter..
Merci!
BONJOUR
Bien sur est une partie interissante de mecanisme, mais seulement dit moi es vous pouvez palcer mon code quelque part dans ta macros