RechercheV muliple sans doublons

Bonsoir à tous !

J'inaugure ce forum après avoir passé 1h30 à chercher des réponses un peu partout sur le net sans trouver satisfaction... j'avoue avoir connu des samedi soirs plus agréables

Voilà mon problème : j'ai une base de données représentant une liste de clients dans plusieurs agences ; chaque client appartient à un portefeuille (4 ou 5 portefeuilles selon l'agence) : il y a donc plusieurs lignes pour le même portefeuille, et plusieurs lignes pour la même agence.

Je cherche à faire une rechercheV multiple sous Excel, qui me renverrait la liste de tous les portefeuilles d'une agence donnée (paramètre à saisir). Il me faudrait donc une seul ligne par portefeuille....

Je ne maîtrise pas du tout VBA, et encore moins les calculs matriciels ; j'ai trouvé quelques macro toutes faites de rechercheV multiples, mais avec doublons, donc problème non résolu... Quant aux formules avec matrices (les {} si j'ai bien compris !), elles sont un peu trop barbares pour mon cerveau limité, j'ai laissé tomber après quelques dizaines d'essais infructueux...

Y aurait-il quelqu'un ici susceptible de me sauver la vie ???

Meci d'avance et bonne soirée !

Bonsoir Unlukie, bonsoir le forum,

Avec un petit fichier exemple reprenant la structure de tin original ça serait beaucoup plus clair...

Oups, bien sûr... !

Voilà un fichier en exemple.

172au-secours.xlsx (10.08 Ko)

Concernant le nombre de clients, je pense pouvoir m'en sortir avec des somme.si

Merci !

Re,

En pièce jointe ton fichier modifié. Il y a trois étapes :

• Une première macro à l'ouverture du classeur :

Private Sub Workbook_Open() 'à l'ouverture du classeur
Module1.ValiDon 'lance la procédure [ValiDon] du module [Module1]
End Sub

Va générer une liste de validation de données, contenant les agences, dans la cellule B1 de l'onglet CeQueJeVoudrais via la macro ValiDon ci-dessous où il te faudra adapter les noms des onglet 1 et 2 :

Public O1 As Worksheet 'déclare la variable O1 (Onglet1)
Public O2 As Worksheet 'déclare la variable O2 (Onglet2)
Public TC As Variant 'déclare la variable TC (Tableau de Cellules)
Public NL As Integer 'déclare la variable NL (Nombre de Lignes)
Public NC As Byte 'déclare la variable NC (Nombre de colonnes)

Public Sub ValiDon() 'Validation de données automatique en B1
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim LISTE As String 'déclare la variable LISTE

Set O1 = Sheets("BaseDeDonnees") 'définit l'onglet O1 (à adapter)
Set O2 = Sheets("CeQueJeVoudrais") 'définit l'onglet O2 (à adapter)
TC = O1.Range("A1").CurrentRegion 'définit le tableau de cellules TC
NL = UBound(TC, 1) 'définit le nombre de lignes NL du tableau de cellules TC
NC = UBound(TC, 2) 'définit le nombre de colonnes NC du tableau de cellules TC
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To NL 'boucle sur toutes les lignes I du tyableau de cellules TC (en partant de la seconde)
    D(TC(I, 1)) = "" 'alimente le dictionnaire D avec la valeur ligne I colonne 1 de TC
Next I 'prochaine ligne de la boucle
LISTE = Join(D.keys, ",") 'définit la variable LISTE
With O2.Range("B1").Validation 'prend en compte la validation de données de la cellule B1 de l'onglet O2
    .Delete 'supprime une éventuelle ancienne validation de données
    .Add xlValidateList, Formula1:=LISTE 'ajoute LISTE comme nouvelle validation de données
End With 'fin de la prise en compte de la validation de données de la cellule B1 de l'onglet O2
End Sub

Veille à garder les variables publiques en haut car elles sont utilisées dans d'autres modules...

• La procédure événementielle Change de l'onglet BaseDeDonnees permet de mettre à jour la liste de validation de données en B1 si une ligne est ajoutée/supprimée ou effacée.

Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
'si le changement a lieu dans la colonne 1, met à jour la validation de données en B1 de l'onglet O2
If Target.Column = 1 Then Module1.ValiDon 'lance la procédure [ValiDon] du module [Module1]
End Sub

