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 :

20102011
Max56
Jean78

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 Function

Merci 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 Function

Encore 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 Function

Un 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 Function

Il 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

Rechercher des sujets similaires à "recherche valeur tableau vba"