Microsoft 365 Chercher des données en fonction de deux critères

wizstreg

XLDnaute Nouveau
Bonjour à tous,

Je suis en train de faire un travail pour un client qui nécessite excel et mon niveau, bien que correct, va m'amener à vous poser quelques questions techniques. :)

La première que j'ai est:
Sur une feuille, j'ai des tas de données et notamment un numéro de contrat et un numéro de siren.
Sur une autre feuille, j'ai également des données avec un numéro de contrat, un numéro de siren et une donnée complémentaire ne se trouvant pas dans la première feuille.
Je souhaite que sur la première feuille soit inséré automatiquement la donnée complémentaire si on trouve sur une même ligne un contrat et un numéro de siren apparaissant sur la première feuille.

Pas certain d'avoir été clair :)
Je vous charge une feuille de calcul simplifiée pour que vous puissiez m'aider si c'est possible.
Merci d'avance pour votre soutien.
 

Pièces jointes

  • feuille test.xlsx
    167 KB · Affichages: 9

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour le fil, bonjour le forum,

PierreJean est toujours aussi rapide décidément !... Comme j'ai commenté tout le code (c'est aussi du VBA), j'envoie quand même...

VB:
Sub Macro1()
Dim P As Worksheet 'déclare la variable P (onglet Principale)
Dim C As Worksheet 'déclare la variable P (onglet Contentieux)
Dim VP As Variant 'déclare la variable VP (Valeurs Principale)
Dim VC As Variant 'déclare la variable VC (Valeurs Contentieux)
Dim IP As Integer 'déclare la variable IP (Incrément Pricipale)
Dim IC As Integer 'déclare la variable IC (Incrément Contentieux)

Set P = Worksheets("Principale") 'définit l'onglet P
Set C = Worksheets("Contentieux") 'définit l'onglet C
VP = P.Range("A1").CurrentRegion 'définit le tableau VP des valeurs de l'onglet "Principale"
VC = C.Range("A1").CurrentRegion 'définit le tableau VC des valeurs de l'onglet "Contentieux"
For IP = 2 To UBound(VP, 1) 'boucle 1 : sur toutes les lignes IP du tableau VP (en partant de la seconde)
    For IC = 2 To UBound(VC, 1) 'boucle 2 : sur toutes les lignes IC du tableau VC (en partant de la seconde)
        'condition : si les données correspondent
        If CStr(VP(IP, 1)) = CStr(VC(IC, 1)) And CStr(VP(IP, 2)) = CStr(VC(IC, 2)) Then
            P.Cells(IP, "C").Value = VC(IC, 3) 'renvoie dans la cellule ligne IP colonne C de'l'onglet P, la donnée en ligne IC colonne 3 du tableau VC
            Exit For 'sort de la boucle 2
        End If 'fin de la condition
    Next IC 'prochaine ligne de la boucle 2
Next IP 'prochaine ligne de la boucle 1
End Sub
 

wizstreg

XLDnaute Nouveau
Tout d'abord, merci pour votre réponse si rapide.
Non, je ne suis pas un pro de VBA (c'est le moins qu'on puisse dire) mais on ne m'a jamais appris Excel non plus et je me débrouille. J'espère qu'il en sera de même avec VBA. Ceci-dit, même si je ne comprends pas la construction, je saurai j'espère dupliquer à mes cas concrets. Je vous dis ça rapidement :)
 

Victor21

XLDnaute Barbatruc
Bonjour wiztreg, pierrejean, Robert.
Une proposition en formule ?
VB:
=SI(SOMMEPROD((Contentieux!$A$2:$A$4*1=Principale!A2)*(Contentieux!$B$2:$B$4=Principale!B2));SOMMEPROD((Contentieux!$A$2:$A$4*1=Principale!A2)*(Contentieux!$B$2:$B$4=Principale!B2)*Contentieux!$C$2:$C$4);"")
A condition qu'il n'y ait pas plusieurs lignes identiques (couple Num ct et SIREN DEB) dans Contentieux.
A contrôler :)
 

wizstreg

