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 vlookup plage variable


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 9
    Par défaut vba vlookup plage variable
    Bonjour à tous !

    J'avais fait une macro qui fonctionnais très bien, et j'ai remplacé ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    x = Application.VLookup(Range("E" & I & ""), Workbooks(A).Sheets(B).Range("E2:AJ" & ligne2 & ""), 32, False)
    par celui-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    x = Application.VLookup(Cells(I,col1).Value, Workbooks(A).Sheets(B).Range(Cells(2, col1), Cells(ligne2, col2)), col1 - col2 + 1, False)
    avec col1, col2, ligne1 définies juste avant

    et la j'obtient une erreur 438 me disant que l'objet ne supporte pas la propriété ou la méthode ... seulement je ne comprend pas trop d'ou ca peut venir!


    Merci d'avance pour vos suggestions !

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

    Au lieu de :

    Essai :

    Testes aussi le résultat de :


  3. #3
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 9
    Par défaut
    Alors j'ai testé 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
     
    Dim x As Variant
    Dim val As Variant
     
    For I = 2 To ligne2    
     
        val = Workbooks(X).Sheets(Y).Cells(I, col1).Value
        x = Application.WorksheetFunction.VLookup(val, Workbooks(A).Sheets(B).Range(Cells(2, col1), Cells(ligne2, col2)), 32, False)
     
        If Not Application.IsError(x) Then
            Cells(I, col2).Value = x    
        End If
     
    Next I
    avec X le nom du classeur actif, et Y le nom de la feuille active.


    Et toujours rien qui marche , ça coince à la ligne du VLookup ....


    Et sinon, on reprenant ma syntaxe initiale, j'ai modifié un paramètre apres l'autre, et apparemment l'erreur viendrai de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Workbooks(A).Sheets(B).Range(Cells(2, col1), Cells(ligne2, col2))
    que j'ai mis à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("E2:AJ" & ligne2 & "")
    dans le VLookup

  4. #4
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    Bonjour,


    J'ai testé hier et je trouve bien une plage (tous les indices doivent être différents de 0)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(Cells(2, col1), Cells(ligne2, col2))

    A l'aide du déboguueur ou avec des selects vérifies que ton code fonctionne :

    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
    Workbooks(A).select
    Workbooks(A).Sheets(B).select
    msgbox col1 ligne2 col2 
    Workbooks(A).Sheets(B).Range(Cells(2, col1), Cells(ligne2, col2)).select
     
    ' Tu peux aussi instancier :
    Dim col1 As Integer, col2 As Integer
    Dim ligne2 As Long
    Dim Maplage as range
     
    col1 = 8
    col2 = 8
    ligne2 = 5
     
    set Maplage = Workbooks(A).Sheets(B).Range(Cells(2, col1), Cells(ligne2, col2))
     
    msgbox maplage.address

    Edit: j'ai la bonne plage mais le vlookup ne passe pas non plus chez moi, je teste et je reviens vers toi.

    Edit2 : Attention Val est une fonction excel !!!

    Edit3 : un lien ici

    Edit4 : Apparemment cette fonction est assez délicate et plusieurs raisons peuvent entrainer des erreurs : plage de 1 seule colonne, index supérieur au nombre de colonne ...
    Mon code fonction maintenant, par macro il me semble plus interessant d'utiliser Find que de faire des recherchev, bon quoiq'il en soit une aide :

    VLookup( value, table_array, index_number, not_exact_match )

    value is the value to search for in the first column of the table_array.

    table_array is two or more columns of data that is sorted in ascending order.

    index_number is the column number in table_array from which the matching value must be returned. The first column is 1.

    not_exact_match determines if you are looking for an exact match based on value. Enter FALSE to find an exact match. Enter TRUE to find an approximate match, which means that if an exact match if not found, then the VLookup function will look for the next largest value that is less than value.



    Note:

    If index_number is less than 1, the VLookup function will return #VALUE!.

    If index_number is greater than the number of columns in table_array, the VLookup function will return #REF!.

    If you enter FALSE for the not_exact_match parameter and no exact match is found, then the VLookup function will return #N/A.

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 9
    Par défaut
    C'est vrai que la fonction VLookup est assez capricieuse au niveau de la syntaxe, et pourtant avant de vouloir remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Workbooks(A).Sheets(B).Range("E2:AJ" & ligne2 & "")
    tout marchait tres bien ...

    J'ai fait les tests que tu m'as indiqué aalex38 et chaque variable a les bonnes valeurs

    J'ai tenté ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim val_maj1 As Variant
    Dim plage1 As Range
     
    Set plage1 = Workbooks(A).Sheets(B).Range(Cells(I, 5), Cells(5000, 36))
    val_maj1 = Application.VLookup(Cells(I, 5), plage1, 32, False)
    et ca ne marche pas , par contre en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Workbooks(A).Sheets(B).Activate
     
    Set plage1 = Range(Cells(I, 5), Cells(5000, 36))
     
    Workbooks(X).Sheets(Y).Activate
     
    val_maj1 = Application.VLookup(Cells(I, 5), plage1, 32, False)
    la ca marche! (X est le classeur dans lequel je fais la mise a jour, et A le classeur à partir duquel je fais la mise à jour)

    mais je ne comprend pas pourquoi c'est necessaire de rendre le classeur actif ?!

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 317
    Par défaut
    Bonjour,

    lorsque tu fais référence à un classeur, et/ou à un onglet autre, il faut bien référencer toutes les cellules (.Range, .Cells)

    essaie ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim x As Variant
    Dim valeur As Variant
     
    For I = 2 To ligne2
     
        valeur = Workbooks(x).Sheets(Y).Cells(I, col1).Value
        With Workbooks(A).Sheets(B)
            x = Application.WorksheetFunction.VLookup(valeur, .Range(.Cells(2, col1), .Cells(ligne2, col2)), 32, False)
        End With
        If Not Application.IsError(x) Then
            Cells(I, col2).Value = x
        End If
     
    Next I

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

Discussions similaires

  1. [XL-2007] Étendre une formule à l'aide de VBA sur une plage variable
    Par cyril7751 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 24/07/2012, 16h23
  2. VBA - Graphique avec plage variable
    Par virstyle dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/06/2010, 11h48
  3. [VBA-E] COUNTIF sur une sélection de plage variable
    Par NiKoS29 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 27/09/2007, 23h03
  4. [VBA-E] Macro Pour Faire un Tri sur plage variable
    Par tabarly35 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/09/2006, 19h02
  5. [VBA excel] une variable pour 2 classeurs
    Par totoche dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/01/2006, 09h42

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