Recuperer plusieurs colonnes présentants une valeur commune

Y compris Power BI, Power Query et toute autre question en lien avec Excel
M
MojitoDu75
Membre habitué
Membre habitué
Messages : 70
Inscrit le : 3 mai 2016
Version d'Excel : 2016

Message par MojitoDu75 » 4 décembre 2018, 14:32

Bonjour,

Je souhaite effectuer une automatisation de traitements de données.

J'ai deux feuilles, dans une feuille des questions avec les réponses renseignés, dans l'autre vierge, je veux regrouper mes données.

La question 1, par exemple, a ses réponses présentes dans une seule colonne : facile
If Sheets("Data Excel").Cells(6, Rows(1).Find("Q1", LookIn:=xlFormulas, LookAt:=xlWhole).Column) Then
    colonne_Q1 = Sheets("Data Excel").Rows(1).Find("Q1", LookIn:=xlFormulas, LookAt:=xlWhole).Column
    Sheets("Data Excel").Range(Cells(7, colonne_Q1), Cells((Nb_lignes - 1), colonne_Q1)).Select
    Selection.Copy
    Sheets("Transformation TT").Range("A2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, operation:=xlNone, skipblanks:=False, Transpose:=False
End If
Je recherche dans ma feuille "Data Excel" (présentant les données), la colonne où il y a ecrit "Q1" à la ligne 6 puis je copie toutes les valeurs de cette colonne dans mon autre feuille "Transformation TT"
Ca c'est pas dur, ca fonctionne trkl.

Ma question est autre, j'ai par exemple 6 colonnes représentant la question 2.
En gros la question 2 est : "Renseigner votre contact"
Tu as donc une colonne "Prénom", une autre "Nom", une autre "adresse mail", une autre "numéro de téléphone". A la ligne 6 de toutes ces colonnes, j'ai "Q2" d'indiquer.
Exemple : B7=Martin; C7=Dupont; D7=Martin.Dupont@google.com; E7=0606060606

Comment je fais pour aller rechercher toutes les colonnes où la valeur "Q2" est présent en ligne 6 ???
L'objectif serait que j'ai dans ma celllule "B2" de la sheet "Transformation TT" j'ai "Martin:Dupont:Martin.Dupont@google.com:0606060606"
Merci d'avance pour votre aide :)
Avatar du membre
Juice
Membre impliqué
Membre impliqué
Messages : 1'141
Appréciations reçues : 102
Inscrit le : 28 novembre 2017
Version d'Excel : Microsoft Excel 2010

Message par Juice » 4 décembre 2018, 15:57

Salut Mojito !
Comment je fais pour aller rechercher toutes les colonnes où la valeur "Q2" est présent en ligne 6 ???
Tu peut utiliser la méthode "Find" de la VBA pour sa :)
Sub Cherche_Colonne()
Dim x As Range
Set x = Sheets("Data Excel").Rows(6).Find("Q2")
MsgBox x.Column
End Sub
Le Set x = Sheets("Data Excel").Rows(6).Find("Q2") veux dire que tu cherche dans la ligne 6 de ta feuille "Data Excel" où ce trouve la valeur Q2

Et le x.Column te permet de retourner le numéro de colonne (pas la lettre).

Restant à dispo si tu a d'autre question!
Dans l'incapacité de continuer à vous aidez sur vos fichiers, je vous prie de bien vouloir m'excuser et vous invite à ouvrir un nouveau sujet pour reprendre vos problèmes avec un membre actif du Forum.

En espérant revenir très vite :)
M
MojitoDu75
Membre habitué
Membre habitué
Messages : 70
Inscrit le : 3 mai 2016
Version d'Excel : 2016

Message par MojitoDu75 » 4 décembre 2018, 16:19

Hello Juice,

Si tu regardes ma première partie de code j'utilise bien la fonction find pour trouver Q1 et je trouve bien ma colonne ou j'ai ma Q1
Le problème c'est que ma Q2 est sur la colonne B,C,D et E, comment je vais avec find pour récuperer toutes ces colonnes et pas seulement la premiere ou je vois "Q2" ???

Merci de ta réponse si quick en tout cas :)
Avatar du membre
Juice
Membre impliqué
Membre impliqué
Messages : 1'141
Appréciations reçues : 102
Inscrit le : 28 novembre 2017
Version d'Excel : Microsoft Excel 2010

Message par Juice » 4 décembre 2018, 16:45

