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 :

RECHERCHE V ne fonctionne pas [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2019
    Messages : 18
    Par défaut RECHERCHE V ne fonctionne pas
    Bonjour,
    (cette fois je ne fais pas de crossing)

    Petit problème liée à une macro dont 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
    Sub Macro5()
     
    Dim Resultat As Variant, Derlig As Long, Derlig1 As Long, Dercol As Long, Dercol1 As Long, i As Integer
     
    Derlig = ThisWorkbook.Sheets("Feuil1").UsedRange.SpecialCells(xlCellTypeLastCell).Row
    Derlig1 = ThisWorkbook.Sheets("DT Clients").UsedRange.SpecialCells(xlCellTypeLastCell).Row
     
    Dercol = ThisWorkbook.Sheets("Feuil1").UsedRange.SpecialCells(xlCellTypeLastCell).Column
    Dercol1 = ThisWorkbook.Sheets("DT Clients").UsedRange.SpecialCells(xlCellTypeLastCell).Column
     
    For i = Derlig To 1 Step -1
    On Error Resume Next
    Resultat = WorksheetFunction.VLookup(Range("D" & i), Sheets("DT Clients").Range("A:D"), 2, False)
     
    If IsNull(Cells(i, Dercol + 1).Value) Then
           Sheets("Feuil1").Cells(i, Dercol + 1).Value = "issou"
           Else: Cells(i, Dercol + 1).Value = Resultat
    End If
     
    Next i
     
     
    End Sub
    Pour expliquer le contexte : j'ai un classeur avec deux feuilles.
    Dans la première feuille, j'ai des numéros de dossiers techniques (qui prennent la forme de lettres et/ou chiffres tel "4GODV19" ou "ARCFREE"), et des montants pour chacun d'eux.
    Dans la deuxième feuille, j'ai des numéros de dossiers techniques (dont certains n'ont aucune correspondance avec ceux de la première feuille) reliés à des noms de client (la feuille s'étend sur + de 8000 lignes...).

    A savoir : un client peut être lié à plusieurs dossiers techniques, et on n'est pas sur de retrouver le n° de dossier technique de la 1ère feuille dans la deuxième feuille (et donc de se retrouver avec #N/A après utilisation de formule RECHERCHEV).


    Mais je m'égare. Mon but est bien évidemment d'utiliser RECHERCHEV pour associer les numéros de DT de la 1ere feuille à des noms de client.

    Le problème est que, sans le OnErrorResumeNext de mon code, lorsque j'exécute la macro, je me tape systématiquement une erreur 1004 (impossible de lire la propriété VLOOKUP de la méthode worksheet function).
    Je pourrais faire la formule à la main, mais cette bribe de macro rentre dans le cadre d'un projet d'automatisation du traitement de fichiers, et c'est là où je coince.

    J'ai tout essayé pour essayer de la faire fonctionner mais pas moyen.

    Dans l'attente de vous lire, merci.

    EDIT : J'ai oublié de dire mais mais le If ne fonctionne pas puisque la colonne où sont censés être inscrits les résultats reste vide!

  2. #2
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Au lieu d’utiliser VLookUp essaies la méthode Find (sans On Error Resume Next)

  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
    La gestion des erreurs est effectivement bien plus simple avec Find.
    On récupère le résultat dans une variable de type Range et on vérifie qu'elle n'est pas Noting.
    Ca évite d'avoir une variable Variant.
    https://msdn.microsoft.com/fr-fr/lib...6(v=office.15)

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2019
    Messages : 18
    Par défaut
    Bonjour à vous deux et merci beaucoup pour votre aide.

    En effet, Find a l'air plus fonctionnel. Toutefois petit problème avec mon nouveau 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
    26
    Sub Macro5()
     
    Dim Derlig As Long, Dercol As Long, Dercol1 As Long, i As Integer
    Dim targ As Variant, Plagerch As Range, c As Range
     
    Derlig = ThisWorkbook.Sheets("Feuil1").UsedRange.SpecialCells(xlCellTypeLastCell).Row
     
    Dercol = ThisWorkbook.Sheets("Feuil1").UsedRange.SpecialCells(xlCellTypeLastCell).Column
    Dercol1 = ThisWorkbook.Sheets("DT Clients").UsedRange.SpecialCells(xlCellTypeLastCell).Column
     
    Set Plagerch = Worksheets("DT Clients").Columns(Dercol1)
     
    For i = Derlig To 1 Step -1
    targ = Worksheets("Feuil1").Cells(Dercol, i).Value
    Set c = Plagerch.Cells.Find(What:=targ, LookAt:=xlWhole)
     
    If Not c Is Nothing Then
    Cells(i, Dercol + 1).Value = c
     
    Else:
    Cells(i, Dercol + 1).Value = "Raté"
    End If
    Next i
     
     
    End Sub
    Rien ne se passe. J'ai donc utilisé le pas-à-pas détaillé et j'ai remarqué que targ reste vide pour chaque i. La raison m'échappe, étant donné qu'il est déclaré en Variant il devrait être capable de prendre n'importe quelle valeur non ?

    Par ailleurs, "raté" n'est écrit dans aucune cellule.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2019
    Messages : 18
    Par défaut
    Alors j'ai modifié c, déclaré en Variant.

    c n'est pas vide dans la boucle, c'est pour cela que "Raté" n'est retournée dans aucune des cellules, le problème vient donc bien de targ, mais même si j'arrive à le localiser, je suis incapable de l'identifier.

    EDIT : j'ai ajouté des espions dans les variables c, Plagerch et targ. Mes soupçons étaient fondés, le problème vient bien de targ. Plagerch change du type Empty à Range/Range, c de Empty à Variant/Object/Range, et targ reste Empty.

    EDIT2 : Problème résolu! Je me sens bête tout d'un coup, j'ai confondu ligne et colonne quand j'ai indiqué une cellule à targ, donc forcément il restait vide car je n'ai rien dans la colonne 874

    Du coup un autre problème que je détaillerai dans un autre post pour plus de lisibilité.

  6. #6
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Alors j'ai modifié c, déclaré en Variant
    Pourquoi?
    La méthode Find retourne un objet Range.
    C'est la raison pour laquelle la déclaration d'une variable affectée est toujours précédée de l'instruction Set.

    Pour ta problématique, on ne peut que te conseiller une exécution pas à pas en ayant au préalable affiché la fenêtre des variables locales dont tu peux constater le retour lors de cette exécution.

    Remarque.
    Je me méfie comme de la peste des méthodes
    SpecialCells(lCellTypeLastCell)
    et
    UsedRange.
    Ma préférence va aux propriétés End(..) que ce soit pour la définition de la dernière ligne ou celle de la dernière colonne.

  7. #7
    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
    Citation Envoyé par Harkebe Voir le message
    j'ai remarqué que targ reste vide pour chaque i.
    Regarde la valeur de Dercol.

    Il y a quelque chose qui m'étonne beaucoup dans la structure de ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    For i = Derlig To 1 Step -1
        targ = Worksheets("Feuil1").Cells(Dercol, i).Value
        Set c = Plagerch.Cells.Find(What:=targ, LookAt:=xlWhole)
     
        If Not c Is Nothing Then
            Cells(i, Dercol + 1).Value = c
        Else
            Cells(i, Dercol + 1).Value = "Raté"
        End If
    Next i
    En somme, tu recherches une valeur et tu mets la valeur cherchée dans la cellule de destination.

    Ne serait-il pas plus simple d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = Derlig To 1 Step -1
        targ = Worksheets("Feuil1").Cells(Dercol, i).Value
        Cells(i, Dercol + 1).Value = targ
        If Plagerch.Cells.Find(What:=targ, LookAt:=xlWhole) Is Nothing Then Cells(i, Dercol + 1).Value = "Raté"
    Next i
    Voir même :
    Ne serait-il pas plus simple d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For i = Derlig To 1 Step -1
        targ = Worksheets("Feuil1").Cells(Dercol, i).Value
        Cells(i, Dercol + 1).Value = IIf(Plagerch.Cells.Find(What:=targ, LookAt:=xlWhole) Is Nothing, "Raté", targ)
    Next i

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2019
    Messages : 18
    Par défaut
    Si et c'est bien plus lisible! Merci beaucoup, j'ai des lacunes et j'ai tendance à faire compliqué quand je peux faire simple.

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

Discussions similaires

  1. [XL-2010] Rechercher/Remplacer ne fonctionne pas en VBA
    Par mat_dd dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/08/2016, 09h30
  2. Recherche fullTexte ne fonctionne pas
    Par fasyr dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/12/2011, 10h30
  3. Réponses: 6
    Dernier message: 21/12/2010, 20h00
  4. Réponses: 9
    Dernier message: 18/04/2008, 10h37

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