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 :

Faire un Vlookup dans une macro et le répéter [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 123
    Par défaut Faire un Vlookup dans une macro et le répéter
    "Bonjour"
    Voici ma recherche : Comment faire pour créer un vlookup qui sera ensuite répéter avec un intervalle de 5 fois sur la même ligne, puis je descends de 6 cellules et je recommence la même opération.
    Exemple. La macro commence en A1 puis va en C1, E1,G1,I1 puis descend sur la ligne 6 et recommence. A6-C6-E6-G6-I6; le tous répété 45 fois.
    Les valeurs sont recherchés dans le même classeur mais pas sur la même feuille.
    J'essaye avec ce code mais cela bloque sur la dernière ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ' Décalage des colonnes pour les composants
    If Range(Cells(A2, 4), Cells(A2, 4)).Value = 0 Then Range(Cells(A2 + 2, 4), Cells(A2 + 2, 4)).Value = "" _
        Else
        Range("D6") = _
            WorksheetFunction.VLookup(Range("D4"), Sheets("BASECOMPOSANTS").Range("a1:a1000"), 2, False)
    "Merci"

  2. #2
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Bonjour,

    Ci dessous une idée pour la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim i As Integer
     
    i = 1
     
    For i = 1 To 45
        Range("D" & i * 6) = _
            WorksheetFunction.VLookup(Range("D" & i * 6).Offset(-2, 0), Sheets("BASECOMPOSANTS").Range("a1:b1000"), 2, False)
    Next i

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 123
    Par défaut
    Merci pour la réponse, mais malheureusement le code bloque aussi lorsqu'il arrive sur la constante de la formule.

  4. #4
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    Ta plage doit comporter à minima deux colonnes de données.
    Si tu souhaites que la valeur de la deuxième colonne soit renvoyée, la formule devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("D6") = WorksheetFunction.VLookup(Range("D4"), sheets("BASECOMPOSANTS").Range("A1:B1000"), 2, False)
    Cordialement.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 123
    Par défaut
    ça ne fonctionne pas non plus. Voici tous le code de la macro ou j'essaie.

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    Sub Produit()
     
    Dim A1
    Dim A2
    Dim A3
    Dim A4
     
    'Calcul du nombre de ligne à traiter dans la feuille 'base'
    'Do while
    'offset (1,0)
    'Loop
     
     
     
     
    Dim Produit_1
    Dim nvlle_destination1
    Dim nvlle_destination2
    Dim nvlle_destination3
    Dim nvlle_destination4
    Dim nvlle_destination5
    Dim nvlle_destination6
    Dim nvlle_destination7
    Dim nvlle_destination8
    Dim nvlle_destination9
    Dim nvlle_destination10
    Dim nvlle_destination11
    Dim format
     
    A2 = 4
    A3 = 1
     
    For A1 = 1 To 345 ' Le chiffre 45 sert à faire la boucle pour tout les tableaux
     
    Sheets("DEMANDE").Select
     
    Range(Cells(A2, 3), Cells(A2, 3)).Select ' Correspond à la cellule ("C4")
    Produit_1 = Range(Cells(A2, 3), Cells(A2, 3)).Value ' Détermine la valeur de ("C4")
     
     
        For Each C In Sheets("base").Range("A1:A1000") ' Recherche les composants dans la feuille ("base")
        If Produit_1 = C.Value Then ' Valeur de l'item recherché en ("C4")
        nvlle_destination1 = C.Offset(0, 1).Value ' Choisit le premier composant dans la feuille ("base")
        nvlle_destination2 = C.Offset(0, 2).Value ' Choisit le deuxième composant dans la feuille ("base")
        nvlle_destination3 = C.Offset(0, 3).Value ' Choisit le troisième composant dans la feuille ("base")
        nvlle_destination4 = C.Offset(0, 4).Value
        nvlle_destination5 = C.Offset(0, 5).Value
        nvlle_destination6 = C.Offset(0, 6).Value
        nvlle_destination7 = C.Offset(0, 7).Value
        nvlle_destination8 = C.Offset(0, 8).Value
        nvlle_destination9 = C.Offset(0, 9).Value
        nvlle_destination10 = C.Offset(0, 10).Value
        nvlle_destination11 = C.Offset(0, 11).Value
        format = C.Offset(0, 13).Value ' Choisit le format dans la feuille ("base")
     
        ActiveCell.Offset(0, 1).Value = nvlle_destination1 ' Renvoi la valeur du premier composant dans la feuille ("demande")
        ActiveCell.Offset(0, 2).Value = nvlle_destination2 ' Renvoi la valeur du deuxième composant dans la feuille ("demande")
        ActiveCell.Offset(0, 3).Value = nvlle_destination3 ' Renvoi la valeur du troisième composant dans la feuille ("demande")
        ActiveCell.Offset(0, 4).Value = nvlle_destination4
        ActiveCell.Offset(0, 5).Value = nvlle_destination5
        ActiveCell.Offset(0, 6).Value = nvlle_destination6
        ActiveCell.Offset(0, 7).Value = nvlle_destination7
        ActiveCell.Offset(0, 8).Value = nvlle_destination8
        ActiveCell.Offset(0, 9).Value = nvlle_destination9
        ActiveCell.Offset(0, 10).Value = nvlle_destination10
        ActiveCell.Offset(0, 11).Value = nvlle_destination11
        ActiveCell.Offset(3, -1).Value = format ' Renvoi la valeur du format dans la feuille ("demande")
        GoTo suite ' Sortir de la boucle
        End If
        Next
    suite:
     
    Dim i As Integer
     
    i = 1
     
    For i = 1 To 3
     
    Range("D6") = WorksheetFunction.VLookup(Range("D4"), Sheets("BASECOMPOSANTS").Range("*_A1:B1000_*"), 2, False)
     
    Next i
     
     
    A2 = A2 + 6 ' Décalage entre chaque tableau de la feuille ("demande")
     
    Next
     
     
     
    End Sub

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour
    Si j'ai bien compris
    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
    36
    37
    38
    39
    40
    41
    42
    Sub Produit()
    Dim Comp As String, Fami As String
    Dim i As Integer
    Dim c As Range
     
    Application.ScreenUpdating = False
    With Worksheets("DEMANDE")
        For i = 4 To 345 Step 6                      'On boucle sur les cellules C de page demande à partir de C4 avec un pas de 6
            Comp = .Range("C" & i)                   'Dans Comp, on mémorise le nom du produit
            If Comp <> "" Then                       'Si comp n'est pas vide
                Set c = Worksheets("base").Range("A:A").Find(Comp, LookIn:=xlValues, lookat:=xlWhole)    ' On recherche les composants dans la colonne A feuille ("base")
                'Si on trouve le produit
                If Not c Is Nothing Then
                    'on rapporte les données à partir de Base vers les cellules correspondantes dans DEMANDE
                    .Range("D" & i & ":N" & i).Value = c.Offset(0, 1).Resize(1, 11).Value
                    .Range("B" & i + 3).Value = c.Offset(0, 13).Value
                    'Dans Fami, on mémorise la famille composant D4, D10....
                    Fami = .Range("D" & i).Value
                    'Si fami est non vide
                    If Fami <> "" Then
                        'on cherche dans BASECOMPOSANTS Fami
                        Set c = Worksheets("BASECOMPOSANTS").Range("A:A").Find(Fami, LookIn:=xlValues, lookat:=xlWhole)
                        'Si on le trouve
                        If Not c Is Nothing Then
                            'On rapporte la donnée en D6, D10....
                            .Range("D" & i + 2).Value = c.Offset(0, 1)
                            'On vide la variable objet c
                            Set c = Nothing
                        Else
                            .Range("D" & i + 2) = ""
                        End If
                    End If
                Else
                    'on vide les cellules si on ne trouve pas de produit
                    .Range("D" & i & ":N" & i).Value = ""
                    .Range("B" & i + 3).Value = ""
                    .Range("D" & i + 2) = ""
                End If
            End If
        Next i
    End With
    End Sub

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

Discussions similaires

  1. [XL-2010] Formule Vlookup dans une macro
    Par Oorreelly dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/08/2012, 16h05
  2. Faire un choix dans une macro
    Par 22011988 dans le forum Macro
    Réponses: 1
    Dernier message: 20/04/2012, 08h51
  3. Comment faire un IN dans une macro
    Par baime dans le forum Macro
    Réponses: 3
    Dernier message: 17/02/2012, 12h41
  4. Faire une boucle dans une macro
    Par dev_grou dans le forum Macro
    Réponses: 5
    Dernier message: 09/04/2010, 17h48
  5. J'ai besoin faire un compteur dans une macro Excel
    Par sergio_gr66 dans le forum Macros et VBA Excel
    Réponses: 25
    Dernier message: 11/06/2009, 17h25

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