Bonjour à vous,
Je travaille actuellement sur des résultats d'une étude de marché, pour lesquels je souhaiterai créer un dashboard. Etant donné qu'il y a énormément de fichiers à traiter, je pensais faire une macro pour écrire des mots clés en face des éléments que je veux récupérer (via des RECHERCHEV par la suite).
Mon souci est que d'un fichier à l'autre, certaines questions ou certains critères sont vides, et vu que je suis très novice en VBA, ça ne fonctionne pas.
Je mets un exemple en pièce jointe avec 2 onglet :
- Avant : ce que j'ai initialement
- Après : ce que je souhaiterai obtenir
Pour le moment, ma macro ressemble à ça (code récupéré sur Internet puis adapté). Ca plante car je pense que dans cette macro, il ne va pas directement sur la cellule recherchée.
VB:
Sub Macro1()
'
' Macro1 Macro
'
Dim Trouve As Range, PlageDeRecherche As Range
Dim Valeur_Cherchee As String, AdresseTrouvee As String
Valeur_Cherchee = "c5_3_3 Invoicing Performance (Respondent Basis)"
Set PlageDeRecherche = ActiveSheet.Columns(1)
Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
Valeur_Cherchee = "Excellent"
Set PlageDeRecherche = ActiveSheet.Columns(2)
Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
If Trouve Is Nothing Then
AdresseTrouvee = Valeur_Cherchee
Else
ActiveCell.Offset(rowOffset:=0, columnOffset:=-1).Activate
ActiveCell.FormulaR1C1 = "c5_3_31"
End If
Set PlageDeRecherche = Nothing
Set Trouve = Nothing
'
End Sub
Je suis obligé de faire ma recherche en 2 fois :
- le numéro de la question en premier
- le critère recherché ensuite (je ne veux pas rechercher tous les "Excellent" du fichier, mais uniquement celui des questions qui m'intéressent)
Merci par avance pour votre aide et je suis à disposition si je ne suis pas clair...
je pense qu'il manque des élements dans ta demande:
tu parles de plusieurs fichiers à traiter==> je suppose que tu as donc UN fichier qui collecte tout
la, tu n'as posté qu'un des nombreux fichiers.
Je présumé que le fichier de collecte est celui ou on trouve toutes les questions à récupérer== ca aiderait de l'avoir pour éviter de devoir ecrire en dur dans la macro le nom de la fonction "c5_3_3......"
ensuite: ta macro
la première partie ou tu recherches la fonction.. c'est bien.. mais une fois que tu l'as trouvée.. tu n'en fais rien..
tu attaques la seconde partie qui recherche "Excellent" ==> ton code trouve le PREMIER excellent de la colonne B==> ne cherche pas à savoir si c'est le excellent de la fonction souhaitée
ensuite: pour mettre le mot clé au bon endroit il faut modifier ton code comme ceci
VB:
Sub Macro1()
'
' Macro1 Macro
'
Dim Trouve As Range, PlageDeRecherche As Range
Dim Valeur_Cherchee As String, AdresseTrouvee As String
Valeur_Cherchee = "c5_3_3 Invoicing Performance (Respondent Basis)"
Set PlageDeRecherche = ActiveSheet.Columns(1)
Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
Valeur_Cherchee = "Excellent"
Set PlageDeRecherche = ActiveSheet.Columns(2)
Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
If Trouve Is Nothing Then
AdresseTrouvee = Valeur_Cherchee
Else
Trouve.Offset(rowOffset:=0, columnOffset:=-1).FormulaR1C1 = "c5_3_31"
End If
Set PlageDeRecherche = Nothing
Set Trouve = Nothing
'
End Sub
je pense qu'il manque des élements dans ta demande:
tu parles de plusieurs fichiers à traiter==> je suppose que tu as donc UN fichier qui collecte tout
la, tu n'as posté qu'un des nombreux fichiers.
Je présumé que le fichier de collecte est celui ou on trouve toutes les questions à récupérer== ca aiderait de l'avoir pour éviter de devoir ecrire en dur dans la macro le nom de la fonction "c5_3_3......"
ensuite: ta macro
la première partie ou tu recherches la fonction.. c'est bien.. mais une fois que tu l'as trouvée.. tu n'en fais rien..
tu attaques la seconde partie qui recherche "Excellent" ==> ton code trouve le PREMIER excellent de la colonne B==> ne cherche pas à savoir si c'est le excellent de la fonction souhaitée
ensuite: pour mettre le mot clé au bon endroit il faut modifier ton code comme ceci
VB:
Sub Macro1()
'
' Macro1 Macro
'
Dim Trouve As Range, PlageDeRecherche As Range
Dim Valeur_Cherchee As String, AdresseTrouvee As String
Valeur_Cherchee = "c5_3_3 Invoicing Performance (Respondent Basis)"
Set PlageDeRecherche = ActiveSheet.Columns(1)
Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
Valeur_Cherchee = "Excellent"
Set PlageDeRecherche = ActiveSheet.Columns(2)
Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
If Trouve Is Nothing Then
AdresseTrouvee = Valeur_Cherchee
Else
Trouve.Offset(rowOffset:=0, columnOffset:=-1).FormulaR1C1 = "c5_3_31"
End If
Set PlageDeRecherche = Nothing
Set Trouve = Nothing
'
End Sub
Bonjour,
Merci beaucoup pour ton retour !
Pour répondre à tes questions :
tu parles de plusieurs fichiers à traiter==> je suppose que tu as donc UN fichier qui collecte tout
la, tu n'as posté qu'un des nombreux fichiers.
--> J'ai 150 fichiers contenant les informations. Chaque fichier sera traité indépendamment.
Je présumé que le fichier de collecte est celui ou on trouve toutes les questions à récupérer== ca aiderait de l'avoir pour éviter de devoir ecrire en dur dans la macro le nom de la fonction "c5_3_3......"
--> Malheureusement c'est un fichier confidentiel et je ne peux pas les partager (du moins pas plus que ça). Je vais devoir créer des boucles (même si ce n'est pas pratique et loin d'être optimisé) pour chaque question
tu attaques la seconde partie qui recherche "Excellent" ==> ton code trouve le PREMIER excellent de la colonne B==> ne cherche pas à savoir si c'est le excellent de la fonction souhaitée
--> Cela veut dont dire que la macro ne va fonctionner que pour le PREMIER "Excellent" quelque soit le numéro de question (c5_3_3 ou c5_3_4...) ? Comment faire pour qu'il reconnaisse le Excellent de la c5_3_3 du Excellent c5_3_4 ?
Merci par avance pour ton retour et bonne journée !
il te suffirait de poster un fichier 'exemple" avec juste quelques données bidons, pour montrer la structure du fichier et quelles infos tu cherches à collecter: parce que.. pourquoi ne pas récuperer directement les infos souhaitées plutot que faire une macro pour indiquer où sont les infos.. que tu finiras par récuperer de toute facon..
en attendant: ta macro modifiée et commentée
VB:
Sub Macro1()
'Déclarations
Dim Trouve As Range, PlageDeRecherche As Range
Dim Valeur_Cherchee As String, AdresseTrouvee As String
Valeur_Cherchee = "c5_3_3 Invoicing Performance (Respondent Basis)"
Set PlageDeRecherche = ActiveSheet.Columns(1)
Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
If Not Trouve Is Nothing Then
Finzone = Trouve.Offset(1, 0).End(xlDown).Row 'on cherche la première cellule NON vide en dessous de la valeur cherché ==> ca correspond à la prochaine question
Else
MsgBox "Question introuvable"
Exit Sub
End If
Valeur_Cherchee = "Excellent"
Set PlageDeRecherche = ActiveSheet.Range(Cells(Trouve.Row, 2), Cells(Finzone - 1, 2)) 'on set la nouvelle zone de recherche (entre question cherchée et prochaine question)
PlageDeRecherche.Select 'juste pour visualiser la zone de recherche ==> sera à commenter pour la suite
Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
If Trouve Is Nothing Then
AdresseTrouvee = Valeur_Cherchee '??? pour quoi faire??
Else
Trouve.Offset(0, -1).FormulaR1C1 = "c5_3_31"
End If
Set PlageDeRecherche = Nothing
Set Trouve = Nothing
End Sub
il te suffirait de poster un fichier 'exemple" avec juste quelques données bidons, pour montrer la structure du fichier et quelles infos tu cherches à collecter: parce que.. pourquoi ne pas récuperer directement les infos souhaitées plutot que faire une macro pour indiquer où sont les infos.. que tu finiras par récuperer de toute facon..
en attendant: ta macro modifiée et commentée
VB:
Sub Macro1()
'Déclarations
Dim Trouve As Range, PlageDeRecherche As Range
Dim Valeur_Cherchee As String, AdresseTrouvee As String
Valeur_Cherchee = "c5_3_3 Invoicing Performance (Respondent Basis)"
Set PlageDeRecherche = ActiveSheet.Columns(1)
Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
If Not Trouve Is Nothing Then
Finzone = Trouve.Offset(1, 0).End(xlDown).Row 'on cherche la première cellule NON vide en dessous de la valeur cherché ==> ca correspond à la prochaine question
Else
MsgBox "Question introuvable"
Exit Sub
End If
Valeur_Cherchee = "Excellent"
Set PlageDeRecherche = ActiveSheet.Range(Cells(Trouve.Row, 2), Cells(Finzone - 1, 2)) 'on set la nouvelle zone de recherche (entre question cherchée et prochaine question)
PlageDeRecherche.Select 'juste pour visualiser la zone de recherche ==> sera à commenter pour la suite
Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
If Trouve Is Nothing Then
AdresseTrouvee = Valeur_Cherchee '??? pour quoi faire??
Else
Trouve.Offset(0, -1).FormulaR1C1 = "c5_3_31"
End If
Set PlageDeRecherche = Nothing
Set Trouve = Nothing
End Sub
Merci !
J'ai mis un fichier d'exemple avec 2 questions. Je le remets en copie.
Fondamentalement, je dois checker des slides présentant des résultats qui se trouvent dans des fichiers Excel (150 PPT / 150 XLS - 1 fichier XLS par PPT) et chaque XLS est différent (nombre de lignes, questions ou libellés non disponibles)
Pour récupérer les infos utiles facilement, je prépare un dashboard Excel à côté avec les mots clés (RECHERCHEV par la suite) qui sont placés par la macro.
Regarde en PJ, un exemple de ce qui pourrait se faire
à adapter en fonction de tes fichiers bien sur
quand tu cliques sur le bouton, la macro te demande d'ouvrir un fichier à importer
le résultat de l'importation est mis dans la feuille "Data Collectées"
Merci beaucoup ! C'est top pour définir les questions à rechercher.
Juste un dernier truc : serait-il possible d'ajouter un truc pour récupérer la ligne sous "Excellent", "Very good" etc. C'est une information que je souhaiterais extraire également. Le "problème" c'est qu'elle n'a pas de nom défini comme les autres libellés ("Excellent", "Very good"...).
En tous les cas, merci beaucoup, aide grandement appréciée !!!
il te suffit d'adapter ces lignes: pour copier les zones que tu souhaites
VB:
If Trouve Is Nothing Then
AdresseTrouvee = Valeur_Cherchee '??? pour quoi faire??
Else
Trouve.Offset(0, 2).Resize(2, 4).Copy Destination:=WsDest.Range("C" & fin + 1) 'ici je copie deux lignes / 4 colonnes à droite de l'élement trouvé
fin = fin + 2
End If
C'est parfait ! Je vais devoir revoir tout mon dashboard, mais bon, ce sera plus simple de récupérer les datas.
Merci beaucoup pour ton aide et bon après-midi !