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 :

erreur de Range avec VLOOKUP [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Réunion

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2022
    Messages : 6
    Par défaut erreur de Range avec VLOOKUP
    Bonjour a vous ,
    je recherche votre aide pour un problème qui me paraissait simple mais que je n'arrive pas a résoudre vu mes connaissance limité en VBA .
    Voila j'ai un tableau sur la feuille "NINF" et une table de données sur la feuille "UF" , l’idée est quand je tape un n° d'UF dans la colonne B de la feuille "NINF" , la colonne C se rempli automatiquement en correspondance avec la table de donnée présent sur la feuille "UF".
    En utilisant la fonction VLOOKUP j'ai réussi a faire ça sauf que j'ai un message d'erreur a chaque fois que j'arrive pas a résoudre :
    Nom : erreur.jpg
Affichages : 161
Taille : 22,2 Ko

    voici le code utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    With Sheets("NINF")
    Sheets("NINF").Range("C4:C1004") = Application.WorksheetFunction.VLookup(Sheets("NINF").Range("B4:B1004"), Sheets("UF").Range("A2:B14"), 2, False)
    End With
    End Sub
    merci d'avance pour votre aide .
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 601
    Par défaut
    Bonjour

    Pour faire au plus rapide et tel que ton code est inséré dans le fichier il te suffit de couper la surveillance des événements au début de ton code et de la réactiver à la fin.

    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
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    
    Application.EnableEvents = False
    
    MsgBox "Début du code" 'a supprimer quand tu auras compris l'utilité de Application.EnableEvents
    
    With Sheets("NINF")
    
        Sheets("NINF").Range("C4:C1004") = Application.WorksheetFunction.VLookup(Sheets("NINF").Range("B4:B1004"), Sheets("UF").Range("A2:B14"), 2, False)
    
    End With
    
    Application.EnableEvents = True
    
    End Sub
    La façon et l'endroit où tu as mis ton code font qu'Excel l'exécute à chaque changement de valeur de l'une des cellules de n'importe quelle feuille de ton classeur. Disons que c'est une façon de faire qui te permettra d'arriver à tes fins.
    Par contre ton code met à jour NINF!C4 et refait tourner le code puis met à jour NINF!C5 et refait tourner le code puis met à jour NINF!C6 et refait tourner le code puis met à jour NINF!C7 .....
    Donc pour mettre à jour toute ta zone "C4:C1004" bin il tourne 1 000 fois. Oui bon d'accord le code ne prend pas beaucoup de temps donc ce n'est pas grave en soi mais pas du tout top.
    Le fait d'avoir placé ton code dans "Workbook_SheetChange" fait qu'il est événementiel; c'est à dire qu'il se déclenchera à chaque fois que tu modifiers une cellule de la feuille.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.EnableEvents = False
    et
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.EnableEvents = True
    te permettra respectivement de temporairement couper le déclenchement de tout code événementiel puis de relancer son exécution


    Essaye avec cette msgbox que j'ai placé en début de ton code pour te faire comprendre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    
    MsgBox "Début du code" 'a supprimer quand tu auras compris l'utilité de Application.EnableEvents
    
    With Sheets("NINF")
    
        Sheets("NINF").Range("C4:C1004") =  Application.WorksheetFunction.VLookup(Sheets("NINF").Range("B4:B1004"),  Sheets("UF").Range("A2:B14"), 2, False)
    
    End With
    
    End Sub



    Ça c'était pour la correction rapide de ton cas particulier. Pour compléter rapidement ma réponse tu utilises, du moins syntaxiquement parlant, "With" et "End with" dans ton code. Ce faisant dans ta seule ligne de code à l'intérieur tu continues de préciser le nom de la feuille. Ce qui veut dire que dans ce cas "With" et "End with" ne servent strictement à rien.

    Si tu veux garder "With" et "End with" tu peux faire directement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    
    Application.EnableEvents = False
    
    With Sheets("NINF")
    
         Sheets("NINF").Range("C4:C1004") =  Application.WorksheetFunction.VLookup(Sheets("NINF").Range("B4:B1004"),  Sheets("UF").Range("A2:B14"), 2, False)
    
    End With
    
    Application.EnableEvents = True
    
    End Sub
    (Attention de garder le . devant range)

    Et à l'inverse tu peux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    
    Application.EnableEvents = False
    
    With Sheets("NINF")
    
        Sheets("NINF").Range("C4:C1004") =  Application.WorksheetFunction.VLookup(Sheets("NINF").Range("B4:B1004"),  Sheets("UF").Range("A2:B14"), 2, False)
    
    End With
    
    Application.EnableEvents = True
    
    End Sub
    En fait, "With" et "End with" permet de faire comprendre à Excel d'utiliser implicitement ce que tu à mis juste derrière le "With" devant chaque . dans la suite de ton code jusqu'au "End with".

    Il y aurait encore d'autres trucs à revoir (tes numéros de fin de ligne ne sont pas dynamiques par exemple; comment fais-tu si ta saisie dépasse NIN!C14 ou UF!B14 ?) mais pour le moment teste donc ces solutions et dis-nous.

  3. #3
    Expert confirmé Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 290
    Par défaut
    Salut
    Pour compléter la réponse d'Alex020181
    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
    Option Explicit
    Private Sub Worksheet_Change(ByVal target As Range)
    Dim xlwbs As Worksheet, xlwbs1 As Worksheet
    Dim rng As Range, cell As Range
    Dim intersection As Range
    Dim Lmax As Integer, Lmax1 As Integer
     
    Set xlwbs = ThisWorkbook.Worksheets("NINF")
    Set xlwbs1 = ThisWorkbook.Worksheets("UF")
     
    Lmax = xlwbs.Cells(Rows.Count, 1).End(xlUp).Row
    Lmax1 = xlwbs1.Cells(Rows.Count, 1).End(xlUp).Row
     
    Set rng = xlwbs.Range(Cells(4, 2), Cells(Lmax, 2))
    Set intersection = Intersect(target, rng)
     
    Application.EnableEvents = False
    If Not intersection Is Nothing Then
        rng.Offset(, 1) = Application.WorksheetFunction.VLookup(rng, xlwbs1.Range("A2:B" & Lmax1), 2, False)
    End If
    Application.EnableEvents = True
    End Sub

  4. #4
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Réunion

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2022
    Messages : 6
    Par défaut
    Bonjour et merci a vous ,
    @ Alex020181 : effectivement je trouvais que ça faisait doublon les With /End with , l'utilisation de "Application.EnableEvents" a résolu le message d'erreur , ça marche presque parfaitement.
    @Hyperion13 : merci pour ton code mais je n'arrive pas a le faire fonctionner , je l'ai mis dans "thisWorkbook" mais je n'ai pas de réaction sur ma feuille NINF , j'ai du louper quelque chose ,je ne suis pas trop expérimenté en VBA.
    ps: d’après tes coordonnées dans ta signature on serais dans la même région.

    par contre pour les cellules B non renseigné j'ai "#N/A" qui apparaît dans les cellules C correspondantes , il y a t'il possibilité de l'enlevé ?

    Merci a vous.

  5. #5
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 601
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Sheets("NINF").Range("C4:C1004") = Application.WorksheetFunction.IfError(Application.WorksheetFunction.VLookup(Sheets("NINF").Range("B4:B1004"), Sheets("UF").Range("A2:B14"), 2, False), "Pas trouvé")
    Remplace "Pas trouvé" par ce que tu veux.

  6. #6
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Réunion

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2022
    Messages : 6
    Par défaut
    c'est tous simplement parfait , merci de votre aide.

    Sur ce projet je ne suis qu'au tout début , mon Boss me finance une formation VBA prochainement pour m’améliorer et je pourrais ensuite aider également ceux qui commence et galère comme moi .

    A bientôt et merci encore

  7. #7
    Expert confirmé Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 290
    Par défaut
    il faut insérer la sub dans le module de la feuille NINF.
    Citation Envoyé par FA974 Voir le message
    ... @Hyperion13 : merci pour ton code mais je n'arrive pas a le faire fonctionner , je l'ai mis dans "thisWorkbook" mais je n'ai pas de réaction sur ma feuille NINF , j'ai du louper quelque chose ,je ne suis pas trop expérimenté en VBA.
    En prenant en comptant la modif d'Alex020181.
    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
    Option Explicit
    Private Sub Worksheet_Change(ByVal target As Range)
    Dim xlwbs As Worksheet, xlwbs1 As Worksheet
    Dim rng As Range, cell As Range
    Dim intersection As Range
    Dim Lmax As Integer, Lmax1 As Integer
     
    Set xlwbs = ThisWorkbook.Worksheets("NINF")
    Set xlwbs1 = ThisWorkbook.Worksheets("UF")
     
    Lmax = xlwbs.Cells(Rows.Count, 1).End(xlUp).Row
    Lmax1 = xlwbs1.Cells(Rows.Count, 1).End(xlUp).Row
     
    Set rng = xlwbs.Range(Cells(4, 2), Cells(Lmax, 2))
    Set intersection = Intersect(target, rng)
     
    Application.EnableEvents = False
    If Not intersection Is Nothing Then
        rng.Offset(, 1) = Application.WorksheetFunction.IfError(Application.WorksheetFunction.VLookup(rng, xlwbs1.Range("A2:B" & Lmax1), 2, False), "")
    End If
    Application.EnableEvents = True
    End Sub

  8. #8
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Réunion

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2022
    Messages : 6
    Par défaut
    Effectivement , en mettant le code au bon endroit ça marche beaucoup mieux .;
    merci Hyperion13.

    je peux passer en Résolu , sachant que les 2 propositions fonctionne a merveille .
    Merci a vous 2.

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

Discussions similaires

  1. [XL-2016] Erreur avec VLOOKUP
    Par Eric26 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 28/05/2018, 22h11
  2. Gestion erreur avec vlookup vba
    Par Cyril031 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/04/2017, 11h05
  3. Erreur avec vlookup dans VBA
    Par jasonpolakow dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/10/2012, 21h10
  4. [XL-2007] Erreur 424 avec VLOOKUP
    Par Duddy dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/08/2009, 12h14
  5. pas d'erreur N/A avec Vlookup
    Par doli100 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/10/2007, 17h54

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