• La procédure événementielle Change de l'onglet CeQueJeVoudrais fair le reste et met à jour le tableau en fonction de l'agence choisie en B1 avec le code ci-dessous :

Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim T1 As Variant 'déclare la variable T1 (Tableau1)
Dim T2 As Variant 'déclare la variable T2 (Tableau2)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
If Target.Address <> "$B$1" Then Exit Sub 'si le changement a lieu ailleurs qu'en B1, sort de la procédure
Range("B3").CurrentRegion.Offset(1, 0).ClearContents 'efface d'éventuelles anciennes données
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To NL 'boucle sur toutes les lignes I du tyableau de cellules TC (en partant de la seconde)
    'si la valeur ligne I colonne 1 de TC est égale à la valeur de B1,
    'alimente le dictionnaire D avec la valeur ligne I colonne 2 de TC
    If CStr(TC(I, 1)) = CStr(Target.Value) Then D(TC(I, 2)) = D(TC(I, 2)) + 1
Next I 'prochaine ligne de la boucle
T1 = D.keys 'récupère dans T1 la liste des éléments de TC sans doublons
T2 = D.items 'récupère dans T2 le nombre d'occurrence de chaque élément de T1
'renvoie dans B4 redimensionnée le tableau T1 transposé
O2.Range("B4").Resize(UBound(T1) + 1, 1).Value = Application.Transpose(T1)
'renvoie dans C4 redimensionnée le tableau T2 transposé
O2.Range("C4").Resize(UBound(T2) + 1, 1).Value = Application.Transpose(T2)
Application.ScreenUpdating = False 'affiche les rafraîchissements d'écran
End Sub

Pour que ça fonctionne dans ton fichier original il te faudra recopier toutes ces procédures et les placer dans le même endroit...

83unlukie-v01.xlsm (24.09 Ko)

Waouh...

Merci beaucoup pour ta réactivité, et merci surtout d'avoir pris le temps de commenter chaque ligne de tes macros : je comprends (à peu près) tout !!!

C'est top !!!

J'ai encore quelques adaptations à faire (notamment sur la liste déroulante --> dans mon idée, je comptais faire un menu à part où les personnes consultant le fichier pourraient choisir une agence via des formulaires un peu sympa. Du coup, le numéro de l'agence en B1 serait rapatrié d'un onglet différent), mais je pense pouvoir m'en sortir. En tous cas, ça correspond absolument à ce que je voulais.

De fait, je pense que contrairement à mon samedi soir, mon dimanche n'est pas complètement fichu...

MERCI !!!

Bonjour,

Avec fonction perso (donc réutilisable par un utilisateur ne connaissant pas VBA)

-Sélectionner  H4:I12
=SansDoublonsCritère(B2:B18;A2:A18;H1)
-Valider avec maj+ctrl+entrée

Ceuzin

Ca l'air de marcher pas top mal également... Merci beaucoup !!!

Bonjour,

pourquoi réinventer la roue

153au-secours.xlsx (15.28 Ko)

Re,

Oui pourquoi réinventer la roue Patrick ? Ou pourquoi utiliser un TCD (si peu pratique et esthétique) ?... Les coups et les douleurs hein ! Ça ne se discute pas...

ThauThème a écrit :

Re,

Oui pourquoi réinventer la roue Patrick ?

Juste pour que l'utilisateur sans expérience puisse ajouter des données et avoir un résultat visible immédiatement ; ce qui n'empêche pas la grand qualité de ton code très bien commenté, ce qui est très rare ici (sans flatterie de ma part)

P.

Bonjour le fil, bonjour le forum,

Arf ! je me targue d'être un tant soit peu expérimenté mais je ne sais toujours pas utiliser un TCD... Mais c'est surtout que j'aime pas ça en fait... Sinon tu as évidemment raison, les formules et les TCD sont bien plus efficaces...

bonjour

pour le fun ; tout est automatisé ;reinitialisation du choix incluse

cordialement

75copie-de-2.xlsm (17.27 Ko)

salut tau theme

laisse tomber ;les tdc c'est pour les gosses

Re,

Arf Tulipe !... Les TdC et les TCD sont deux choses bien différentes pour moi...

Sinon, bug à l'ouverture de ton fichier mais comme je n'avais pas trop de temps j'ai pas cherché d'où ça pouvait venir...

>ça a l'air de marcher pas trop mal également... Merci beaucoup !!!

1-A ma connaissance, ça marche parfaitement!

2-Une fonction personnalisée s'utilise comme une fonction standard d'Excel, donc par des personnes qui ne connaissent pas le VBA

Ceuzin

re

l'essentiel est que nous parlions de la meme chose ; tu sais quoi ; le truc avec des cel bleues chiottes ripolin année 1952 et des petites fleches dans les coins ;lesquelles si on clique dessus ;on se retrouve avec une tartine a decocher ...............

bon j'arrete je vois l'orage poindre .......

bien cordialement et bravo pour tes contributions

Merci à tous pour vos retours et réponses...

J'ai pu faire un combiné de tout ça et présenter à mon chef un résultat final qui lui a plu, donc... MERCI !

Bonjour,

quelle que soit la solution adoptée, c'est sympa de venir dire un petit merci

Rechercher des sujets similaires à "recherchev muliple doublons"