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

Macros et VBA Excel Discussion :

Concaténer résultats d'une colonne A sur condition d'une colonne B [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    xxx
    Inscrit en
    Novembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : xxx

    Informations forums :
    Inscription : Novembre 2015
    Messages : 20
    Par défaut Concaténer résultats d'une colonne A sur condition d'une colonne B
    Bonjour,

    Dans une "feuille1" j'ai une liste de textes uniques. En face de cette cellule, dans la colonne d'à côté, une liste de noms séparées par un retour à la ligne.
    J'ai appelé ce tableau "Data" dans le gestionnaire de noms.
    Nom : Image1.png
Affichages : 875
Taille : 5,8 Ko

    Dans une "feuille2", c'est l'inverse que je voudrais obtenir... La colonne jaune doit se compléter automatiquement.
    J'ai appelé ce tableau "Resultat" dans le gestionnaire des noms
    Nom : Image2.png
Affichages : 764
Taille : 4,9 Ko

    Il faudrait que j'arrive à faire une formule pour :
    1/ rechercher sur la ligne 1 du tableau "Data" le texte en D2 (feuille2) (Parmis les autres textes)
    2/ si le texte est trouvé, me recopier la valeur de la colonne A en face (ici "Texte A" à écrire en E2)
    3/ continuer à recherche à la ligne suivante et concaténer tous les textes en face du mot "Toto"

    Je pense que l'idéal pour simplifier serait de mettre cette macro dans une formule, que je "tirerais" en E3, E4 et E5.
    Et d'appeler dans la formule mes noms de champs prédéfinis (Data et Resultat)
    Mais peut être que je me trompe?

    Quelqu'un aurait un début de macro à me suggérer?

    En fait j'ai essayé de traiter ce problème par formule sans passer par VBA (avec des rechercheV, des &, des si....), ça fonctionne, mais je suis limitée en nombre de tests... et mes tableaux sont très gros

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour !

    Parmi les différentes possibilités, voir la méthode Range.Find dans l'aide VBA et son exemple …

    Poster le début du code entrepris et balisé via l'icône #, merci.

    _________________________________________________________________________________________________________
    Je suis Paris, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Je suis à peu près sûr que ça doit être possible à faire avec une fonction matriciel mais les traitement de chaînes dans ce domaine dépassent un peu mes compétences.

    Voici donc une fonction en VBA.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function CONCASI(PlageTest As Range, PlageData As Range, Critere As String) As String
    Dim Lig As Long
     
    If PlageTest.Count <> PlageDate Then CONCASI = "###" : Exit Function
     
    CONCASI = ""
    For Lig=1 to PlageTest.Count Then
        If InStr(PlageTest.Item(Lig).Value, Critere) > 0 Then CONCASI = CONCASI & PlageData.Item(Lig).Value
    Next Lig
    End Function
    A utiliser de la façon suivante :
    En E2 de feuille2 mettre la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =CONCASI(feuille1!B$2:B$7;feuille1!A$2:A$7;D2)
    Recopier E2 vers le bas autant que nécessaire.

    Je n'ai pas testé. Il se pourrait donc qu'il y ait un peu de débugage.

  4. #4
    Membre expérimenté Avatar de EBRAG
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Avril 2013
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 125
    Par défaut
    Bonsoir,

    voixi ma proposition ...

    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
    Sub Zyva()
      Dim oCell As Range
      Dim oCellS As Range
      Dim sText As String
      Dim sRecup As String
      Dim i As Long
      i = 0
      Worksheets("Feuil2").Select
      For Each oCell In Range(Range("A2"), Range("A" & Range("A1").CurrentRegion.Rows.Count))
        sRecup = ""
        sText = oCell
        Worksheets("Feuil1").Select
        For Each oCellS In Range(Range("B2"), Range("B" & Range("A1").CurrentRegion.Rows.Count))
          If VBA.InStr(1, oCellS, oCell) > 0 Then
            If i > 0 Then
              sRecup = sRecup & Chr(10)
            End If
            sRecup = sRecup & oCellS.Offset(0, -1)
            i = i + 1
          End If
        Next
        oCell.Offset(0, 1) = sRecup
      Next
     
     
    End Sub

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    J'ose à peine dire (aussi le dirai-je du bout des lèvres) qu'une simple décision de conception affranchit totalement de telles difficultés finalement génératrices de lenteurs induites.
    Tu en rencontres une aujourd'hui. Tu en rencontreras peut-être une autre demain, toujours en raison de la même cause !
    Alors que tout deviendrait tellement plus simple à gérer si chacune des cellules de chaque "bloc" de la colonne A contenait le texte correspondant à "truc x" et que ce texte serait affiché en police de couleur du fond de chaque cellule, sauf pour la seule à "afficher" (à rendre "visible", donc).

    Prenons pour exemple les cellules A2 et B2 de ton image :
    Tout serait tellement plus simple (et collerait tellement mieux à l'esprit même d'un tableur) si tu utilisais 2 lignes (2, et 3,) donc, avec
    en A2 : "toto" en noir sur blanc, en B2 "Texte A", en A3 "toto" en blanc sur blanc et en B3 "Texte F" !

    Tout est tellement plus facile lorsqu'à chacune des cellules/valeurs ne correspond qu'une seule cellule/valeur.
    Garder à l'esprit ce qu'est avant tout un TABLEUR. Sa vocation principale n'est pas celle d'une présentation des données.

  6. #6
    Membre averti
    Femme Profil pro
    xxx
    Inscrit en
    Novembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : xxx

    Informations forums :
    Inscription : Novembre 2015
    Messages : 20
    Par défaut
    Bonjour,

    MERCI beaucoup pour toutes vos contributions, il va me falloir un peu de temps pour les tester et les comprendre !
    Je reviens vers vous dès que c'est fait !

    unparia tu n'as pas tort, mais il y a énormément d'autres informations dans mes lignes, et les dupliquer toutes 10, 20 fois en fonction de cette seule case ne me paraissait pas être la solution idéale (au moins lors de la création - manuelle - du tableau). Là il s'agit de présenter quelques résultats

    Néanmoins, pour d'autres traitement des données, je vais tâcher d'effectivement trouver un moyen de tout dédoubler automatiquement pour pour faciliter le traitement. (ça m'inquiète déjà )

  7. #7
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Tu payes tout simplement cher la priorité que tu as donnée à l'aspect visuel plutôt qu'à l'efficacité du tableur.
    Néanmoins, pour d'autres traitement des données, je vais tâcher d'effectivement trouver un moyen de tout dédoubler automatiquement pour pour faciliter le traitement. (ça m'inquiète déjà
    Ce n'est pas si difficile. Voici la méthode :
    Parcourir de bas en haut la colonne B
    -- pour chaque élément :
    ---- relever ce qu'il y a en colonne A dans une variable toto
    ---- l'éclater(Split) par rapport au caractère 10 ( chr(10) )
    ------- pour chaque élément de cet éclatement (sauf le 1er) : ajouter une ligne et y mettre en colonne A la valeur de toto en blanc sur blanc et en colonne B la valeur de l'élément correspondant de l'éclatement
    Vas-y et montre ce que tu as tenté, si non succès. Je t'aiderai au vu de ton effort.

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

Discussions similaires

  1. [LibreOffice][Tableur] Macro: colorer une ligne sur condition dans une macro?
    Par vandman dans le forum OpenOffice & LibreOffice
    Réponses: 5
    Dernier message: 17/09/2015, 09h04
  2. Réponses: 6
    Dernier message: 24/05/2014, 12h38
  3. Réponses: 6
    Dernier message: 07/05/2014, 09h04
  4. Réponses: 4
    Dernier message: 24/01/2012, 16h39
  5. Réponses: 6
    Dernier message: 21/05/2006, 20h37

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