Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Récupérer col. C avec condition sur col. B sur une sélection de lignes de la col. A

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 !

ServietteChaude

XLDnaute Nouveau
Bonjour à tous,

Après avoir utilisé plusieurs fois le forum en tant que visiteur (jamais eu besoin de créer un compte tellement il est complet 🙂 ) je me trouve dans l'obligation de solliciter voter aide directement.

J'essaie de m'expliquer sur ma question. Je souhaite, sur une sélection de lignes, récupérer une variable Spread (colonne C) telle que la variable Maturité (colonne B) soit la plus proche possible de 2 (ou 5 ou 10).
Dis comme ça c'est un peu flou, mais normalement c'est beaucoup plus explicite avec le fichier joint.

J'ai essayé des:
-recherchev avec conditions -> récupère la première occurence
-combinaison index/equiv -> aucun résultat
- moyenne.si -> ca rend n'importe quoi!!

Petite précision, il faudrait que ce soit en excel si possible (en VBA je pense pouvoir faire).

Merci d'avance à tous pour votre aide!

ServietteChaude
 

Pièces jointes

Re : Récupérer col. C avec condition sur col. B sur une sélection de lignes de la col

Bonsoir ServietteChaude (quel étrange pseudo !), bonsoir le forum,

Une solutiojn VBA car par formule je ne sais pas faire...

En pièce jointe ton fichier modifié avec deux options.
• L'option 1 agit au double-clic dans une des cellules de la plage C16:E18 et ne renvoie le résultat que dans la cellule double-cliquée. Le code :
Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim pl As Range 'déclare la variable pl (PLage)
Dim vac As String 'déclare la variable vac (Valeur À Chercher)
Dim r As Range 'déclare la variable r (Recherche)
Dim pa As String 'déclare la variable pa (Première Adresse)
Dim df As Double 'déclare la variable df (DiFférence Maturité)
Dim min As Double 'déclare la variable min (valeur MINimale)
Dim li As Byte 'déclare la variable li (LIgne de la valeur minimale)

'si le double-clic à lieu ailleurs que dans la plage C16:E18, sort de la procédure
If Application.Intersect(Target, Range("C16:E18")) Is Nothing Then Exit Sub
Cancel = True 'évite le mode édition lié au double-clic
Set pl = Range("B3:B11") 'définit la plage pl
vac = Cells(Target.Row, 2) & " " & CStr(Cells(15, Target.Column)) 'définit la valeur à chercher
Set r = pl.Find(vac, , xlValues, xlWhole) 'définit la recherche r
min = 100 'définit un valeur de départ pour la valeur minimale
If Not r Is Nothing Then 'condition : si il existe au moins une occurrence trouvée
    pa = r.Address 'définit la première adresse pa
    Do 'exécute
        df = Abs(CDbl(r.Offset(0, 1)) - CDbl(Cells(15, Target.Column))) 'définit la variable df (en valeur absolue)
        If df < min Then min = df: li = r.Row 'si df est inférieur à min alors min = df, définit la ligne li
        Set r = pl.FindNext(r) 'redéfinit r (prochaine occurrence)
    Loop While Not r Is Nothing And r.Address <> pa 'boucle tant qu'il existe de nouvelles occurrences ailleurs qu'en pa
Else 'sinon (si il n'y a pas d'occurrence)
    Exit Sub 'sort de la procédure
End If 'fon de la condition
Target.Value = Cells(li, 4).Value 'place dans la celluel double-cliquée le spread correspondant
End Sub

• L'option 2 réalise le calcul dans toutes les cellules de la plage C16:E18. Le code :
Code:
Sub Macro1()
Dim pl As Range 'déclare la variable pl (PLage)
Dim vac As String 'déclare la variable vac (Valeur À Chercher)
Dim r As Range 'déclare la variable r (Recherche)
Dim pa As String 'déclare la variable pa (Première Adresse)
Dim df As Double 'déclare la variable df (DiFférence Maturité)
Dim min As Double 'déclare la variable min (valeur MINimale)
Dim li As Byte 'déclare la variable li (LIgne de la valeur minimale)

Set pl = Range("B3:B11") 'définit la plage pl
For Each cel In Range("C16:E18")
    vac = Cells(cel.Row, 2) & " " & CStr(Cells(15, cel.Column)) 'définit la valeur à chercher
    Set r = pl.Find(vac, , xlValues, xlWhole) 'définit la recherche r
    min = 100 'définit un valeur de départ pour la valeur minimale
    If Not r Is Nothing Then 'condition : si il existe au moins une occurrence trouvée
        pa = r.Address 'définit la première adresse pa
        Do 'exécute
            df = Abs(CDbl(r.Offset(0, 1)) - CDbl(Cells(15, cel.Column))) 'définit la variable df (en valeur absolue)
            If df < min Then min = df: li = r.Row 'si df est inférieur à min alors min = df, définit la ligne li
            Set r = pl.FindNext(r) 'redéfinit r (prochaine occurrence)
        Loop While Not r Is Nothing And r.Address <> pa 'boucle tant qu'il existe de nouvelles occurrences ailleurs qu'en pa
    Else 'sinon (si il n'y a pas d'occurrence)
        GoTo suite 'va à l'étiquette "suite"
    End If 'fon de la condition
    cel.Value = Cells(li, 4).Value 'place dans la celluel double-cliquée le spread correspondant
suite: 'étiquette
Next cel
End Sub

le fichier :
 

Pièces jointes

Re : Récupérer col. C avec condition sur col. B sur une sélection de lignes de la col

Bonjour Robert,

Waaaaaw je suis impressionnée par la rapidité et l'efficacité. Franchement merci beaucoup d'avoir pris du temps là-dessus.
En plus ton code est parfaitement commenté, parfaitement indenté, etc... J'ai vraiment bien tout compris!

Je vais l'adapter à mon fichier initial qui contient bien plus de données que celui donné en exemple et je te redonne des nouvelles.

En tout cas merci encore, c'est super ce que tu as fait.

ServietteChaude (pseudo tlmvpsp trouvé un jour de manque d'inspiration alors que ma serviette sortait du sèche-linge, eh oui derrière certains pseudos il n'y a pas forcément que des belles histoires)
 
- 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
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…