• Initiateur de la discussion Initiateur de la discussion Adriano43
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Adriano43

XLDnaute Occasionnel
Bonjour à toutes et à tous,

Me voilà confronté à un nouveau problème devant lequel j'ai le raisonnement sur papier mais n'arrive pas à le transcrire efficacement en VBA.
Concrétement, je souhaite que la macro recherche la valeur minimale de la colonne J pour les cellules "nombres non nulles" et me restitue par la suite la série des 5 plus petites valeurs rangées par ordre croissant en m'indiquant la valeur correspondante contenue en colonne K.

Ex: série en valeur 20;30;40;50;60 correspondant en colonne K à A,B,C,D,E
résultat à afficher par la macro : A - B - C - D - E
Ci-joint un fichier exemple

Cordialement

Adriano
 

Pièces jointes

Re : Identifier série

Bonjour Efgé,

Merci de vous être attardé sur mon problème. Vous avez bien compris mon explication. Cependant je souhaiterais apporter 1 modifications:
- serait il possible d'incrémenter "les valeurs d'un lot" dès lors que l'un d'entre elles est incluse dans la série?
ex: Dans votre fichier, on constate que la série est C - D - C - D- A. Alors qu'en réalité, cela devrait être C-D-A-C-D
Cela revient à réinitialiser un lot en totalité dès que l'une des valeurs est dans la série.
 
Re : Identifier série

Re,

C'est complexe je sais!!!....
Je voudrais que :

Dès qu'une valeur est dans la série (cette valeur appartient à une famille A ou B ou C ou D...); je voudrais que toutes les valeurs de cette famille soit incrémentée de la valeur qui a été incluse dans la série.

Deuxième interrogation car j'envisage cette piste, serait-il possible d'appliquer la macro uniquement aux lignes surlignées en gris?
 
Re : Identifier série

Ok merci, je vais regarder.
Mais par contre pourriez vous m'expliquer un phénomène étrange:
Sur le véritable, les infos se trouvent en colonne 17 et 18, je modifie votre macro mais celle ci ne s'éxécute pas, la ligne suivante est surlignée en jaune:
Code:
If .Cells(i, 17).Value > 0 And .Cells(i, 18).Value <> "" Then
 
Re : Identifier série

Re
Il faut adapter la ligne précédente:
VB:
With Sheets("Feuil1")
Si ta feuille ne s'appelle pas Feuil1, VBA n'aime pas.
Cordialement

EDIT*
Ou tu as oublié d'ajouter le retour à la ligne " _" ( espace + _).
 
Re : Identifier série

L'erreur a changé, il me dit "Next sans for" alors que je n'ai pas touché le reste du code.
Code:
Public Sub prctest()

    Dim i&, D As Object, T As Variant, Msg$
    Set D = CreateObject("Scripting.Dictionary")
    
    With Sheets("BDD")
    For i = 2 To .Cells(Rows.Count, 17).End(xlUp).Row
        If .Cells(i, 17).Value > 0 And .Cells(i, 18).Value <> "" Then
            D(.Cells(i, 17).Value) = .Cells(i, 18).Value
    Next i
    End With
    T = D.Keys
    Call prctri(T, LBound(T), UBound(T))
    ReDim Preserve T(1 To 6)
    For i = 1 To 6
    'T(i) = Valeur en colonne Q
    'D(T(i)) = Lettre en colonne R
    Msg = Msg & T(i) & vbTab & vbTab & D(T(i)) & vbLf
    Next i
    MsgBox Msg, 64, "Compte rendu"

End Sub
 
Re : Identifier série

Re
J'avais éditer mon post, nous nous sommes croisé.
Tu as oublié d'ajouter le retour à la ligne " _" ( espace + _).
VB:
 If .Cells(i, 17).Value > 0 And .Cells(i, 18).Value  "" Then _
            D(.Cells(i, 17).Value) = .Cells(i, 18).Value
Cela permet de ne pas utiliser de End IF
Comme tu ne le mets pas, VBA attend le End IF et te dis qu'il y a une erreur de boucle.
Cordialement
 
Re : Identifier série

Re,

L'erreur ne vient pas de là, puisque j'ai entre temps tout mis sur la même ligne mais il bugue toujours...
Au niveau du next i ... Vraiment désolé

Code:
Public Sub prctournee()

    Dim i&, D As Object, T As Variant, Msg$
    Set D = CreateObject("Scripting.Dictionary")
    'T(i) = Valeur en colonne Q
    'D(T(i)) = Lettre en colonne R
    
    With Sheets("BDD")
    For i = 2 To .Cells(Rows.Count, 17).End(xlUp).Row
        If .Cells(i, 17).Value > 0 And .Cells(i, 18).Value <> "" Then D(.Cells(i, 17).Value) = .Cells(i, 18).Value
    Next i
    End With
    T = D.Keys
    Call prctri(T, LBound(T), UBound(T))
    ReDim Preserve T(1 To 6)
    For i = 1 To 6
    Msg = Msg & T(i) & vbTab & vbTab & D(T(i)) & vbLf
    Next i
    MsgBox Msg, 64, "Organisation"

End Sub
 
Re : Identifier série

Re
J'ai mis ton code tel quel dans ton exemple.
J'ai modifié le quicksort en conséquence de son nouveau nom (tu aurais pu garder son nom en respect pour l"auteur..)
Tout fonctionne.
Vérifi tes données et colonnes.
Je ne peux pas t'en dire plus.
Cordialement
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
15
Affichages
772
Réponses
5
Affichages
725
Réponses
1
Affichages
793
Retour