IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Conception Discussion :

Chercher des informations dans un tableau de données [XL-2010]


Sujet :

Conception

  1. #1
    Membre à l'essai
    Femme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 24
    Points : 21
    Points
    21
    Par défaut Chercher des informations dans un tableau de données
    Bonjour,
    J'ai un tableau contenant plusieurs informations dans une cellule. Est-ce qu'il y a un truc pour être capable d'extraire les informations d'un tableau. Voir pièce jointe.

    Merci
    Aimey

    Nom : exemple_aimey.PNG
Affichages : 358
Taille : 14,7 Ko

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut.

    Dans la mesure où il n'y a pas d'autres cellules qui contiennent le "code" que tu recherches...
    Nom : 2016-05-11_233009.jpg
Affichages : 366
Taille : 33,9 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    hello,
    Pierre, ta formule ne fonctionne pas dans tous les cas de figure. Par exemple si dans les codes j'ai 17 , la formule le prend en compte.
    J'ai créé une fonction personnalisée en vba qui devrait remplir la fonction :
    recherchecode(<code à chercher>,<plage qui englobe les codes et la colonne à afficher>,<colonne à afficher>)
    par exemple recherchecode(7,B2:D8,3) recherche le code 7 de la ligne 2 à la ligne 8 de B et affiche ce qu'il y a en colonne D (3ème colonne de la plage)
    les codes sont extraits des cellules par un split avec séparateur la virgule.
    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Public Function RechercheCode(NumCode As String, PlageRecherche As Range, ColonneAffichée) As String
    Dim arr() As Variant
    Dim Ligne As String
    Dim TableauValeurs As Variant
    arr = PlageRecherche
    Dim R As Long
    RechercheCode = "Pas trouvé"
    For R = 1 To UBound(arr, 1) ' première dimension = lignes
            Ligne = arr(R, 1)    ' 1 =  première colonne
            TableauValeurs = Split(Ligne, ",")
            If IsInArray2(NumCode, TableauValeurs) >= 0 Then RechercheCode = arr(R, ColonneAffichée) ' une seule colonne
    Next R
    End Function
     
    Function IsInArray2(stringToBeFound As String, arr As Variant) As Long
      Dim i As Long
      ' default return value if value not found in array
      IsInArray2 = -1
      For i = LBound(arr) To UBound(arr)
        If StrComp(stringToBeFound, arr(i), vbTextCompare) = 0 Then
          IsInArray2 = i
          Exit For
        End If
      Next i
    End Function
    Pour éviter de transférer les cellules une par une on transfère en une seule fois la plage dans un tableau ( arr = PlageRecherche)

    Nom : RechercheCode.png
