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 :

RECHERCHEV (VLookup) [XL-2010]


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
    agent de maîtise
    Inscrit en
    Décembre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : agent de maîtise
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 23
    Par défaut RECHERCHEV (VLookup)
    Bonjour à tous!!

    j'ai un soucis dans l'execution de mon code, pourriez-vous y jeter un oeil s'il vous plaît


    ci dessous mon code sur lequel l'éxécution plante mon fichier

    En vous remerciant d'avance

    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
    Sub ZPMQ1()
    Dim oRng As Excel.Range
    Dim v As Variant, lng As Long, ligFin As Variant
     
    ligFin = Sheets("ZPMQ").Cells(Rows.Count, 1).End(xlUp).Row
     
    Range("G2:G" & ligFin).ClearContents
     
    Set oRng = ThisWorkbook.Worksheets("ZPMQ").Range("A2:P" & ligFin)
     
    v = oRng.Value
    For lng = 2 To UBound(v, 1)
     
        If v(lng, 2) <> "" Then v(lng, 7) = Application.VLookup(v(lng, 2), oRng, 9, False) Else
        If v(lng, 2) = "" Then v(lng, 7) = ""
    Next lng
     
    oRng.Value = v
    Set oRng = Nothing
    v = Empty
     
    End Sub

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 258
    Par défaut
    il faudrait que l'on sache
    1-Ce que tu souhaites au final (je n'ai pas bien compris l'objectif du Vlookup
    2-où ca plante
    3-le message d'erreur associé

    mais il me semble qu'en ligne 11 tu demandes la valeur d'une plage de cellule

    en fait je pense que tu passes par le nommage d'une plage v qui est inutile

    Tu travailles sur une partie du tableau qui va de A2 à P" & ligFin
    donc ne t'embetes pas et travailles avec des vaiables simples dans une boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i = 2 to ligfin 'i désigne la ligne
          if cells(i, 2) <>"" then
                        .....
          end if
    next

  3. #3
    Membre averti
    Homme Profil pro
    agent de maîtise
    Inscrit en
    Décembre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : agent de maîtise
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 23
    Par défaut
    Bonjour COCONUT2,

    et merci de prendre du temps pour résoudre mon soucis

    mon souhait est de :

    1 / est de faire une recherchev si les cellules de la colonne B ne sont pas vide

    si B2<>"" recherchev(G2, A : P, 9, faux) (sachant que mon tableau est de plus de 100 000 lignes et qu'il est amené à grandir

    2/ si B2="" alors G2=""

    J'ai pris en compte ta proposition mais l'éxécution est très longue....

    Ci dessous le code modifié en prenant compte de ta proposition

    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
    Sub ZPMQ1()
    Dim oRng As Excel.Range
    Dim ligFin As Variant, I As Variant, cell As Range
     
    ligFin = Sheets("ZPMQ").Cells(Rows.Count, 1).End(xlUp).Row
     
    Range("G2:G" & ligFin).ClearContents
     
    Set oRng = ThisWorkbook.Worksheets("ZPMQ").Range("A2:P" & ligFin)
     
    For I = 2 To ligFin
     
        If Cells(I, 2).Value <> "" Then Cells(I, 7).Value = Application.VLookup(Cells(I, 2).Value, Range("A2:I" & ligFin), 9, False) Else
        If Cells(I, 2).Value = "" Then Cells(I, 7).Value = ""
    Next
     
    End Sub
    ma macro prend toujours énormément de temps d'éxécution...

    Pourriez vous y jeter un oeil?

    En vous remerciant d'avance

  4. #4
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    En tout cas, avec ta manie de "paqueter" des if sur une seule ligne, il manque tout ce qu'il y a entre un certain Else et un End if.

    Que tu fasses des recherches à répétition, ce n'est pas surprenant que cela prenne du temps.

    VBA est un langage interprété et devoir redéfinir les paramètres de recherche et refaire la recherche à chaque fois, cela demande du temps.

    La réponse "classique" à un problème de lenteur c'est :

    Dans les premières lignes de la macro:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    application.screenupdating = false
    Pour éviter les mauvaises surprises:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    application.screenupdating = true
    Avant de terminer la macro. Évidemment, cela veut dire que l'on ne voit rien de ce qui se passe à l'écran.

    L'autre solution, c'est de ne pas avoir de macro "universelle" qui va tout faire à elle seule, et ne pas faire de recherche dans les endroits où il ne faut pas faire de recherche.

  5. #5
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonsoir,

    une autre façon de faire en passant par une variable tableau, je n'ai pas le temps de tester mais le principe est là, il suffira de mettre les bons éléments des tableaux si je me suis trompé
    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
    Sub ZPMQ1()
    Dim oRng, orngCh, orngTr
    Dim ligFin As Long, x As Long, y As Long
    With Sheets("ZPMQ")
      ligFin = .Cells(.Rows.Count, 1).End(xlUp).Row
      .Range("G2:G" & ligFin).ClearContents
      oRng = .Range("A2:P" & ligFin)
      orngCh = .Range("B2:B" & ligFin)
      orngTr = .Range("I2:I" & ligFin)
     
      For x = 1 To UBound(orngCh)
        If orngCh(x, 1) <> "" Then
          For y = 1 To UBound(orngTr)
            If orngTr(y, 1) = orngCh(x, 1) Then oRng(x, 2) = oRng(x, 9)
          Next y
        End If
      Next x
      .Range("A2:P" & ligFin).ClearContents
      .Range("A2").Resize(UBound(oRng, 1), UBound(oRng, 2)) = oRng
    End With
     
    End Sub
    Si c'est bon, il reste à regarder le temps passé
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  6. #6
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Après quelques vérif et bien sur, si j'ai compris, je préfère cette solution
    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
    Dim oRngRs, orngCh, orngTr
    Dim ligFin As Long, x As Long, y As Long
    With Sheets("ZPMQ")
      ligFin = .Cells(.Rows.Count, 1).End(xlUp).Row
      .Range("G2:G" & ligFin).ClearContents
      orngCh = .Range("B2:B" & ligFin)
      orngTr = .Range("I2:I" & ligFin)
      oRngRs = .Range("G2:G" & ligFin)
     
      For x = 1 To UBound(orngCh)
        If orngCh(x, 1) <> "" Then
          For y = 1 To UBound(orngTr)
            If orngTr(y, 1) = orngCh(x, 1) Then oRngRs(x, 1) = orngTr(y, 1)
          Next y
        End If
      Next x
      .Range("G2:G" & ligFin).ClearContents
      .Range("G2").Resize(UBound(oRngRs, 1)) = oRngRs
    End With
     
    End Sub
    EDIT :
    Dans la même démarche, mais plus logique (à mon sens)
    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
    Dim oRngRs(), orngCh, orngTr
    Dim ligFin As Long, x As Long, y As Long
    With Sheets("ZPMQ")
      ligFin = .Cells(.Rows.Count, 1).End(xlUp).Row
      orngCh = .Range("B2:B" & ligFin)
      orngTr = .Range("I2:I" & ligFin)
      ReDim oRngRs(1 To ligFin - 1)
      For x = 1 To UBound(orngCh)
        If orngCh(x, 1) <> "" Then
          For y = 1 To UBound(orngTr)
            If orngTr(y, 1) = orngCh(x, 1) Then oRngRs(x) = orngTr(y, 1)
          Next y
        End If
      Next x
      .Range("G2").Resize(UBound(oRngRs, 1)) = Application.Transpose(oRngRs)
    End With
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  7. #7
    Membre averti
    Homme Profil pro
    agent de maîtise
    Inscrit en
    Décembre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : agent de maîtise
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 23
    Par défaut
    Bonjour,

    Je tiens à tous vous remercier pour votre contribution

    ET grâce à votre savoir faire j'ai pu résoudre mon petit soucis!!!


    Encore Merci d'avoir pris du temps pour moi!!!!


    Bien cordialement et à bientôt

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

Discussions similaires

  1. [XL-2002] RECHERCHEV (VLOOKUP) et plan comptable
    Par bleuerouge dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/05/2014, 16h59
  2. Ajouter un SIERREUR a mon code VBA rechercheV (VLOOKUP)
    Par mogo107 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/06/2013, 08h04
  3. [XL-MAC 2011] Recherchev (vlookup) et caractère *
    Par ryu95 dans le forum Excel
    Réponses: 3
    Dernier message: 04/05/2013, 02h52
  4. [XL-2007] recherchev (vlookup) dans une autre sheet
    Par assiec dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 14/12/2011, 11h35
  5. VLookup (ou RechercheV mais en VBA)
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/06/2008, 06h40

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