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 :

Boucle For each [XL-97]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Dévellopeur amateur access
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dévellopeur amateur access
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Par défaut Boucle For each
    Bonjour à tous,

    Je m'amuse à développer de petites applis pour moi ou mon club de rando.
    Totalement amateur, j'ai besoin de votre aide.

    Voila j'ai 2 feuilles, la 1er nommé "Etat" dans laquelle (colonne B à partir de B4) figure les noms a rechercher dans la 2° feuille nommé "Nom"(entre C2 et C80)
    Ma fonction fonctionne correctement pour la 1er ligne. soit: Sheets("Etat").Range("b4"), mais ne "passe pas si je puis dire à la 2° ligne (c4).

    Merci de bien vouloir trouver mon ou mes erreurs et si possible avec une explication

    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
    Set Plage = Sheets("Nom").Range("c2:c80")
    Sheets("Etat").Activate
    Nom_Etat = Sheets("Etat").Range("b4")
     
    For Each Cell In Plage
        If Cell = Nom_Etat Then
            Sheets("nom").Activate
            Position = Cell.address
            Range(Position).Select
            Code = ActiveCell.Offset(0, 1).Value
            Commune = ActiveCell.Offset(0, 2).Value
            Adresse = ActiveCell.Offset(0, 3).Value
            TEL1 = ActiveCell.Offset(0, 4).Value
            TEL2 = ActiveCell.Offset(0, 5).Value
            TEL3 = ActiveCell.Offset(0, 6).Value
            Mail = ActiveCell.Offset(0, 7).Value
     
           Sheets("Etat").Activate
            ActiveCell.Offset(0, 1).Range("a1").Select
            ActiveCell.Value = Adresse
            ActiveCell.Offset(0, 1).Range("a1").Select
            ActiveCell.Value = Code
            ActiveCell.Offset(0, 1).Range("a1").Select
            ActiveCell.Value = Commune
            ActiveCell.Offset(0, 1).Range("a1").Select
            ActiveCell.Value = TEL1
            ActiveCell.Offset(0, 1).Range("a1").Select
            ActiveCell.Value = TEL2
            ActiveCell.Offset(0, 1).Range("a1").Select
            ActiveCell.Value = TEL3
            ActiveCell.Offset(0, 1).Range("a1").Select
            ActiveCell.Value = Mail
            ActiveCell.Offset(1, -7).Range("a1").Select
          End If
    Next

  2. #2
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour
    Citation Envoyé par NESPOULOUS Voir le message
    Ma fonction fonctionne correctement pour la 1er ligne... mais ne "passe pas si je puis dire à la 2° ligne (c4).
    Je suppose que tu veux dire 2° ligne (B5) alors je te propose 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
    15
    16
    17
    18
    19
    20
    21
    Dim Cell As Range
    Dim Plage As Range
    Dim lig As Long
        Set Plage = Sheets("Nom").Range("C2:C80")
        Sheets("Etat").Activate
        With Sheets("Etat")
            For lig = 4 To .Cells(Rows.Count, "B").End(xlUp).Row
                For Each Cell In Plage
                    If Cell.Value = .Cells(lig, "B").Value Then
                        .Cells(lig, "B").Offset(0, 1).Value = Cell.Offset(0, 3).Value
                        .Cells(lig, "B").Offset(0, 2).Value = Cell.Offset(0, 1).Value
                        .Cells(lig, "B").Offset(0, 3).Value = Cell.Offset(0, 2).Value
                        .Cells(lig, "B").Offset(0, 4).Value = Cell.Offset(0, 4).Value
                        .Cells(lig, "B").Offset(0, 5).Value = Cell.Offset(0, 5).Value
                        .Cells(lig, "B").Offset(0, 6).Value = Cell.Offset(0, 6).Value
                        .Cells(lig, "B").Offset(0, 7).Value = Cell.Offset(0, 7).Value
                        Exit For
                    End If
                Next Cell
            Next lig
        End With

  3. #3
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    C'est un peu difficile de faire la distinction entre range et cell ....
    J'essairerai cependant bien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each Cell In Plage.Cells
    et n'oubliez pas: utilisez la déclaration Option Explicit en tête de module (ou mieux, par défaut)

  4. #4
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 369
    Par défaut
    Bonjour anasecu et vinc,

    Cells correspond à 1 cellule en particulier et Range à une Plage de Cellule (qui peut avoir une taille de 1 -> donc une cellule)

    Pourquoi ne pas utiliser la méthode Find ?

    Tu boucles sur les noms comme tu le fais présentement, et si la méthode Find trouve une correspondance, tu lui demandes de t'en sortir le numéro de ligne ?

    Ce que je peux te conseiller est de définir ta base de données sous forme de Tableau et non de plage de cellules. Vas sur n'importe quelle cellule de ton tableau, puis appuie sur Ctrl + * et mettre sous forme de tableau. Puis tu le renommes dans l'onglet Création qui s'est ouvert.

    Tu pourras ainsi parcourir aisément ta colonne de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim Wb As ThisWorkbook
    Dim WbO As Worksheet
    Dim t As ListObject
     
    Set WbO = Wb.Sheets("Nom")
    Set t = WbO.ListObjects("Nom_de_ton_tableau")
     
    For Each Cell In t.ListColumns(2).DataBodyRange
    'Procédure
    Next Cell

  5. #5
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour,

    Citation Envoyé par vinc_bilb Voir le message
    For Each Cell In Plage.Cells
    à partir du moment où 'Plage' à été défini comme un range, les éléments sont des cellules.

    Citation Envoyé par révèr
    Cells correspond à 1 cellule en particulier
    essaie de faire :et tu verras que l'ensemble des cellules de ton onglet sont sélectionnées.

    En fait Cells ou Range sont 2 syntaxes différentes pour cibler les cellules.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         Set plage = Sheets("Nom").Range("C2:C80")
    équivaut à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         Set plage = Sheets("Nom").Cells(2, 3).Resize(79, 1)
    Le premier code est plus simple dans ce cas mais le second est souvent plus souple à utiliser sur des plages évolutives.

    Bien entendu, la recherche peut se faire avec un 'Find' qui devrait sans doute être plus efficient car exécuté par une fonction native.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Dévellopeur amateur access
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dévellopeur amateur access
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Par défaut Boucle for each problème résolu
    Bonsoir à tous et merci d'être venu à mon secours.
    J'ai finalement utilisé la méthode Rows.count pour sélectionner jusqu'à la dernière cellule des colonnes B et C de chaque feuillet, et créer un boucle autour de la boucle. ça marche super bien.

    Ci-dessous ma solution.
    Merci encore à tous.

    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
    DernLigne_Etat = Range("b" & Rows.Count).End(xlUp).Row 'dernière colonne ligne 1
    DernLigne_Nom = Range("c" & Rows.Count).End(xlUp).Row 'dernière colonne ligne 1
     
    Set Plage = Sheets("Nom").Range("c2:c95") '& DernLigne_Nom)
    Set Plage2 = Sheets("Etat").Range("b4", "b" & DernLigne_Etat)
    Sheets("Etat").Activate
     
    For Each cell2 In Plage2
        For Each Cell In Plage
            If Cell = cell2 Then
            Sheets("nom").Activate
            Position = Cell.address
            Range(Position).Select
            Code = ActiveCell.Offset(0, 1).Value
            Commune = ActiveCell.Offset(0, 2).Value
            Adresse = ActiveCell.Offset(0, 3).Value
            TEL1 = ActiveCell.Offset(0, 4).Value
            TEL2 = ActiveCell.Offset(0, 5).Value
            TEL3 = ActiveCell.Offset(0, 6).Value
            Mail = ActiveCell.Offset(0, 7).Value
     
            Sheets("Etat").Activate
            ActiveCell.Offset(0, 1).Range("a1").Select
            ActiveCell.Value = Adresse
            ActiveCell.Offset(0, 1).Range("a1").Select
            ActiveCell.Value = Code
            ActiveCell.Offset(0, 1).Range("a1").Select
            ActiveCell.Value = Commune
            ActiveCell.Offset(0, 1).Range("a1").Select
            ActiveCell.Value = TEL1
            ActiveCell.Offset(0, 1).Range("a1").Select
            ActiveCell.Value = TEL2
            ActiveCell.Offset(0, 1).Range("a1").Select
            ActiveCell.Value = TEL3
            ActiveCell.Offset(0, 1).Range("a1").Select
            ActiveCell.Value = Mail
            ActiveCell.Offset(1, -7).Range("a1").Select
          End If
        Next
    Next

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

Discussions similaires

  1. boucle for each
    Par jadey dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/08/2006, 20h50
  2. [VBA-E]PB sur une boucle for each next
    Par rond24 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 31/07/2006, 15h47
  3. aide vba boucle for each paramétrée en range
    Par gotlieb dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/07/2006, 08h55
  4. [VBA-E] erreur boucle for each
    Par Mut dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 15/02/2006, 16h38
  5. Boucle For each
    Par roots_man dans le forum ASP
    Réponses: 10
    Dernier message: 18/02/2005, 09h55

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