Re- Mojito !

Autant pour moi :p !

Alors normalement tu devrais utiliser la fonction "FindNext" mais j'ai essayer de comprendre et sa m'a gonfler xD

Ci-dessous un code qui le remplace et qui est tout aussi bien :
Sub Cherche_Colonne()
Dim y As Long, z As Long
Dim x As Range
For y = 1 To Range("XFD6").End(xlToLeft).Column - 1
    Set x = Sheets("Data Excel").Rows(6).Find(What:="Q2", After:=Sheets("Data Excel").Cells(6, y))
    If x.Column <> z Then MsgBox x.Column
    z = x.Column
Next
End Sub
Sa recherche dans ta ligne 6 la valeur Q2 et te sort un MsgBox à chaque résultat unique trouvé ;p

Restant à dispo !
Dans l'incapacité de continuer à vous aidez sur vos fichiers, je vous prie de bien vouloir m'excuser et vous invite à ouvrir un nouveau sujet pour reprendre vos problèmes avec un membre actif du Forum.

En espérant revenir très vite :)
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 4'019
Appréciations reçues : 306
Inscrit le : 26 janvier 2011
Version d'Excel : 2007/2019

Message par Theze » 4 décembre 2018, 16:59

Bonjour,

A mettre dans le module de la feuille où tu entres le code de la question (dans mon exemple, "Feuil1"). C'est une procédure événementielle Change() , La recherche du code de la question, par exemple Q2, est faite en colonne A de l'autre feuille (dans mon exemple, "Feuil2") et les valeurs sont récupérées à partir de la colonne B jusqu'à la dernière non vide :
Private Sub Worksheet_Change(ByVal Target As Range)

    Dim Plage As Range
    Dim Cel As Range
    
    If Target.Column > 1 Then Exit Sub
    If Target.Count > 1 Then Exit Sub
    
    With Worksheets("Feuil2")
    
        Set Plage = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
        Set Cel = Plage.Find(Target.Value, , xlValues, xlWhole)
        
        If Cel Is Nothing Then Exit Sub
        
        Set Plage = .Range(.Cells(Cel.Row, 2), .Cells(Cel.Row, .Columns.Count).End(xlToLeft))
        
    End With
    
    Application.EnableEvents = False
    
    For Each Cel In Plage: Worksheets("Feuil1").Cells(Target.Row, Cel.Column).Value = Cel.Value: Next Cel
    
    Application.EnableEvents = True
    
End Sub
Il vaut mieux un qui sait que cent qui cherchent :wink:

Ce forum étant un lieu de partage, je n'accepte pas les messages privés !
M
MojitoDu75
Membre habitué
Membre habitué
Messages : 70
Inscrit le : 3 mai 2016
Version d'Excel : 2016

Message par MojitoDu75 » 4 décembre 2018, 17:56

Merci pour vos réponses, je travaille dessus actuellement.

Juste petite question pour Theze, je comprends pas très bien le fonctionnement de ta procédure.

Lorsque je l'appelle dans ma macro,
je declare dans ma macro principale une valeur "target"
dim target 
target = "Q14"
call worksheet_change(target) 
, j'arrive pas à l'appeler ca me renvoie une erreur en mode incompatiblité de type...

Je l'appelle comme ça ?

Du coup je vais dans ma worksheet ("Data Excel"), j'initialise ma plage de lecture
set plage = .range(.CELLS(5,1), .cells(5,50))
set cel  = Plage.Find(target.Value, , xlValues, xlWhole)
que fais cette ligne ? : For Each Cel In Plage: Worksheets("Feuil1").Cells(target.Row, Cel.Column).Value = Cel.Value: Next Cel

Difficile à comprendre ton code quand je le compare avec celui de Juice :(
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 4'019
Appréciations reçues : 306
Inscrit le : 26 janvier 2011
Version d'Excel : 2007/2019

Message par Theze » 4 décembre 2018, 20:37

Comme je l'ai précisé, c'est une procédure événementielle donc exécutée de façon automatique une fois la valeur saisie dans une cellule de la colonne A de la feuille "Feuil1" (la procédure doit se trouver dans le module de cette feuille). Voici un classeur test :
Test Question.xlsm
(17.11 Kio) Téléchargé 8 fois
Il vaut mieux un qui sait que cent qui cherchent :wink:

Ce forum étant un lieu de partage, je n'accepte pas les messages privés !
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message