Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VBA recherche multi critères

2 réponses
Avatar
LaurentC
Bonjour Í  tous

J'ai un tableau structuré nommé TblOpérations comme ceci

Date NomValeur Soldée
01/05/2022 Orange 2
03/05/2022 Vert P12
03/05/2022 Bleu 3
03/05/2022 Orange
04/05/2022 Bleu
05/05/2022 Vert 20
06/05/2022 Jaune 7
07/05/2022 jaune P9

Je pars d'une date (LaDate="05/05/2022") et d'une couleur, je cherche
la ligne qui souscrit aux 3 conditions suivantes :
- Date <= LaDate
- NomValeur = couleur
- Soldée = numéric

Par exemple pour le "05/05/2022" Bleu je veux récupérer 3.
Comment puis je faire ?

Peut être un truc Í  base de .find avec un test puis un .FindNext en
allant vers le haut ... et en s'arrétant quand les conditions sont lÍ .

Je vous remercie pour votre aide.
@+Laurent

2 réponses

Avatar
MichD
Le 01/05/22 Í  12:45, LaurentC a écrit :
Bonjour Í  tous
J'ai un tableau structuré nommé TblOpérations comme ceci
Date    NomValeur    Soldée
01/05/2022    Orange    2
03/05/2022    Vert    P12
03/05/2022    Bleu    3
03/05/2022    Orange
04/05/2022    Bleu
05/05/2022    Vert    20
06/05/2022    Jaune    7
07/05/2022    jaune    P9
Je pars d'une date (LaDate="05/05/2022") et d'une couleur, je cherche la
ligne qui souscrit aux 3 conditions suivantes :
- Date <= LaDate
- NomValeur = couleur
- Soldée = numéric
Par exemple pour le "05/05/2022" Bleu je veux récupérer 3.
Comment puis je faire ?
Peut être un truc Í  base de .find avec un test puis un .FindNext en
allant vers le haut ... et en s'arrétant quand les conditions sont lÍ .
Je vous remercie pour votre aide.
@+Laurent

suivant l'exemple du classeur publié, tu peux obtenir le résultat comme
ceci :
'------------------------------------
Sub test1()
Dim Sh As Worksheet, Trouve As Range
Dim Rg As Range, Adr As String, Résultat As String
'Feuil1 est le nom de l'onglet de la feuille o͹ sont tes données
Set Sh = Worksheets("Feuil1")
With Sh
'identification de la plage des dates
Set Rg = .Range("A2:A" & Range("A" & .Rows.Count).End(xlUp).Row)
End With
With Rg
'Recherche la date du critère de la cellule E1
Set Trouve = .Find(What:=Sh.Range("E1").Value, After:=Sh.Range("A"
& Rg.Rows.Count), LookIn:=xlFormulas)
If Not Trouve Is Nothing Then
'S il trouve,
Adr = Trouve.Address
'Boucle sur la plage des dates
Do
'vérifie si la cellule de droite contient le critère en F1
If Trouve.Offset(, 1) = Sh.Range("F1") Then
Résultat = Trouve.Offset(, 2) & Résultat & ", "
'Si oui, on sort le résultat
'la boucle s'arrête avec Exit do
'Si tu le désires tu peux scanner toute la colonne
'pour savoir si tu as plusieurs occurrences.
'Exit Do
Else
Set Trouve = .FindNext(Trouve)
End If
Loop Until Trouve.Address = Adr
End If
End With
If Résultat <> "" Then
Résultat = Left(Résultat, Len(Résultat) - 2)
MsgBox "Les données possibles sont : " & Résultat & " soldé(s)."
Else
MsgBox "Aucune donnée ne correspond aux critères."
End If
End Sub
'------------------------------------
MichD
Avatar
LaurentC
MichD a présenté l'énoncé suivant :
Le 01/05/22 Í  12:45, LaurentC a écrit :
Bonjour Í  tous
J'ai un tableau structuré nommé TblOpérations comme ceci
Date    NomValeur    Soldée
01/05/2022    Orange    2
03/05/2022    Vert    P12
03/05/2022    Bleu    3
03/05/2022    Orange
04/05/2022    Bleu
05/05/2022    Vert    20
06/05/2022    Jaune    7
07/05/2022    jaune    P9
Je pars d'une date (LaDate="05/05/2022") et d'une couleur, je cherche la
ligne qui souscrit aux 3 conditions suivantes :
- Date <= LaDate
- NomValeur = couleur
- Soldée = numéric
Par exemple pour le "05/05/2022" Bleu je veux récupérer 3.
Comment puis je faire ?
Peut être un truc Í  base de .find avec un test puis un .FindNext en allant
vers le haut ... et en s'arrétant quand les conditions sont lÍ .
Je vous remercie pour votre aide.
@+Laurent

suivant l'exemple du classeur publié, tu peux obtenir le résultat comme ceci
:
'------------------------------------
Sub test1()
Dim Sh As Worksheet, Trouve As Range
Dim Rg As Range, Adr As String, Résultat As String
'Feuil1 est le nom de l'onglet de la feuille o͹ sont tes données
Set Sh = Worksheets("Feuil1")
With Sh
'identification de la plage des dates
Set Rg = .Range("A2:A" & Range("A" & .Rows.Count).End(xlUp).Row)
End With
With Rg
'Recherche la date du critère de la cellule E1
Set Trouve = .Find(What:=Sh.Range("E1").Value, After:=Sh.Range("A" &
Rg.Rows.Count), LookIn:=xlFormulas)
If Not Trouve Is Nothing Then
'S il trouve,
Adr = Trouve.Address
'Boucle sur la plage des dates
Do
'vérifie si la cellule de droite contient le critère en F1
If Trouve.Offset(, 1) = Sh.Range("F1") Then
Résultat = Trouve.Offset(, 2) & Résultat & ", "
'Si oui, on sort le résultat
'la boucle s'arrête avec Exit do
'Si tu le désires tu peux scanner toute la colonne
'pour savoir si tu as plusieurs occurrences.
'Exit Do
Else
Set Trouve = .FindNext(Trouve)
End If
Loop Until Trouve.Address = Adr
End If
End With
If Résultat <> "" Then
Résultat = Left(Résultat, Len(Résultat) - 2)
MsgBox "Les données possibles sont : " & Résultat & " soldé(s)."
Else
MsgBox "Aucune donnée ne correspond aux critères."
End If
End Sub
'------------------------------------
MichD

Excellent, gros merci.
@+Laurent