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 :

index dans boucle for each - tableau structuré [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de LG-69
    Homme Profil pro
    Analyste statisticien
    Inscrit en
    Juillet 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste statisticien

    Informations forums :
    Inscription : Juillet 2014
    Messages : 162
    Par défaut index dans boucle for each - tableau structuré
    Bonjour,

    Une question pour les experts.

    J'ai un tableau structuré "Année"
    Je boucle sur chaque ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for each ligne in range("Année").Rows
       ...blablabla...
       c'est ici que je veux savoir si on traite la ligne 1, 2, 3 ou 4....
    Next ligne
    Dans ma boucle "for each", j'aurai besoin de connaître le positionnement de ma ligne en cours de traitement dans son tableau d'origine "Année" ?
    Dans ma boucle, comme je traite un seul objet ligne, il n'est plus "rattaché" à mon tableau du coup un truc du genre ligne.index ne marche pas, et si je suis en dehors de ma boucle, je ne sais pas quelle ligne je traite....

    J'ai trouvé une solution un peu bricolo, j'ai un compteur initialisé à 0 et je l'incrémente de 1 à chaque itération de ma boucle "for each", je m'en sors ainsi mais je me demandais s'il n'y avait pas un moyen plus "propre", sans devoir gérer ce compteur manuellement, de savoir quel est l'index de la ligne en cours de traitement dans son tableau d'origine.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    compteur = 0
    for each ligne in range("Année").Rows
       compteur = compteur + 1
       ...blablabla...
       c'est ici que je veux savoir si on traite la ligne 1, 2, 3 ou 4.... => c'est compteur
    Next ligne
    Par avance merci

  2. #2
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("Année[#Headers]").Row
    te donne la ligne des en-têtes de ton tableau. Ensuite il n'y a plus qu'à faire une soustraction avec la ligne de la cellule que tu traites.

  3. #3
    Membre confirmé Avatar de LG-69
    Homme Profil pro
    Analyste statisticien
    Inscrit en
    Juillet 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste statisticien

    Informations forums :
    Inscription : Juillet 2014
    Messages : 162
    Par défaut
    Je te remercie pour ta réponse riaolle, mais le problème est justement de récupérer le positionnement de ma ligne (l'index) que je suis en train de traiter une fois que je suis à l'intérieure de ma boucle for each. Je ne sais pas dire (sauf en utilisant ma méthode de compteur que je ne trouve pas très élégante) si j'en suis à la 1ère, la 2ème, et ainsi de suite

  4. #4
    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,
    La propriété Row de l'objet Range, te donnera le numéro de la ligne dans la feuille mais pas dans le tableau.
    Pour cela, il faut défalquer le numéro de la ligne que te donne la boucle par le numéro de la ligne où commence le tableau

    Exemple 1 - Renvoie le numéro de la ligne de la feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub T()
      Dim Ligne As Range
      Dim compteur As Long
      For Each Ligne In Range("T_Target").Rows
         compteur = compteur + 1
         Debug.Print Ligne.Row
      Next Ligne
    End Sub
    Exemple 2 - Renvoie le numéro de la ligne dans le tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub t2()
      Dim oList As ListObject
      Dim Ligne As Range
      Dim compteur As Long
      Dim Start As Long
      Set oList = Range("T_Target").ListObject
      Start = oList.Range.Row
      For Each Ligne In oList.DataBodyRange.Rows
         compteur = compteur + 1
         Debug.Print Ligne.Row - Start
      Next Ligne
    End Sub
    Petites remarques
    • Il est important de déclarer tes variables
    • Il est inutile d'initialiser à 0 une variable numérique. Elle vaut 0 lors de sa déclaration
    • Ayant le numéro de la ligne, je ne pense pas que tu aies besoin de la variable Compteur
    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

  5. #5
    Membre confirmé Avatar de LG-69
    Homme Profil pro
    Analyste statisticien
    Inscrit en
    Juillet 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste statisticien

    Informations forums :
    Inscription : Juillet 2014
    Messages : 162
    Par défaut
    Merci également Philippe.

    En effet avec ta méthode plus besoin du compteur, mais à ce que je vois il n'est pas possible d'avoir directement la position de ma ligne dans le tableau, ce qui oblige à soustraire au positionnement de la ligne dans le classeur la position de ce même tableau dans le classeur... ça évite le compteur mais c'est pas vraiment plus simple et/ou plus lisible.

    Je vais rester sur mon compteur je pense, mais merci, j'y vois plus clair et surtout je vois que je ne peux pas avoir directement la position dans le tableau

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur VBA
    Inscrit en
    Décembre 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur VBA

    Informations forums :
    Inscription : Décembre 2015
    Messages : 93
    Par défaut
    Hello,

    Pour boucler un tableau je procède 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
    12
    13
    14
    15
    16
    17
    18
    Sub BouclerContenu()
     
       Dim ws As Worksheet
       Dim cel As Range
       Dim codeCherche As String
       Dim valRetour As String
     
       Set ws = ActiveSheet
       codeCherche = "CP88"
     
       For Each cel In ws.Range("TAB_Client[CodeClient]")
          If cel = codeCherche  Then
             valRetour = ws.Cells(cel.Row, ws.Range("TAB_Client[Nom]").Column)
             Debug.Print valRetour
          End If
       Next
     
    End Sub
    L'avantage est que je peux facilement y ajouter un IF sur un certain contenu comme dans l'exemple (c'est en général l'objectif de boucler un tableau)-
    En réalité je ne sais pas sur quelle ligne de tableau je me trouve, mais j'ai le numéro de ligne de ma feuille et cela suffit.

    Pour la valeur de retour j'utilise ce numéro de ligne et le nom de la colonne du tableau (ws.Range("TAB_Client[Nom]").Column). L'avantage est que si je rajoute un jour une colonne avant cette colonne, mon code fonctionne toujours.

    ++

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

Discussions similaires

  1. Incrementer une List<T> avec T dans boucle for each
    Par Ganeshiva dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 30/03/2017, 17h43
  2. Problème de soustraction dans Boucle For each
    Par athos7776 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/04/2011, 05h46
  3. Problème d'index dans boucle for
    Par cocacola0589 dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 09/02/2010, 18h22
  4. Probleme VBS et boucle For each + tableau
    Par fas3r dans le forum Windows
    Réponses: 0
    Dernier message: 26/02/2008, 03h00
  5. Réponses: 3
    Dernier message: 04/08/2006, 19h24

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