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 :

VBA => Erreur en VLOOKUP non gérable [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut VBA => Erreur en VLOOKUP non gérable
    Bonjour,

    Je ne trouve pas la solution à un plantage :
    Je vais chercher une référence dans le fichier rapport (RapFichOri).
    Avec cette référence, je trouve le nom du client et du titulaire dans le fichier client et je vais les copier dans le fichier rapport.

    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
     
    For LigneCrt = 3 To RapNbMaxLigne
            Windows(RapFichOri).Activate
            CliArgRech = Format((Range(Cells(LigneCrt, 2), Cells(LigneCrt, 2))), "000000000000")
     
            Windows(CliFichOri).Activate
            NomClient = Application.VLookup(CliArgRech, Range(Cells(2, 1), Cells(CliNbMaxLigne, 3)), 2, 0)
            NomTitulaire = Application.VLookup(CliArgRech, Range(Cells(2, 1), Cells(CliNbMaxLigne, 3)), 3, 0)
     
            Windows(RapFichOri).Activate
            Range(Cells(LigneCrt, 3), Cells(LigneCrt, 3)).Value = NomClient
            Range(Cells(LigneCrt, 4), Cells(LigneCrt, 4)).Value = NomTitulaire
     
            Windows(RapFichOri).Activate
            CliArgRech = Format((Range(Cells(LigneCrt, 2), Cells(LigneCrt, 2))), "000000000000")
    Next
    Tout fonctionne normalement sauf que mon fichier client n'est pas évolutif, que de temps en temps il manque une référence et que dès lors le programme se plante.
    Il n'est apparemment pas possible de capter l'erreur qui se produit et de la traiter (en l'occurrence afficher un message et la sortie du logiciel).

    Merci à la bonne âme qui aura la solution à ce qui ne fait que mettre en lumière la limite de mes compétences.

    Par ailleurs, il me semble que ce code pourrait être écrit plus finement, donc, si vous vous sentez inspiré, faites-vous plaisir, vous ferez mon bonheur.

    Belle soirée !

    Henri

  2. #2
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 144
    Par défaut
    Bonjour,

    Par ailleurs, il me semble que ce code pourrait être écrit plus finement, donc, si vous vous sentez inspiré, faites-vous plaisir, vous ferez mon bonheur.
    Alors sans pouvoir tester car je n'ai pas toute ton organisation je te propose ce code qui évite d'afficher les différentes plages et ne devrait par se planter
    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
    Set wsr = Windows(RapFichOri)
    Set wsc = Windows(CliFichOri)
    Set wso = Windows(RapFichOri)
    For LigneCrt = 3 To RapNbMaxLigne
     
            CliArgRech = Format((Range(wsr.Cells(LigneCrt, 2), wsr.Cells(LigneCrt, 2))), "000000000000")
           ' NomClient
            wso.Cells(LigneCrt, 3).Value = Application.IfError(Application.VLookup(CliArgRech, Range(wsc.Cells(2, 1), wsc.Cells(CliNbMaxLigne, 3)), 2, 0), "")
           ' NomTitulaire
            wso.Cells(LigneCrt, 4).Value = Application.IfError(Application.VLookup(CliArgRech, Range(wsc.Cells(2, 1), wsc.Cells(CliNbMaxLigne, 3)), 3, 0), "")
     
    Next
    Set wsr = Nothing
    Set wsc = Nothing
    Set wso = Nothing
    à toi de voir si cela te satisfait

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut
    Mille mercis pour votre code.

    Malheureusement, lors de l'exécution, il y a un plantage sur l'instruction :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            CliArgRech = Format((Range(wsr.Cells(LigneCrt, 2), wsr.Cells(LigneCrt, 2))), "000000000000")
    Erreur d'exécution 438
    Propriété ou méthode non gérée par cet objet.
    Aurais-tu une idée de ce dont il s'agit ?

    Merci d'avance.

  4. #4
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 144
    Par défaut
    Aurais-tu une idée de ce dont il s'agit ?
    Comme ceci cela devrait être plus correct


    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
    Set wsr = Windows(RapFichOri)
    Set wsc = Windows(CliFichOri)
    Set wso = Windows(RapFichOri)
    For LigneCrt = 3 To RapNbMaxLigne
     
            CliArgRech = Format(wsr.Cells(LigneCrt, 2), "000000000000")
           ' NomClient
            wso.Cells(LigneCrt, 3).Value = Application.IfError(Application.VLookup(CliArgRech, wsc.Cells(2, 1).Resize(CliNbMaxLigne, 3), 2, 0), "")
           ' NomTitulaire
            wso.Cells(LigneCrt, 4).Value = Application.IfError(Application.VLookup(CliArgRech, wsc.Cells(2, 1).Resize(CliNbMaxLigne, 3), 3, 0), "")
     
    Next
    Set wsr = Nothing
    Set wsc = Nothing
    Set wso = Nothing

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut
    Bonjour,

    Désolé mais j'obtiens la même erreur avec la nouvelle instruction.

    Puis-je faire quelque chose pour te faciliter la recherche ?

    A tout à l'heure.

    Henri

  6. #6
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 144
    Par défaut
    Bonjour,

    Puis-je faire quelque chose pour te faciliter la recherche ?
    En fait je ne fonctionne normalement pas avec Windows(RapFichOri) et je ne sais pas ce que tu as nommé "RapFichOri" : cela crée ton erreur.
    Il faudrait remplacer par la dénomination de la feuille concernée en codant tes noms corrects bien sûr.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set wsr = Workbooks("nom classeur").Worksheets("nom feuille")
    et de même pour wsc et wso

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut
    Pour la variable CliFichOri, ce n'est pas un souci mais pour RapFichOri, il n'en va pas de même car si la structure du fichier est toujours identique, le nom n'est jamais le même.
    Donc, au départ j'utilise les instructions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ' Organisation du rapport reçu de Sodexo
     
        RapTabOriginal = "Original"
        RapTabRésultats = "Résultats"
        RapTabStatutsUniques = "Statuts Uniques"
     
        RapFichOri = ActiveWorkbook.Name ' Fichier rapport en provenance de Sodexo avec les résultats de l'import GAP
        ActiveSheet.Name = RapTabOriginal
        Sheets(RapTabOriginal).Copy after:=Worksheets(RapTabOriginal)
        ActiveSheet.Name = RapTabStatutsUniques
        Sheets(RapTabOriginal).Copy after:=Sheets(RapTabStatutsUniques)
        ActiveSheet.Name = RapTabRésultats
    Pour les autres fichiers, les disques, chemins et noms de fichiers sont stockés dans un classeur que j'ouvre et ensuite :
    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
     
        Windows(CheFichOri).Activate
        CliDiskOri = Range("B6").Value
        CliRepOri = Range("B7").Value
        CliFichOri = Range("B8").Value
        CliDiskDes = Range("B16").Value
        CliRepDes = Range("B17").Value
        CliFichDes = Range("B18").Value
     
        Fichier = CliFichOri
        If FichierExiste(Fichier) = True Then
            Workbooks.Open Filename:=CliFichOri
        Else
            CliFichOri = Application.GetOpenFilename("Fichier clients, *.XLS; *.XLSX")
        End If
    Au départ, j'initialise mes variables classiquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        Dim CliDiskOri As String
        Dim CliRepOri As String
        Dim CliFichOri As Variant
        Dim CliDiskDes As String
        Dim CliRepDes As String
        Dim CliFichDes As String
        Dim CliTabOriginal As String
        Dim CliTabTravail As String
        Dim CliNbCol As Integer
        Dim CliNbMaxLigne As Integer
        Dim CliArgRech As String
    Peut-être est-ce là qu'il faut modifier quelque chose pour que la variable soit reconnue ?

  8. #8
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 144
    Par défaut
    Pour la variable CliFichOri, ce n'est pas un souci
    ok alors

    mais pour RapFichOri, il n'en va pas de même
    Si j'ai compris cela devrait donner ceci
    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
    Dim wsc As Range
    Dim wso As Range
    Dim wsr As Range
            Set wso = Workbooks(RapFichOri).Worksheets(RapTabOriginal)
            Set wsc = Workbooks("?").Worksheets("?")
            Set wsr = Workbooks(RapFichOri).Worksheets(RapTabRésultats)
            For LigneCrt = 3 To RapNbMaxLigne
     
                   CliArgRech = Format(wsr.Cells(LigneCrt, 2), "000000000000")
                   ' NomClient
                    wso.Cells(LigneCrt, 3).Value = Application.IfError(Application.VLookup(CliArgRech, wsc.Cells(2, 1).Resize(CliNbMaxLigne, 3), 2, 0), "")
                   ' NomTitulaire
                    wso.Cells(LigneCrt, 4).Value = Application.IfError(Application.VLookup(CliArgRech, wsc.Cells(2, 1).Resize(CliNbMaxLigne, 3), 3, 0), "")
     
            Next
            Set wsr = Nothing
            Set wsc = Nothing
            Set wso = Nothing

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut
    Voilà !
    J'ai terminé les modifications et grâce à toi tout fonctionne... et plus vite qu'avant !

    J'ai corrigé une coquille qui orientait vers une mauvaise feuille et supprimé les Dim qui provoquaient un message d'erreur.
    Il y a deux procédures sur deux fichiers différents, voici le code définitif :

    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
     
            Set wso = Workbooks(RapFichOri).Worksheets(RapTabOriginal)
            Set wsc = Workbooks(CliFichOri).Worksheets(CliTabTravail)
            Set wsr = Workbooks(RapFichOri).Worksheets(RapTabRésultats)
            Set wsp = Workbooks(PerFichOri).Worksheets(PerTabPersonnel)
     
            For LigneCrt = 3 To RapNbMaxLigne
     
                CliArgRech = Format(wsr.Cells(LigneCrt, 2), "000000000000")
                wsr.Cells(LigneCrt, 3).Value = Application.IfError(Application.VLookup(CliArgRech, wsc.Cells(2, 1).Resize(CliNbMaxLigne, 3), 2, 0), "") ' Nom client
                wsr.Cells(LigneCrt, 4).Value = Application.IfError(Application.VLookup(CliArgRech, wsc.Cells(2, 1).Resize(CliNbMaxLigne, 3), 3, 0), "") ' Nom titulaire
     
            Next
     
            For LigneCrt = 3 To RapNbMaxLigne
     
                PerArgRech = Format(wsr.Cells(LigneCrt, 5), "0000000")
                wsr.Cells(LigneCrt, 6).Value = Application.IfError(Application.VLookup(PerArgRech, wsp.Cells(2, 1).Resize(CliNbMaxLigne, 3), 2, 0), "")
     
            Next
     
            Set wsr = Nothing
            Set wsc = Nothing
            Set wso = Nothing
            Set wsp = Nothing
    Que dire d'autre que "Merci" ?
    Merci beaucoup peut-être ?! :-D

    Merci pour ton aide et à charge de revanche !

    Henri

  10. #10
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 144
    Par défaut
    Bonjour Henri1830,
    J'ai terminé les modifications et grâce à toi tout fonctionne... et plus vite qu'avant !
    Merci de ton retour et je suis content que tu ais résolu ton souci : sans afficher les feuilles l'on gagne du temps effectivement.

    Merci de ton accueil cela a été un plaisir de pouvoir t'aider.

  11. #11
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut
    J'ai encore une question si tu as deux minutes.
    Je vois bien l'effet de l'instruction RESIZE qui permet de passer outre un client dont la référence n'existe pas en CliFichOri, mais je ne vois pas du tout le rapport entre le redimensionnement (de quoi d'ailleurs) et le fait que l'erreur soit gérée.
    Si ça te prend trop de temps à expliquer, ne te casse pas la tête, je vivrai sans.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wsr.Cells(LigneCrt, 3).Value = Application.IfError(Application.VLookup(CliArgRech, wsc.Cells(2, 1).Resize(CliNbMaxLigne, 3), 2, 0), "") ' Nom client
    Merci d'avance

  12. #12
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 144
    Par défaut
    Je vois bien l'effet de l'instruction RESIZE
    Cette instruction remplace la virgule entre le début et la fin de la plage que tu utilises car je la trouve plus explicite.
    Elle est utilisée pour le redimensionnement de la plage à définir en lignes et colonnes.

    le fait que l'erreur soit gérée.
    La gestion du client non trouvé est géré par Application.IfError que j'ai rajouté sur Application.VLookup et qui laisse vide le client non présent.

    J'espère que c'est plus clair pour toi.
    Bonne journée

  13. #13
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut
    Voilà qui est limpide, mille mercis et bonne journée !

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

Discussions similaires

  1. Erreur dev c++ non value assignement
    Par insomniak dans le forum Dev-C++
    Réponses: 12
    Dernier message: 22/09/2005, 18h12
  2. erreur sur un non filtre
    Par nico.chev dans le forum Access
    Réponses: 1
    Dernier message: 20/09/2005, 12h16
  3. Réponses: 1
    Dernier message: 19/08/2005, 12h33
  4. [Debutant][Install][VS]erreur sur fichier non trouvé.
    Par silvermoon dans le forum DirectX
    Réponses: 4
    Dernier message: 16/07/2004, 20h59
  5. [FLASH MX] Erreur : L'identifiant non sensible à ...
    Par blowdesign dans le forum Flash
    Réponses: 2
    Dernier message: 16/05/2004, 21h10

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