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 en VBA avec index differé [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
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 38
    Par défaut RECHERCHEV en VBA avec index differé
    Bonjour,

    je souhaite faire une sorte de recherche verticale avec (comme exemple) ces deux tableaux :

    3
    4
    6
    8
    9


    et

    1 200
    2 250
    3 546
    4 948
    5 145
    6 784
    7 15
    8 100
    9 741
    10 365

    Donc rechercher où les valeurs du premier tableau se trouvent, et une fois qu'il les a trouvés, me donner le nombre correspondant de la deuxième colonne.

    Donc je voudrais avec VBA obtenir une nouvelle colonne (en position E dans le tableur par exemple) qui aurait comme données :
    546
    948
    784
    100
    741

    Il faut prendre en compte que lorsque j'applique cette méthode, le nombre de lignes peut varier (je voudrais l'automatiser pour le faire tous les mois sur différentes colonnes).
    Il faut donc parcourir la colonne en entier et non pas sur une plage précise.

    J'ai essayé avec une méthode comme celle-ci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub recherche()
        Dim C As Range, I As Long
        For Each C In Range([A1], Cells(Rows.Count, 1).End(xlUp))
            For I = 1 To Cells(Rows.Count, 2).End(xlUp).Row
                If Cells(I, 2) = C.Value Then
                Cells(C, 5).Value = Cells(I, 3).Value
                End If
            Next I
        Next C
    End Sub
    Mais ça me met "incompatibilité de type" et me surligne la ligne avec "Cells(C, 5).Value = Cells(I, 3).Value". Je tourne en rond depuis tout à l'heure
    J'ai essayé avec ou sans les value, rien à faire, je ne sais pas d'où ça vient...

    Si quelqu'un a une idée, peut-il m'éclairer?

    Merci beaucoup pour votre temps!

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 177
    Par défaut
    Bonsoir

    Essaie plutot comme ceci (erreur dans la formulation des cellules)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub recherche()
        Dim C As Range, I As Long
        For Each C In Range([A1], Cells(Rows.Count, 1).End(xlUp))
            For I = 1 To Cells(Rows.Count, 2).End(xlUp).Row
                If Cells(I, 2) = C.Value Then
                Cells(I, 5).Value = Cells(I, 3).Value
                End If
            Next I
        Next C
        End Sub

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Essai ceci en adaptant :
    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
    26
    27
    28
    29
    30
    31
    32
    Sub recherche()
     
        Dim Plage As Range
        Dim PlgValeur As Range
        Dim Cel As Range
        Dim Valeur As Integer
        Dim I As Integer
     
        With Worksheets("Feuil1")
     
            Set Plage = .Range(.Cells(1, 2), .Cells(.Rows.Count, 3).End(xlUp))
            Set PlgValeur = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
        End With
     
        For Each Cel In PlgValeur
     
            'gère l'erreur de la non correspondance pour la fonction "VLookup"
            On Error Resume Next
            Valeur = Application.WorksheetFunction.VLookup(Cel.Value, Plage, 2, False)
     
            'si pas d'erreur inscrit la valeur correspondante en colonne D
            If Err.Number = 0 Then
     
                I = I + 1
                Cells(I, 4).Value = Valeur
     
            End If
     
        Next Cel
     
    End Sub
    Hervé.

    Oups, j'ai oublié les commentaires pour savoir où sont les plages :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Sub recherche()
     
        Dim Plage As Range
        Dim PlgValeur As Range
        Dim Cel As Range
        Dim Valeur As Integer
        Dim I As Integer
     
        With Worksheets("Feuil1") '<--adapter le nom de la feuille...
     
            'matrice en colonnes B et C
            Set Plage = .Range(.Cells(1, 2), .Cells(.Rows.Count, 3).End(xlUp))
     
            'plage des valeurs à chercher en colonne A
            Set PlgValeur = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
        End With
     
        For Each Cel In PlgValeur
     
            'gère l'erreur de la non correspondance pour la fonction "VLookup" qui retourne la valeur de la colonne C
            On Error Resume Next
            Valeur = Application.WorksheetFunction.VLookup(Cel.Value, Plage, 2, False)
     
            'si pas d'erreur inscrit la valeur correspondante en colonne D
            If Err.Number = 0 Then
     
                I = I + 1
                Cells(I, 4).Value = Valeur
     
            End If
     
        Next Cel
     
    End Sub
    Hervé.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 38
    Par défaut
    Merci à vous pour vos réponses.

    ips02 : Le soucis c'est que les valeurs s'affichent au mauvais endroit, je souhaiterais qu'elles s'affichent en face des numéros de la première colonne. Et en appliquant ta méthode, elles s'affichent en face des numéros de la seconde colonne. C'est justement de différer l'index qui est difficile dans ce code.

    Ca donnerait :

    3 1 200 546
    4 2 250 948
    6 3 546 784
    8 4 948 100
    9 5 145 741
    6 784
    7 15
    8 100
    9 741
    10 365

    Theze : Ta méthode semble presque marcher, mais lorsque je le lance, il ne m'affiche que la première valeur. (le 546 dans l'exemple)
    Pourtant tu as bien incrémenté ta boucle, c'est bizarre. Dans ma vraie table, j'ai des doublons. (Mais il faut que je les garde.) Ça vient pas de là?

    Merci pour votre aide en tous cas c'est super!

    Après quelques tests, j'ai pu remarquer que lorsque le code de Theze ne trouvait pas de valeur avec la recherche, il ne sautait pas la ligne.

    Voici le résultat avec des valeurs qui ne sont pas dans le tableau :

    3	1	200	546
    10	2	250	365
    6	3	546	784
    8	4	948	100
    9	5	145	741
    12	6	784	145
    14	7	15	
    5	8	100	
    	9	741	
    	10	365	
    Alors qu'il faudrait :

    3	1	200	546
    10	2	250	365
    6	3	546	784
    8	4	948	100
    9	5	145	741
    12	6	784	
    14	7	15	
    5	8	100	145
    	9	741	
    	10	365	
    Une petite idée?

    Merci beaucoup! Je sens qu'on est proche!

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    en fait tu aura plus de chance d'avoir des réponse a coté

    en effet ta question est un peu vague

    Questions
    ou tu prend ton 1er tableau 3.4.6.8.9?
    ou tu prend ton 2 Emme tableau ?

    ou tu veux que les correspondante doivent atterrir (exacte si possible)

    déjà répond correctement a ca et on verra si on peut faire quelque chose de correcte
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 177
    Par défaut
    Bonsoir

    Et si tu essaies de cette manière? (Avec les réponses en colonne "E")et dans la mesure où il n'y a pas de vide entre les cellules de la colonne "A"

    Cordialement
    Lps02

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub recherche()
        Dim I As Long, n As Long
        n = 1
        While Range("A" & n).Value <> ""
            For I = 1 To Cells(Rows.Count, 2).End(xlUp).Row
                If Cells(I, 2) = Range("A" & n).Value Then
                Range("E" & n).Value = Cells(I, 3).Value
                End If
            Next I
       n = n + 1
       Wend
    End Sub

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

Discussions similaires

  1. Mise en place fonction Min avec Index VBA
    Par LorenzoN dans le forum Excel
    Réponses: 2
    Dernier message: 01/11/2014, 12h22
  2. Problème recherchev à 2 condition avec index matriciel
    Par Kestion100 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/09/2014, 12h02
  3. Equivalent recherchev, sous vba, entre deux fichiers et avec plusieurs critères
    Par Gallinettechouette dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 29/07/2013, 13h01
  4. [XL-2007] Recherchev() avec index() et equiv()
    Par AgriPhilou dans le forum Excel
    Réponses: 24
    Dernier message: 13/02/2011, 13h59
  5. Traitement des tableaux de word avec VBA: balise index
    Par Invité dans le forum VBA Word
    Réponses: 20
    Dernier message: 29/11/2005, 15h39

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