Recherche valeur dans un tableau en VBA
Bonjour,
Je dois réaliser un tableau excel regroupant pas mal de données provenant de tableaux sur différentes pages excel.
J'arrive à parcourir les pages et j'arrive à afficher les noms de chacune par exemple.
Ce avec quoi j'ai du mal c'est de retrouver une valeur dans un tableau sur une page, sur base de l'entête de la ligne et de la colonne.
Je m'explique, par exemple : si j'ai un tableau avec en en-tête des lignes des noms, et puis ensuite chaque titre de colonne est une année. L'intérieur du tableau est lui rempli de valeurs :
| 2010 | 2011 | |
| Max | 5 | 6 |
| Jean | 7 | 8 |
J'aimerais pouvoir retrouver la valeur pour une certaine personne (Max) en une certaine année (2010) par exemple.
ATTENTION : il nombre de lignes et de colonnes n'est pas le même pour chaque page excel et j'aimerais pouvoir rechercher sur toutes les pages, donc il faut absolument comparer la valeur des deux entêtes afin de trouver la bonne valeur... pas possible de travailler avec un numéro de colonne ou ligne.
Merci d'avance!
Ca ne doit pas être bien compliqué mais je viens d'apprendre le VBA aujourd'hui et je ne trouve pas de solution sur internet.
Bonsoir,
une proposition de fonction de recherche sur tous les onglets, fonction recherche et une macro test pour la tester.
Sub test()
MsgBox recherche("Jean", "2011")
End Sub
Function recherche(nom, année)
For Each ws In Worksheets
Set c = ws.UsedRange.Columns(1).Find(nom, lookat:=xlWhole)
If Not c Is Nothing Then
r = c.Row
Set c = ws.UsedRange.Rows(1).Find(année, lookat:=xlWhole)
If Not c Is Nothing Then
recherche = ws.Cells(r, c.Column): Exit Function
End If
End If
Next
recherche = "non trouvé"
End FunctionMerci pour ce bout de code que je vais tester des ce soir, juste un petit detail, les dates sont au format DD/MM/YYYY mais il y a uniquement l'annee qui interesse ma recherche, est ce que cela marchera si j'utilise votre code en inserant par exemple **/**/2010 ?
Car quel que soit le jour ou le mois tant que l'annee est 2010 je dois prendre la valeur...
Juste pour etre sur si ma colonne avec les noms se trouve en colonne B et mes dates en ligne 12 je dois modifier votre fonction en :
Function recherche(nom, année)
For Each ws In Worksheets
Set c = ws.UsedRange.Columns(2).Find(nom, lookat:=xlWhole)
If Not c Is Nothing Then
r = c.Row
Set c = ws.UsedRange.Rows(12).Find(année, lookat:=xlWhole)
If Not c Is Nothing Then
recherche = ws.Cells(r, c.Column): Exit Function
End If
End If
Next
recherche = "non trouvé"
End FunctionEncore merci!
bonjour,
code adapté
Function recherche(nom, année)
For Each ws In Worksheets
Set c = ws.Columns("B").Find(nom, lookat:=xlWhole)
If Not c Is Nothing Then
r = c.Row
dlc = Cells(12, Columns.Count).End(xlToLeft).Column
For Each c In ws.Range(Cells(12, 3), Cells(12, dlc))
If Year(c) = année Then
recherche = ws.Cells(r, c.Column): Exit Function
End If
Next
End If
Next
recherche = "non trouvé"
End FunctionUn tout grande merci pour cette aide rapide, cependant ça ne marche toujours pas, car la base de donnée que j'utilise est un peu mal foutue, malheureusement je n'ai pas le choix...
Je pense que plusieurs choses peuvent provoquer cela, mais même en chipotant pour essayer des cas assez simples je n'arrive à rien :
1/ Les entêtes sont constitués de cellules fusionnées, mais normalement ça ne devrait pas poser de soucis car quand je demande d'afficher une case de l'entête il trouve la valeur.
2/ Les noms des entêtes ont parfois des espaces devant (mais même en mettant les espace dans la chaine de caractères ça ne marche pas)
3/ Je ne pense pas que le format des date soit reconnu comme tel sur excel, je pense que c'est juste en mode texte et donc que la fonction year ne marchera pas...
4/ Les dates ne sont pas toujours à la même ligne mais dans 99% des cas oui donc au pire je peux manuellement les mettre partout
Voici mon code, pour l'instant (en faisant des tests d'affichage je remarque qu'il ne rentre même pas dans la première condition, donc ce n'est pas à cause du format de la date :
Sub afficervaleurs()
Dim Ligne As Integer
Ligne = 1
Dim Ws As Worksheet
For Each Ws In ThisWorkbook.Worksheets
'Renvoie le nom de chaque feuille
Sheets("Feuil1").Range("A" & Ligne).value = Ws.Name
Sheets("Feuil1").Range("B" & Ligne).value = recherche(" Stocks", "31/12/2013", Ws)
Ligne = Ligne + 1
Next Ws
End Sub
Function recherche(nom, année, Ws)
Set c = Ws.UsedRange.Columns("A").Find(nom, lookat:=xlWhole)
If Not c Is Nothing Then
r = c.Row
recherche = "trouvé": Exit Function %%% Ceci étant pour tester s'il rentre dans la premiere condition
dlc = Cells(12, Columns.Count).End(xlToLeft).Column
For Each c In ws.Range(Cells(12, 3), Cells(12, dlc))
If Year(c) = année Then
recherche = ws.Cells(r, c.Column): Exit Function
End If
End If
recherche = "non trouvé"
End FunctionIl m'affiche que des "non trouvé" malheureusement.
Si nécessaire je peux envoyer les fichiers en MP afin de pouvoir directement travailler dessus et trouver la bonne réponse
Merci pour vos réactions rapide ça aide!
envoie-moi les fichiers en MP