Recherche avec 2 conditions en colonne
Bonjour,
Je n'arrive pas à réaliser une recherche avec 2 conditions en colonne.
La colonne I (€/tonne) correspond à la valeur que je veux en fonction de ce que je renseigne en cellule F (ville exped) et G (ville dest) en fonction de l’onglet base.
De plus sur ma liste déroulante en colonne F et G j'ai parfois plusieurs fois la même ville par exemple ASSON car il y a plusieurs destination, est-ce que c'est possible que ça ne propose que une fois ASSON et en fonction de l'expedition que ça me propose que les destinations possibles de l'onglet base ?
J'espère que j'ai été assez claire.
En vous remerciant par avance.
Marion
Bonjour Mgaliay, Njhub, bonjour le forum,
Deux codes pour réaliser ta demande.
Dans un module standard Module1 par exemple, ce code :
Public OB As Worksheet 'déclare la variable OB (Onglet Base)
Public OS As Worksheet 'déclare la variable OS (Onglet Simulation)
Public TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Public PL As Range 'déclare la variable PL (PLage)
Sub Macro1()
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Long 'déclare la variable I (Incrément)
Dim L As String 'déclare la variable L (Liste)
Set OB = Worksheets("BASE") 'défnit l'onglet OB
Set OS = Worksheets("SIMULATION") 'définit l'onglet OS
TV = OB.Range("A1").CurrentRegion 'définit la tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
D(TV(I, 6)) = TV(I, 6) 'alimente e dictionnaire D
Next I 'prochaine ligne de la boucle
L = Join(D.keys, ",") 'définit la liste L
Set PL = OS.Range("F2:F236") 'définit la plage PL
With PL.Validation 'prend en compte la validation de données de la plage Pl
.Delete 'supprime un éventuelle ancienne validation de données
.Add xlValidateList, , , L 'ajoute la liste L à la validation de donnée
End With 'fin de la prise en compte de la validation de données
End SubDans le composant de l'onglet Feuil2 (SIMULATION) la macro événementielle Change ci-dessous :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Long 'déclare la variable I (Incrément)
Dim L As String 'déclare la variable L (Liste)
Module1.Macro1 'lance la macro [Macro1] du module [Module1]
If Application.Intersect(Target, PL) Is Nothing Then Exit Sub 'si le changement a lieu ailleurs que dans la plage PL, sort de la procédure
If Target.Value = "" Then Target.Offset(0, 1).Value = "": Exit Sub 'si la cellule est affacée, efface aussi la cellule en colonne G et sort de la procédure
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
If TV(I, 6) = Target.Value Then D(TV(I, 7)) = TV(I, 7) 'alimente le dictionnaire D
Next I 'prochaine ligne de la boucle
L = Join(D.keys, ",") 'définit la liste L
With Target.Offset(0, 1).Validation 'prend en compte la cellule modifiée décalée d'une colonne à droite (=> colonne G)
.Delete 'supprime un éventuelle ancienne validation de données
.Add xlValidateList, , , L 'ajoute la liste L à la validation de donnée
End With 'fin de la prise en compte de la validation de données
End Sub