Se connecter avec
S'enregistrer | Connectez-vous

LE TRI DECROISSANT

Dernière réponse : dans Programmation

bonjour tout le monde :) 
voila j'ai bricoler un code
je vous explique ce que j'essai de faire
j'ai un tableau en colonne D de taille 100 (en fait je prend un tableau de taille 100 a partir de la derniere ligne non vide du tableau) la derniere ligne est :

  1. l = Worksheets("Feuil1").Cells(Rows.Count, 1).End(xlUp).Row
de la feuille ("feuil1") et je voudrai faire un tri decroissant de ce tableau dans ma macro ,puis ecrire à la cellule C40 de la feuille ("feuil2") l'avant dernier nombre plus petit du tableau trié:
voici un exemple supposons que dans ma feuille("feuil1") j'ai D=[0,4,-9,5,7]
je fait un tri decroissant la colonne D devient D=[7,5,4,0,-9] puis j'ecris en cellule C40 DE LA FEUILLE(feuil2) C40=0voici mon code:


  1. Sub detemination_var()
  2. Dim t() As Double
  3. Dim k As Long
  4. Dim z As Double
  5. Dim e As Double
  6. Dim l As Long
  7. Dim j As Long
  8. Dim temp As Double
  9. Dim a As Long
  10. Dim position_mini As Long
  11.  
  12. l = Worksheets("Feuil1").Cells(Rows.Count, 1).End(xlUp).Row
  13. ReDim t(l - 100 To l)
  14.  
  15. For k = l To LBound(t) + 2 Step -1
  16. 'le point de départ se déclare a chaque tour,on considere provisoirement que t(k) est
  17. 'le plus petit élément
  18.  
  19. t(k) = Worksheets("Feuil1").Cells(k, 4).Value
  20. position_mini = k
  21. 'on examine tous les éléments suivants:
  22. For j = k - 1 To LBound(t) + 1 Step -1
  23. t(j) = Worksheets("Feuil1").Cells(j, 4).Value
  24. If t(j) < t(position_mini) Then
  25. position_mini = j
  26. End If
  27.  
  28.  
  29. Next
  30. 'à ce endroit on sait maintenant ou est le plus petit élément,il ne reste
  31. 'plus qu'a effectuer la permutation.
  32. temp = t(position_mini)
  33. t(position_mini) = t(k)
  34. t(k) = temp
  35. 'on a placé l'element numéro k,on passe à présent au suivant.
  36.  
  37.  
  38. Next
  39. 'ecrire à la cellule C40 l'avant dernier nombre du tableau plus petit
  40. Worksheets("Feul2").Cells(40, 3).Value = Worksheets("Feuil1").Cells(l - 1, 4).Value
  41.  
  42. End Sub

j'ai deux questions ,
1)dans la forme le code que j'ai ecris est-il correcte?
2) lorsque jessai de le faire tourné j'ai l'erreur suivante: "l'indice n'appartient pas a la selection"
dans les lignes ci-dessous:


  1. t(j) = Worksheets("Feuil1").Cells(j, 4).Value
  2. t(k) = Worksheets("Feuil1").Cells(k, 4).Value
  3. t(position_mini)


merci de votre aide

Autres pages sur : tri decroissant

Lassé par la pub ? Créez un compte
Expert Programmation

Rhooolala, mais qu'est ce que c'est compliqué ! C'est plein d'indices qui se baladent.
J'ai mal au crâne, rien que d'essayer de comprendre.

Bon, regarde un peu ça : c'est quand même plus simple :
  1. Const tabsize = 100
  2. ' // Ca c'est ton code.
  3. Dim l As Long
  4. l = Worksheets("Feuil1").Cells(Rows.Count, 1).End(xlUp).Row
  5.  
  6. ' // Là, c'est une vérif, on ne sait jamais !
  7. If l < tabsize Then
  8. MsgBox "Alerte !!!!!!! Faut faire quelque chose.", vbCritical
  9. Exit Sub
  10. End If
  11.  
  12. ' // Ca c'est le mien, pas trop compliqué
  13. ' // On charge le tableau
  14. Dim table(1 To tabsize) As Double
  15. Dim k As Integer
  16.  
  17. For k = 1 To tabsize
  18. table(k) = Worksheets("Feuil1").Cells(l + k - tabsize, 1).Value
  19. Next
  20.  
  21. ' // Maintenant, on trie le tableau
  22. ' // Tri à bulle, pas terrible
  23. Dim fini As Boolean
  24. Dim buf As Double
  25.  
  26. Do
  27. ' // C'est déjà fini ...
  28. fini = True
  29. For k = 1 To tabsize - 1
  30. If table(k) > table(k + 1) Then
  31. ' // ... Ah, bah non.
  32. fini = False
  33. buf = table(k)
  34. table(k) = table(k + 1)
  35. table(k + 1) = buf
  36. End If
  37. Next
  38. Loop While Not fini
  39.  
  40. ' // la seconde plus petite valeur
  41. MsgBox table(2)


En fait, on prend le problème à l'envers. On cherche à faire fonctionner une solution avant de chercher une solution.
Trier ton tableau est à la base une bonne idée. Mais si c'est juste pour une seule valeur, tu en fais trop !

Regarde ça un peu :
  1. Dim zone As Range
  2. Dim cell0 As Range
  3. Dim cell As Range
  4. Dim min1 As Double
  5. Dim min2 As Double
  6.  
  7. Set cell0 = Worksheets("Feuil1").Cells(Rows.Count, 1).End(xlUp)
  8. Set zone = Worksheets("Feuil1").Range(cell0.Offset(-99, 0), cell0)
  9.  
  10. min1 = zone.Cells(1).Value
  11. min2 = zone.Cells(1).Value
  12.  
  13. For Each cell In zone
  14. If cell.Value < min1 Then
  15. min2 = min1
  16. min1 = cell.Value
  17. End If
  18. Next
  19.  
  20. MsgBox min2


Effectivement, si c'est la n-ième plus petite valeur, il vaut mieux faire un tri.
Pour la première ou deuxième plus petite valeur, ça peut suffire.

voila merci bien pour votre aide en m'inspirant de tes données .en fait
il manque juste un detail tres important dans la macro à inclure
je veux changer de plage a chaque fois .je mexplique
lorsque je commence a la derniere ligne non vide de la colonne D(feuil1) j'ai un tableau de 100 valeurs et je trouve l'avant dernier nombre plus petit ,la macro le fait tres bien ,ensuite je veux que le tableau commence a la ligne precedent la derniere ligne non vide de la colonne D de la feuille("feuil1")
puis definir de la meme façon un tableau de taille 100 puis determiner l'avant dernier terme plus petit

bon j'ai introduit une boucle for mais j'ai l'avant dernier nombre du tableau qui commence a la derniere ligne non vide de la colonne D sur toute ma colonne
C (de C40 à C1)

et toi regarde ça
  1. Sub determination_var_hist_cpr()
  2. Dim wsh1 As Worksheet
  3. Dim C As Range, plage As Range
  4. Dim derligne As Long
  5. Dim p As Double, pp As Double
  6. Dim a As Long
  7. Dim fin_tableau As Long
  8. a = Worksheets("Feuil2").Cells(Rows.Count, 7).End(xlUp).Row
  9. Set wsh1 = Worksheets("Feuil1")
  10. derligne = wsh1.Cells(Rows.Count, 4).End(xlUp).Row
  11. For fin_tableau = derligne To 183 Step -1
  12. Set plage = wsh1.Range("D" & derligne - 100 & ":D" & derligne)
  13. p = plage(1): pp = plage(1) - 1
  14.  
  15. For Each C In plage
  16. If C.Value < pp Then
  17. p = pp: pp = C.Value
  18. ElseIf C.Value < p Then
  19. p = C.Value
  20. End If
  21. Next
  22. Worksheets("Feuil2").Cells(a, 3).Value = p
  23. a = a - 1
  24.  
  25. derligne = derligne - 1
  26. Next
  27. Set wsh1 = Nothing: Set plage = Nothing: Set C = Nothing
  28.  
  29. End Sub


mais i y a un soucis
la colonne C de la feuil2 se rempli ,mon tableau comment a la ligne 2 mais j'ai ma cellule C2 vide :??: 

merci d'avance
Lassé par la pub ? Créez un compte