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 :

Fonction lookup en VBA [XL-2003]


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
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2012
    Messages : 7
    Par défaut Fonction lookup en VBA
    Bonjour,

    Je suis allé faire un tour dans le tuto de Pierre Fauconnier mais je n'ai pas trouvé de solution...

    Donc voilà, actuellement je dispose de plusieurs feuilles de données (deux colonnes, la 1er Date et la 2eme Hauteur d'eau) ne débutant pas à la même date et ayant des lacunes. Je souhaite tout regrouper (copier) par colonne sur une seule feuille qui débute au 1er janv et finit au 31 déc au pas de temps de 30 min.
    J'ai bidouillé une petite macro avec la fonction lookup, mais elle fonctionne que pour la 1er feuille de données car je ne sais pas comment passer d'une formule que l'on insère dans une cellule à une formule plus global qui fonctionne sur VBA.

    Voici ma base:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim Nbre_Valeurs As Double
     
    Nbre_Valeurs = ((Cells(1, 3) - Cells(3, 1)) * 48) + 3 'Déterminer le nombre de données à renseigner
     
    For Ligne = 3 To Nbre_Valeurs
         Cells(Ligne, 2).Value = "=LOOKUP(RC[-1],AGAT57!R2C1:R32000C1,AGAT57!R2C2:R32000C2)"
    Next Ligne

    Donc tout d'abord, la fonction Application.WorksheetFunction.Lookup fonctionne tel sur le le même principe que celle sous excel, c'est-à-dire (valeur recherché, plage de donnée, colonne où le résultat se trouve)?

    Actuellement ce que je suis en train de faire est de remplacer AGAT57 (nom d'une feuille) par Nom_piezo comme variable déclaré en tant que Worksheet... mais je bloque car rien ne marche...

    Un petit coup de main n'est vraiment pas de refus...

    Merci d'avance

    J'ai joint mon fichier de données si mes indications de format de fichier ne sont pas claires.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éprouvé
    Homme Profil pro
    Consultant comptable
    Inscrit en
    Mai 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant comptable

    Informations forums :
    Inscription : Mai 2011
    Messages : 137
    Par défaut
    La réponse à ta question est oui elle fonctionne de la même manière par contre tu dois la stocker dans une variable
    du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    variable = application.worksheetfunction.vlookup(....)
    attention de la même façon s'il ne trouve pas de donnée il crée une erreur

  3. #3
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2012
    Messages : 7
    Par défaut
    J'ai essayer simple avec :

    Dim Variable As Double

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For Ligne = 3 To Nbre_Valeurs
         Variable = Application.WorksheetFunction.VLookup(Cells(Ligne, 1), Range(Cells(3, 8), Cells(3200, 9)), Range(Cells(3, 9), Cells(3200, 9)))
         Cells(Ligne, 1) = Variable
    Next Ligne
    Mais ca ne fonctionne pas...

  4. #4
    Membre éprouvé
    Homme Profil pro
    Consultant comptable
    Inscrit en
    Mai 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant comptable

    Informations forums :
    Inscription : Mai 2011
    Messages : 137
    Par défaut
    quel est l'erreur ?
    Car la je n'ai pas tout je ne sais pas comment tu aliment Nbre_valeurs
    dim en double est-ce suffisant ?

    de plus j'ai fait un recherchev donc la dernière partie c'est le décalage de colonne...

  5. #5
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2012
    Messages : 7
    Par défaut
    Une erreur... facon de dire... la macro bloque sur la ligne de la fonction VLookup avec "Impossible de lire la propriété VLookup de la classe WorksheetFonction".

    Nbre_Valeurs correspond à 17523 données (renseigné par un petit calcul au début de la macro, cf ci-dessous cette fois).
    Double car je pensais que ca irait, en effet la valeur que peut prendre Variable est un nombre positif à 3 chiffres et quelques décimales...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim Variable As Double
    Dim Nbre_Valeurs As Double
     
    Nbre_Valeurs = ((Cells(1, 3) - Cells(3, 1)) * 48) + 3 'Déterminer le nombre de données à renseigner
     
    For Ligne = 3 To Nbre_Valeurs
         Variable = Application.WorksheetFunction.VLookup(Cells(Ligne, 1), Range(Cells(3, 8), Cells(3200, 9)), Range(Cells(3, 9), Cells(3200, 9)))
         Cells(Ligne, 1) = Variable
    Next Ligne
    Pour la dernière partie de rechercheV, le "décalage" est la colonne suivante donc je devrais mettre 1 à la place de "Range(Cells(3, 9), Cells(3200, 9))"?

  6. #6
    Membre éprouvé
    Homme Profil pro
    Consultant comptable
    Inscrit en
    Mai 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant comptable

    Informations forums :
    Inscription : Mai 2011
    Messages : 137
    Par défaut
    Ben dans ton exemple ce serait plutot 2, puisqu'il s'agit de la colonne suivante.

  7. #7
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2012
    Messages : 7
    Par défaut
    Je viens d'essayer, j'ai toujours "Impossible de lire la propriété VLookup de la classe WorksheetFonction"

    avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim Variable As Double
    Dim Nbre_Valeurs As Double
     
    Nbre_Valeurs = ((Cells(1, 3) - Cells(3, 1)) * 48) + 3 'Déterminer le nombre de données à renseigner
     
    For Ligne = 3 To Nbre_Valeurs
         Variable = Application.WorksheetFunction.VLookup(Cells(Ligne, 1), Range(Cells(3, 8), Cells(3200, 9)), 2)
         Cells(Ligne, 1) = Variable
    Next Ligne

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 168
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je viens de tester avec certes quelques lignes et une petite plage mais je n'ai pas de message d'erreur.
    Pour la boucle, je n'ai pas utilisé la variable Nbre_Valeurs mais la constante 4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub testVlookUp()
    Dim Variable As Double
    Dim Nbre_Valeurs As Double
    Dim ligne As Long
    ' Nbre_Valeurs = ((Cells(1, 3) - Cells(3, 1)) * 48) + 3 'Déterminer le nombre de données à renseigner
     
    For ligne = 2 To 4
         Variable = Application.WorksheetFunction.VLookup(Cells(ligne, 1), Range(Cells(2, 2), Cells(5, 3)), 2)
         Cells(ligne, 1) = Variable
    Next ligne
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 168
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Le message que tu reçois peut provenir d'une cellule vide.
    Tu n'as pas précisé si le message d'erreur était immédiat, premier élément de la boucle, ou pas
    [RECTIFICATION]
    Ce message provient du fait que la fonction ne trouve pas ce qu'elle cherche, il faut intercepter l'erreur.
    Il faudrait aussi ajouter FALSE comme 4ème argument parce-que j'imagine que la première colonne du tableau de recherche n'est pas triée par ordre croissant et que tu ne cherches pas la valeur la valeur la plus proche.
    Dans le cas contraire, il faudrait prévoir une première ligne avec comme valeur en première colonne 0 ou une valeur négative inférieure à la valeur à chercher en colonne A.

    Bonjour,
    Une proposition de code qui renvoie -9999 si la valeur n'est pas trouvée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub testVlookUp()
    Dim Variable As Double
    Dim Nbre_Valeurs As Double
    Dim ligne As Long
    Nbre_Valeurs = ((Cells(1, 3) - Cells(3, 1)) * 48) + 3 'Déterminer le nombre de données à renseigner
    For ligne = 2 To Nbre_Valeurs
     On Error Resume Next
     Variable = Application.WorksheetFunction.VLookup(Cells(ligne, 1), Range(Cells(2, 2), Cells(6, 3)), 2)
     If Err.Number Then Variable = -9999
     Cells(ligne, 1) = Variable
    Next ligne
    End Sub
    Cette ligne cherche la valeur la plus proche et pour cela, le tableau doit être trié en ordre croissant sur la première colonne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Variable = Application.WorksheetFunction.VLookup(Cells(ligne, 1), Range(Cells(2, 2), Cells(6, 3)), 2)
    S'il faut chercher la valeur exacte, il y a lieu d'ajouter FALSE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Variable = Application.WorksheetFunction.VLookup(Cells(ligne, 1), Range(Cells(2, 2), Cells(6, 3)), 2, FALSE)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  10. #10
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2012
    Messages : 7
    Par défaut
    J'ai uniquement cette version qui fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub testVlookUp()
    Dim Variable As Double
    Dim Nbre_Valeurs As Double
    Dim ligne As Long
    Nbre_Valeurs = ((Cells(1, 3) - Cells(3, 1)) * 48) + 3 'Déterminer le nombre de données à renseigner
    For ligne = 2 To Nbre_Valeurs
     On Error Resume Next
     Variable = Application.WorksheetFunction.VLookup(Cells(ligne, 1), Range(Cells(2, 2), Cells(6, 3)), 2)
     If Err.Number Then Variable = -9999
     Cells(ligne, 1) = Variable
    Next ligne
    End Sub
    Mais très bonne idée pour le -9999, à la fin de la macro je n'aurai cas remplacer cette valeur par une cellule vide ce qui est assez simple pour mon niveau.

    Dans la 1er colonne, les valeurs sont bien en ordre croissant (1er janv. au 31 dec.)

    Par contre, là je suis dans le cas où mes valeurs recherchées sont dans la même feuille de calcul.
    Pour passer à une recherche sur une autre feuille, comment je fais pour renseigner la fonction VLookup? (1er feuil:récolte les données; feuil 2 à X: données à récupérer).

  11. #11
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 168
    Billets dans le blog
    53
    Par défaut
    Bonsoir,
    Pour chercher dans un tableau se trouvant sur une autre feuille que la plage où se trouve les valeurs à chercher, il faut préciser, par exemple, les feuilles par des variables Objet
    Petit exemple : Où la variable objet sht est la feuille contenant la plage des cellules à chercher et shtDb la feuille où se trouve le tableau de recherche.
    Ne sachant pas sur quelle feuille se trouve le nombre de valeurs à chercher, je l'ai mis en remarque mais je ne doute pas que tu pourras t'en sortir avec cet exemple.
    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 testVlookUp()
    Dim Variable As Double, Nbre_Valeurs As Double, ligne As Long
    Dim shtDb As Worksheet, sht As Worksheet
    With ThisWorkbook
     Set sht = .Worksheets("Feuil2"): Set shtDb = .Worksheets("db")
    End With
    ' Nbre_Valeurs = ((Cells(1, 3) - Cells(3, 1)) * 48) + 3 'Déterminer le nombre de données à renseigner
    Nbre_Valeurs = 20
    With shtDb
     For ligne = 2 To Nbre_Valeurs
      On Error Resume Next
      Variable = Application.WorksheetFunction.VLookup(sht.Cells(ligne, 1), .Range(.Cells(2, 2), .Cells(6, 3)), 2)
      If Err.Number Then Variable = -9999: Debug.Print ligne
      sht.Cells(ligne, 1) = Variable
     Next ligne
    End With
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

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

Discussions similaires

  1. [VBA]Fonction 'ajout' en vba sur une table
    Par rico63 dans le forum VBA Access
    Réponses: 15
    Dernier message: 28/03/2007, 16h56
  2. Comment écrire dans une cellule la fonction SUM en vba?
    Par Subkill dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/02/2007, 19h24
  3. Fonction excel en VBA
    Par Gary US dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/12/2006, 17h39
  4. Fonction Yield en VBA sans Automation
    Par laurentcr dans le forum Access
    Réponses: 7
    Dernier message: 02/10/2006, 14h43
  5. Réponses: 1
    Dernier message: 14/10/2005, 15h36

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