XLDnaute Nouveau
Vous êtes trop forts, tous :)
Alors, pour Pierrejean, j'ai présumé de mes forces. Je me suis dit que tu avais fait une macro mais non, ça n'a rien à voir...
J'ai commençé à investiguer le net pour comprendre ce qu'était une fonction personnalisée et voir si je pouvais la modifier par mimétisme (j'en étais à comment ouvrir Visual Basic Editor ) et puis j'ai vu que Victor avait rentré une formule.

Que je ne comprends pas mais je me suis dit que j'allais dupliquer :)
Mais vu qu'il y a des sommes, je me dis qu'elle repose sur des maths. Car dans mon exemple, j'ai mis bêtement des chiffres. Or, les données siren et polices sont en format lettre dans mon fichier originel; Je pourrai les transformer en nombre pour dupliquer la formule. Mais j'ai l'impression que le résultat fait également référence à des calculs. Or les données à rapatrier dans le fichier originel sont des nombres, des mots ou des dates. Si je ne me trompe pas, la formule ne fonctionnera alors pas.

Du coup, je me penche sur la propo de Robert pour voir si je la comprends mieux au premier abord que celle de Pierrejean.

Si je sèche, je reviens vous demander quelques conseils sur comment utiliser ce que vous m'avez offert.
 

zebanx

XLDnaute Accro
Bonjour à tous,

Plus on est de fou...

En formule matriciel (ctrl + maj + entrée)

#SIERREUR(INDEX(Contentieux!$C$2:$C$100;EQUIV(1;(Contentieux!$A$2:$A$100*1=Principale!A2)*(Contentieux!$B$2:$B$100=B2);0));0)

@+
 

Pièces jointes

  • equiv_2 criteres.xlsm
    155.2 KB · Affichages: 9

zebanx

XLDnaute Accro
Re-

@Pierre-Jean;)
Merci déjà !
On est gaté en ce moment côté UDF. :cool:
Je vais bien sûr conserver la proposition du #2 avec 2 petites modifications proposées :
- on choisit son range pour le tableau
- on choisit la colonne de restitution (un numéro)

Mais tout cela évite de se trimballer la formule du #7 et pourra être adapté si, par exemple, un troisième critère rentre en considération.

@+

VB:
Function equiv2c(rng, a, b, c)
'- rng pour désigner le tableau, a comme critère 1, b comme critère 2, c comme colonne à choisir (num)
tablo = rng
For N = LBound(tablo, 1) To UBound(tablo, 1)
  If CStr(tablo(N, 1)) = CStr(a) And CStr(tablo(N, 2)) = CStr(b) Then equiv2c = tablo(N, c)
Next
End Function
 

Pièces jointes

  • equiv_2 criteres.xlsm
    159.1 KB · Affichages: 9

wizstreg

XLDnaute Nouveau
Vous allez trop vite pour moi :). Je viens juste de trouver comment on actionne le développeur VBA sur Office 365 et je vous désormais le langage. Mais comme c'est l'heure de l'apéro et que mon esprit va s'embrumer, je vais me repencher sur vos solutions demain matin.
Dire que je pensais me débrouiller sous excel avec mes formules de recherche de trois pages...
 

Victor21

XLDnaute Barbatruc
Re,
[...] et puis j'ai vu que Victor avait rentré une formule.
Que je ne comprends pas mais je me suis dit que j'allais dupliquer :)
Mais vu qu'il y a des sommes, je me dis qu'elle repose sur des maths. Car dans mon exemple, j'ai mis bêtement des chiffres. Or, les données siren et polices sont en format lettre dans mon fichier originel
Quel dommage de joindre un exemple qui ne reflète pas la réalité :(
Que Siren et Police soient des chiffres ou du texte, peu importe puisqu'on n'effectue qu'une comparaison, qui renvoie vrai ou faux (1 ou 0).

Par contre la donnée complémentaire doit dans cette formule être un nombre : VRAI*VRAI*5=5, alors que VRAI*VRAI*B=#Valeur.
Mais zebanx vous a communiqué une formule qui devrait vous convenir à condition de la valider en matriciel (Ctrl+Maj+Entrée).
 

wizstreg

XLDnaute Nouveau
En effet, désolé, je serai plus précis la prochaine fois.
Je m'y suis rattaqué de bon matin et je confirme que:
#SIERREUR(INDEX(Contentieux!$C$2:$C$100;EQUIV(1;(Contentieux!$A$2:$A$100*1=Principale!A2)*(Contentieux!$B$2:$B$100=B2);0));0)
marche parfaitement :).
Ceci dit, il va vraiment falloir que je m'investisse sur la compréhension car je ne comprends pas comment ça marche et je m'aperçois que je ne maîtrise absolument rien à VBA.
Je continue mon étude et je pense que vous me verrez souvent ici.
 

Discussions similaires