Affichage des données correspondante dans plusieurs colonnes
Bonjour a tous!
Voila je suis débutant en Excel et je n'y connais rien en VBA et j'aimerai résoudre un problème que je trouve assez compliqué et qui me donne du fils a retordre. Alors voila j'ai 2 colonnes avec différents noms qui peuvent être identiques, puis dans une autre colonne j'ai tous les noms que je peux avoir et j'aimerai afficher les noms et les numéros de fichier en relation avec chaque noms. Pour plus de précision je vous joins un fichier explicatif.
Merci a vous !
PS: Bien évidement mon travail n'est pas sur des prénoms d'hommes je préfère le préciser.
Bonjour et bienvenue,
Je ne sais pas comment interpréter le smiley ajouté 4 minutes après le message initial ... J'ai donc considéré que la demande était toujours d'actualité.
Si le même résultat (en admettant que j'aie compris la question) peut être obtenu par formule, tu n'es pas intéressé?
Que fait-on (par formule ou VBA), avec les prénoms en double en colonne A?
Merci de ta réponse !
Le deuxième commentaire est une erreur de ma part autant pour moi.
Les doublons en colonne A doivent être gardés. Par exemple Pierre est en relation avec Christophe et Nicolas et j'aimerai que dans la 2ième colonne à côté de Pierre il y ai écrit les 2 prénoms et leurs fichiers dans une 3iéme colonne.
Re-bonjour,
La précision est d'importancePar exemple Pierre est en relation avec Christophe et Nicolas et j'aimerai que dans la 2ième colonne à côté de Pierre il y ai écrit les 2 prénoms et leurs fichiers dans une 3iéme colonne.
Par formule, ça va effectivement devenir compliqué ... Il reste à préciser sous quelle forme doivent apparaître les prénoms et noms de fichiers, s'il y en a plusieurs: ils doivent être séparés par quoi (virgule, saut de ligne ... ou tout autre caractère)?
D'autre part, il convient de préciser quand la macro devra s'exécuter (au clic sur un bouton, lors de l'ajout ou de la modification d'un prénom en colonne F, etc.). En colonne A, combien de doublons au maximum, pour un prénom? Une indication concernant la taille des deux listes (colonnes A à C et colonne F) serait également utile.
Je ne le savais pas désolé
Dans un monde idéal j'aimerai que chaque nom s'inscrivent dans des cellules en colonne G mais je sais que c'est impossible donc j'opterais pour un saut de ligne.
En fait pour plus de précision la colonne F restera inchangé et les colonnes A, B et C s'agrandiront donc dés que l'ont rajoutent un fichier avec les prénoms et numéros la colonne G et H se mettent à jour.
Il y peut y avoir une 1àéne de doublons (je ne pense pas plus).
En espérant que ces nouvelles informations puisse vous aider.
Il y peut y avoir une 1àéne de doublons (je ne pense pas plus).
Je suppose qu'il fallait lire "une dizaine"
À la lecture de tes explications, j'ai opté pour une fonction personnalisée: j'ai créé une fonction nommée listeNoms(tablo, leNom) où tablo est la plage pouvant contenir les noms en colonne A et leNom est un de ceux qui figurent en colonne F. Il faut donc activer les macros à l'ouverture du classeur.
En G2, tu trouveras donc =listeNoms($A$2:$A$20;F2), laquelle ne renvoie rien, puisque baptiste est absent de la colonne A. On recopie ensuite la formule vers le bas, comme une formule standard.
La plage $A$2:$A$20 peut être adaptée, mais ne travaille pas avec une plage de 50.000 lignes, hein !! Il faudra tester sur des plages de 50 lignes, puis 100 ... et peut-être plus, mais en y allant progressivement (et tu n'as pas précisé la taille maximale de ce tableau !?)
Attention: pour que la fonction puisse retourner des résultats cohérents, il faut faire attention aux caractères d'espacement qui "traînent" derrière certains prénoms en colonne A ou F (j'en ai supprimé quelques uns dans le fichier joint)
Si ça correspond à tes attentes, il restera à écrire l'autre fonction (le mieux serait que tu l'écrives toi-même, en t'inspirant de ce qui est déjà fait). Pour voir le code, appuyer sur Alt+F11 et examiner le contenu du Module1
Oui effectivement mes doigts on paniqué
Merci ca m'aide beaucoup avec la fonction que tu viens de créer. Il y a un hashtag qui est entre les prénoms peut il y avoir un saut de ligne ?
Sinon en soit Zoé et fred ne peuvent pas exister ils sont pas dans la colonneF mais on s'en fout dans notre exemple.
je fais pour les numéros de fiche et reviens pour te dire ce qu'il en est.
Merci à toi !
Comme je n'avais pas (et n'ai toujours pas) compris:
... j'ai séparé donc les noms avec un '#' (en attendant de voir ce que tu en dirais) si tu veux un saut de ligne manuel (dans la même cellule!), tu peux remplacer le code par:j'aimerai que chaque nom s'inscrivent dans des cellules en colonne G mais je sais que c'est impossible donc j'opterais pour un saut de ligne
Function listeNoms(tablo As Range, leNom As Range)
listeNoms = ""
Application.Volatile
For Each c In tablo
If c <> "" Then
If c = leNom Then ch = ch & c.Offset(0, 1) & Chr(10)
End If
Next c
If ch <> "" Then listeNoms = Mid(ch, 1, Len(ch) - 1)
End FunctionMais, pour autant que je sache, la hauteur des lignes ne s'adapte pas automatiquement. Certains affichages sont donc tronqués!
Je suis désolé si c'est pas claire.
Pour être plus explicite j'ai fait ce que je voulais à la main en feuille 2.
C'est ce qu'on appelle un doux euphémismeJe suis désolé si c'est pas claire.
Ce que tu as illustré, ça doit se retrouver où? En colonne F? Mais alors la liste de la colonne F sera séparée par des cellules vides ... et quand tu ajouteras ou modifieras les données des colonnes A à C, il faut tout "redessiner" à chaque fois !?
On ne sait toujours pas quel sera le volume des données en colonne A (20 lignes, 400, 5.000, 100.000, ...)?
À quelle fréquence est-ce que tu vas modifier/ajouter des données dans les 3 premières colonnes? Toutes les 10 minutes ou une fois par semaine?
Bonsoir U. Milité, baptiste13
Est-ce le résultat souhaité
Option Explicit
Sub test()
Dim i As Long, n As Long, r As Range, w(), x(), dico As Object
Set dico = CreateObject("Scripting.Dictionary")
dico.CompareMode = 1
With Sheets("Feuil1")
For Each r In .Range("f2", .Range("f" & .Rows.Count).End(xlUp))
ReDim w(1 To 2): ReDim x(1 To 3, 1 To 1)
w(1) = False
x(1, 1) = r.Value
w(2) = x
dico(r.Value) = w
Next
With .Range("a1").CurrentRegion
For i = 2 To .Rows.Count
If dico.exists(.Cells(i, 1).Value) Then
w = dico(.Cells(i, 1).Value)
x = w(2)
If w(1) = False Then
w(1) = True
Else
ReDim Preserve x(1 To 3, 1 To UBound(x, 2) + 1)
End If
x(2, UBound(x, 2)) = .Cells(i, 2).Value
x(3, UBound(x, 2)) = .Cells(i, 3).Value
w(2) = x
dico(.Cells(i, 1).Value) = w
End If
Next
End With
End With
'restitution en feuil3
Application.ScreenUpdating = False
With Sheets("feuil3").Range("a1")
.CurrentRegion.Clear
For i = 0 To dico.Count - 1
With .Offset(n).Resize(UBound(dico.Items()(i)(2), 2), _
UBound(dico.Items()(i)(2), 1))
.Value = Application.Transpose(dico.Items()(i)(2))
.BorderAround Weight:=xlThin
End With
n = n + UBound(dico.Items()(i)(2), 2)
Next
With .CurrentRegion
.VerticalAlignment = xlCenter
.Font.Name = "calibri"
.Font.Size = 10
.Borders(xlInsideVertical).Weight = xlThin
End With
End With
Set dico = Nothing
Application.ScreenUpdating = True
End SubCi-dessous, j'ai rajouté la ligne d'en-têtes :
Option Explicit
Sub test()
Dim i As Long, n As Long, r As Range, w(), x(), dico As Object
Set dico = CreateObject("Scripting.Dictionary")
dico.CompareMode = 1
dico("homme") = Array(Empty, False, _
Application.Transpose(Array("homme", "homme bis", "fiche correspondant")))
With Sheets("Feuil1")
For Each r In .Range("f2", .Range("f" & .Rows.Count).End(xlUp))
ReDim w(1 To 2): ReDim x(1 To 3, 1 To 1)
w(1) = False
x(1, 1) = r.Value
w(2) = x
dico(r.Value) = w
Next
With .Range("a1").CurrentRegion
For i = 2 To .Rows.Count
If dico.exists(.Cells(i, 1).Value) Then
w = dico(.Cells(i, 1).Value)
x = w(2)
If w(1) = False Then
w(1) = True
Else
ReDim Preserve x(1 To 3, 1 To UBound(x, 2) + 1)
End If
x(2, UBound(x, 2)) = .Cells(i, 2).Value
x(3, UBound(x, 2)) = .Cells(i, 3).Value
w(2) = x
dico(.Cells(i, 1).Value) = w
End If
Next
End With
End With
'restitution en feuil3
Application.ScreenUpdating = False
With Sheets("feuil3").Range("a1")
.CurrentRegion.Clear
For i = 0 To dico.Count - 1
With .Offset(n).Resize(UBound(dico.Items()(i)(2), 2), _
UBound(dico.Items()(i)(2), 1))
.Value = Application.Transpose(dico.Items()(i)(2))
.BorderAround Weight:=xlThin
End With
n = n + UBound(dico.Items()(i)(2), 2)
Next
With .CurrentRegion
.VerticalAlignment = xlCenter
.Font.Name = "calibri"
.Font.Size = 10
.Borders(xlInsideVertical).Weight = xlThin
End With
End With
Set dico = Nothing
Application.ScreenUpdating = True
End Subklin89
U.Milité,
Pour ce que j'ai illustré c'est dans l'idéal comme précisé plus tôt. Sinon la partie à droite d'un nom de la colonne F peut être dans une seul cellule sous forme de liste avec des sauts de ligne.
La taille des colonnes et la fréquence de modification varie et je ne peux pas te dire exactement le nombre je peux juste te dire que ca ne dépassera pas les 2000 et ca ne descendra pas en dessous de 625. Pour la fréquence ca peut être modifié toutes les semaines et parfois toutes les 2 semaines.
Bonjour Klin89 et merci de ta réponse !
Alors c'est quasiment ce que je cherche sauf qu'il manque certains prénoms dans homme bis. Par exemple Pierre est en lien avec Christophe mais aussi avec Nicolas, et donc la fiche 35 et 67.
U.Milité un grand merci le problème est résolue grâce à ton programme.
voici donc les deux programme pour les prénoms et les fichiers selon ton expertise.
Function listeNoms(tablo As Range, leNom As Range)
listeNoms = ""
Application.Volatile
For Each c In tablo
If c <> "" Then
If c = leNom Then ch = ch & c.Offset(0, 1) & Chr(10)
End If
Next c
If ch <> "" Then listeNoms = Mid(ch, 1, Len(ch) - 1)
End Function
Function listeFiche(tablo As Range, leNom As Range)
listeFiche = ""
Application.Volatile
For Each c In tablo
If c <> "" Then
If c = leNom Then ch = ch & c.Offset(0, 2) & Chr(10)
End If
Next c
If ch <> "" Then listeFiche = Mid(ch, 1, Len(ch) - 1)
End FunctionEncore Merci !