Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 VBA : fonction trouve + si

ALF75

XLDnaute Nouveau
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...

Bon après-midi !

A.
 

Pièces jointes

  • Exemple.xlsx
    14.1 KB · Affichages: 16

vgendron

XLDnaute Barbatruc
Bonjour

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
 

ALF75

XLDnaute Nouveau
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 !
 

vgendron

XLDnaute Barbatruc
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
 

ALF75

XLDnaute Nouveau
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.
 

Pièces jointes

  • Exemple.xlsx
    14.2 KB · Affichages: 4

vgendron

XLDnaute Barbatruc
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"
 

Pièces jointes

  • Collecteur.xlsm
    25 KB · Affichages: 6

ALF75

XLDnaute Nouveau
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 !!!
 

vgendron

XLDnaute Barbatruc
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
 

Discussions similaires

Réponses
2
Affichages
321
Réponses
28
Affichages
2 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…