Affichages : 364
Taille : 28,2 Ko

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  4. #4
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    En effet. Mais en fait, l'utilisation de VBA est rendue obligatoire par le fait que le tableau est mal formé au départ. C'est donc un problème de conception du classeur et il est préférable de résoudre le problème de conception plutôt que de mettre des rustines

    Dès lors, tant qu'à faire du VBA, je propose de laisser la source telle quelle et de créer un nouveau tableau dans lequel on remet en VBA les données sous une forme permettant un traitement des données avec Excel. Si on ne procède pas ainsi, on va devoir "pondre" du VBA pour tous les traitements futurs des données alors que si on reforme le tableau, on se donne la possibilité d'utiliser tous les outils d'Excel, par exemple un INDEX/EQUIV, mais aussi un TCD, des fonctions d'ensemble, ...).

    Je propose donc le code suivant, dans lequel il suffira d'exécuter la procédure TraiterDonnees après avoir adapté les variables SourceCell et TableauFinal à la réalité du classeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    ' Adapte le tableau reçu pour le normaliser
    ' permettre l'utilisation correcte d'Excel
    Private Sub AdapterTableau(SourceCell As Range, TableauFinal As ListObject)
      Dim Cellule As Range ' Cellule d'itération
      Dim Cible As Range ' Première cellule de la ligne Cible
      Dim Codes ' Tableau des codes récupérés dans Cellule
      Dim Counter As Long ' compteur d'itérations
      Dim Source As Range ' Plage source mal formée
     
      ' Initialisation
      Set Source = Range(SourceCell, SourceCell.End(xlDown)) ' Calcul de la plage source en fonction de sa première cellule
      Set Cible = TableauFinal.Range.Cells(1)(2) ' On détermine la première cellule du tableau final
     
      ' Vidange du tableau final
      If Not TableauFinal.DataBodyRange Is Nothing Then TableauFinal.DataBodyRange.Delete
     
      ' Boucle sur les cellules de la colonne A
      For Each Cellule In Source
        Codes = Split(Cellule(1, 2).Value, ",")
        For Counter = 0 To UBound(Codes)
          Cible.Value = Cellule.Value
          Cible(1, 2).Value = Codes(Counter)
          Cible(1, 3).Value = Cellule(1, 3).Value
          Cible(1, 4).Value = Cellule(1, 4).Value
          Set Cible = Cible(2)
        Next Counter
      Next Cellule
    End Sub
     
    ' Procédure de traitement des données
    ' Il suffit d'adapter SourceCell et TableauFinal à la configuration
    ' du classeur réel utilisé
    Sub TraiterDonnees()
      Dim SourceCell As Range
      Dim TableauFinal As ListObject
     
      Set SourceCell = Range("a2")
      Set TableauFinal = Feuil1.ListObjects(1)
      AdapterTableau SourceCell, TableauFinal
    End Sub
    On obtient alors un beau tableau et il n'y a plus qu'à utiliser toute la puissance d'Excel.

    Pièce jointe 209471
    Images attachées Images attachées  
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 667
    Points : 1 419
    Points
    1 419
    Par défaut
    Bonjour,

    Voici une solution un peu décalée basée sur une fonction personnalisée matricielle.
    Cette fonction générique est basée sur les expressions régulières et est réutilisable pour d'autres traitements; il suffit d'utiliser le bon motif ("pattern") en paramètre pour l'adapter à ce cas particulier:

    Dans un module VBA:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Public Function RegExTest(sourceRg As Range, patternTxt As String)
        Dim reg
        Dim i As Long, j As Long
        Dim tempTab()
     
        tempTab = sourceRg.Value
     
        Set reg = CreateObject("VBScript.RegExp")
        reg.pattern = patternTxt
        For i = LBound(tempTab, 1) To UBound(tempTab, 1)
            For j = LBound(tempTab, 2) To UBound(tempTab, 2)
                tempTab(i, j) = reg.test(tempTab(i, j))
            Next j
        Next i
        RegExTest = tempTab
    End Function
    Et dans une case Excel, la fonction matricielle suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =INDEX(Tableau1[Numéro de pièces]; MIN(SI(RegExTest(Tableau1[Numéro eq]; "(^|,)7(,|$)"); LIGNE(Tableau1[Numéro eq]) - LIGNE(Tableau1[[#En-têtes];[Numéro eq]]); 1000000000)))
    A valider par Ctrl+Maj+Entrée.

  6. #6
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    A la lecture des réponses fournies et en regardant de plus près le tableau des données, je ne suis pas convaincu que nos réponses sont correctes, puisque le code 7 est présent deux fois dans code_EQ... Dès lors, ce sera normalement le premier qui sera trouvé (et donc, selon l'organisation du tableau), le code renvoyé ne sera pas VON_...

    Il me semble qu'il sera intéressant que la demandeuse précise ce qu'elle souhaite obtenir...

    Et quoi qu'il en soit, au risque de paraître têtu, je persiste à dire qu'il faut d'abord préparer les données pour qu'elles soient conformes à une utilisation optimale des outils natifs d'Excel, sans quoi il faudra pondre des fonctions personnelles, certes intellectuellement intéressantes, mais très difficilement adaptables à d'autres cas.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    hello,
    en effet nous n'avons pas traité le cas où il y a plusieurs fois le même code. Afficher alors la première , la dernière ou toutes les solutions ?
    Au fait c'est toi Pierre qui a déplacé le message ici ? as-tu prévenu Aimey?
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    [...]
    Au fait c'est toi Pierre qui a déplacé le message ici ? as-tu prévenu Aimey?
    [...]
    Oui, pour les deux questions, et de toutes façons, les liens suivent derrière dans la liste des abonnements
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre expérimenté
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 667
    Points : 1 419
    Points
    1 419
    Par défaut
    Bonsoir,

    Pour toutes les solutions, cette formule matricielle placée à partir de G2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =INDEX(Tableau1[Numéro de pièces]; PETITE.VALEUR(SI(RegExTest(Tableau1[Numéro eq]; "(^|,)7(,|$)"); LIGNE(Tableau1[Numéro eq]) - LIGNE(Tableau1[[#En-têtes];[Numéro eq]]); 1000000000); LIGNE()-LIGNE($G$2)+1))
    Pour la dernière solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =INDEX(Tableau1[Numéro de pièces]; MAX(SI(RegExTest(Tableau1[Numéro eq]; "(^|,)7(,|$)"); LIGNE(Tableau1[Numéro eq]) - LIGNE(Tableau1[[#En-têtes];[Numéro eq]]); 0)))

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/02/2013, 11h12
  2. probleme d'affichage des informations dans un tableau
    Par fleurrouge dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 28/06/2012, 21h48
  3. Chercher des informations dans la pile
    Par Invité dans le forum x86 16-bits
    Réponses: 6
    Dernier message: 26/08/2011, 22h21
  4. Rechercher des informations dans une base de donnée en excel
    Par simonasjdp dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/07/2009, 19h10
  5. ajouter des informations dans la base de données
    Par gentil dans le forum Hibernate
    Réponses: 7
    Dernier message: 12/04/2007, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo