LE TRI DECROISSANT

  • Auteur de la discussion dianbobo
  • Date de début

dianbobo

Expert
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 :

[cpp] l = Worksheets("Feuil1").Cells(Rows.Count, 1).End(xlUp).Row[/cpp]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:


[cpp]Sub detemination_var()
Dim t() As Double
Dim k As Long
Dim z As Double
Dim e As Double
Dim l As Long
Dim j As Long
Dim temp As Double
Dim a As Long
Dim position_mini As Long

l = Worksheets("Feuil1").Cells(Rows.Count, 1).End(xlUp).Row
ReDim t(l - 100 To l)

For k = l To LBound(t) + 2 Step -1
'le point de départ se déclare a chaque tour,on considere provisoirement que t(k) est
'le plus petit élément

t(k) = Worksheets("Feuil1").Cells(k, 4).Value
position_mini = k
'on examine tous les éléments suivants:
For j = k - 1 To LBound(t) + 1 Step -1
t(j) = Worksheets("Feuil1").Cells(j, 4).Value
If t(j) < t(position_mini) Then
position_mini = j
End If


Next
'à ce endroit on sait maintenant ou est le plus petit élément,il ne reste
'plus qu'a effectuer la permutation.
temp = t(position_mini)
t(position_mini) = t(k)
t(k) = temp
'on a placé l'element numéro k,on passe à présent au suivant.


Next
'ecrire à la cellule C40 l'avant dernier nombre du tableau plus petit
Worksheets("Feul2").Cells(40, 3).Value = Worksheets("Feuil1").Cells(l - 1, 4).Value

End Sub[/cpp]
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:


[cpp]t(j) = Worksheets("Feuil1").Cells(j, 4).Value
t(k) = Worksheets("Feuil1").Cells(k, 4).Value
t(position_mini) [/cpp]

merci de votre aide
 

zeb

Modérateur
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 :
Code:
Const tabsize = 100
' // Ca c'est ton code.
Dim l As Long
l = Worksheets("Feuil1").Cells(Rows.Count, 1).End(xlUp).Row

' // Là, c'est une vérif, on ne sait jamais !
If l < tabsize Then
    MsgBox "Alerte !!!!!!! Faut faire quelque chose.", vbCritical
    Exit Sub
End If

' // Ca c'est le mien, pas trop compliqué
' // On charge le tableau
Dim table(1 To tabsize) As Double
Dim k As Integer

For k = 1 To tabsize
    table(k) = Worksheets("Feuil1").Cells(l + k - tabsize, 1).Value
Next

' // Maintenant, on trie le tableau
' // Tri à bulle, pas terrible
Dim fini As Boolean
Dim buf As Double

Do
    ' // C'est déjà fini ...
    fini = True
    For k = 1 To tabsize - 1
        If table(k) > table(k + 1) Then
            ' // ... Ah, bah non.
            fini = False
            buf = table(k)
            table(k) = table(k + 1)
            table(k + 1) = buf
        End If
    Next
Loop While Not fini

' // la seconde plus petite valeur
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 :
Code:
Dim zone  As Range
Dim cell0 As Range
Dim cell  As Range
Dim min1  As Double
Dim min2  As Double

Set cell0 = Worksheets("Feuil1").Cells(Rows.Count, 1).End(xlUp)
Set zone = Worksheets("Feuil1").Range(cell0.Offset(-99, 0), cell0)

min1 = zone.Cells(1).Value
min2 = zone.Cells(1).Value

For Each cell In zone
    If cell.Value < min1 Then
        min2 = min1
        min1 = cell.Value
    End If
Next

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.
 

dianbobo

Expert
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
[cpp]Sub determination_var_hist_cpr()
Dim wsh1 As Worksheet
Dim C As Range, plage As Range
Dim derligne As Long
Dim p As Double, pp As Double
Dim a As Long
Dim fin_tableau As Long
a = Worksheets("Feuil2").Cells(Rows.Count, 7).End(xlUp).Row
Set wsh1 = Worksheets("Feuil1")
derligne = wsh1.Cells(Rows.Count, 4).End(xlUp).Row
For fin_tableau = derligne To 183 Step -1
Set plage = wsh1.Range("D" & derligne - 100 & ":D" & derligne)
p = plage(1): pp = plage(1) - 1

For Each C In plage
If C.Value < pp Then
p = pp: pp = C.Value
ElseIf C.Value < p Then
p = C.Value
End If
Next
Worksheets("Feuil2").Cells(a, 3).Value = p
a = a - 1

derligne = derligne - 1
Next
Set wsh1 = Nothing: Set plage = Nothing: Set C = Nothing

End Sub[/cpp]

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
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 078
Membres
1 586 394
Dernier membre
Manoushk
Partager cette page
Haut