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 :

Réaliser une boucle for pour une donnée qui apparaît plusieurs fois dans un tableau [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 17
    Points : 9
    Points
    9
    Par défaut Réaliser une boucle for pour une donnée qui apparaît plusieurs fois dans un tableau
    Bonjour,

    J'essaye de faire une boucle qui me fasse les mêmes instructions pour chaque ligne trouvé (LinProd étant déclaré en tableau) et L1.1 (le mot "L1.1" revient plusieurs fois dans la colonne) le mot à trouver.

    Voici un bout de mon code

    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
     
    Worksheets("Saisie").Activate
    Set tabl = Sheets("Saisie").ListObjects("tab_mission")
     
        Set FAB = Range(tabl.ListColumns(6).DataBodyRange.Address)
        With FAB
     
        'Début de la boucle
     
       For i = LBound(LinProd) To UBound(LinProd)    'erreur sur cette ligne (l'indice ne correspond pas à la seletion)
     
        LinProd(i) = "L1.1"
     
            Set c = .Find(LinProd(i), LookIn:=xlValues)
     
                                      "                      "
                                      "Instructions      "
                                       "                      "
     
        Next i

    Lorsque je lance le programme, ça m'affiche que l'indice ne correspond pas à la seletion.
    Quelequ'un peut m'aider s'il vous plait?

    Bonne journée

  2. #2
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    comment est exactement déclaré le tableau ? En fixe ou en dynamique ?
    L'erreur semble indiquer que ton tableau n'est pas initialisé, c'est à dire qu'il ne possède aucune structure (nombre de lignes ou de colonnes).


    A ce titre, quel est le traitement que tu comptes faire ensuite sur ces lignes ? Car au vu de ce que tu montres et décris, un simple filtre automatique sur la colonne 6, et via le critère "L1.1" va te permettre de travailler directement sans passer par des Find

    Un exemple pour illustrer : on cherche toutes les lignes dont la colonne 6 contient exactement L1.1
    sur l'ensemble de ces lignes, on va modifier la cellule de la colonne 5 pour y écrire "toto"

    Une base illustrative ... à adapter à ce que tu souhaites réaliser bien sûr

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub toto()
    Dim FAB As ListObject
    Const LeMotCle As String = "L1.1"
        With Worksheets("Saisie")
            If .FilterMode Then .ShowAllData
     
            With .ListObjects("tab_mission")
                .HeaderRowRange.AutoFilter 6, LeMotCle
                .DataBodyRange.Columns(5).SpecialCells(xlCellTypeVisible).Value = "toto"
                .HeaderRowRange.AutoFilter
            End With
        End With
    End Sub

  3. #3
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 112
    Points : 191
    Points
    191
    Par défaut
    Bonjour,

    On ne voit pas dans ton code si le tableau LinProd est initialisé ou non.
    à vérifier dans la fenêtre variables locales :
    Pas bon
    Nom : Capture.PNG
Affichages : 229
Taille : 9,2 Ko
    Bon
    Nom : Capture.PNG
Affichages : 282
Taille : 19,2 Ko

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Mon code ressemble à ça sans la boucle for. Est ce que vous pouvez me le corriger pour ajouter la boucle for si cela ne vous dérange pas? Merci d'avance

    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
    Sub Bouton2_Cliquer()
     
    Dim LinProd As String
    Dim adresse As String
    Dim semaine As String
    Dim AFFAIRE As String
    Dim tabl, tabl_equipe As ListObject
    Dim FAB As Range
     
    Worksheets("Saisie").Activate
    Set tabl = Sheets("Saisie").ListObjects("tab_mission")
     
        Set FAB = Range(tabl.ListColumns(6).DataBodyRange.Address)
        With FAB
     
        LinProd = "L1.1"
            Set c = .Find(LinProd, LookIn:=xlValues)
     
            If Not c Is Nothing Then
                AFFAIRE = Range(c.Address).Offset(0, -5).Value
                semaine = Range(c.Address).Offset(0, 6).Value
     
                ''' Recherche des coordonnées de la cellule
                Worksheets("Team1").Activate
                Set tabl_equipe = Sheets("Team1").ListObjects("tab_equipe")
     
                ' Recherche de la column
                With Range(tabl_equipe.ListRows(1).Range.Address)
                    Set cel_col = .Find(semaine, Lookat:=xlWhole)
                    If Not cel_col Is Nothing Then
                        Set col = Range(cel_col.Address)
                    End If
                End With
     
                ' Recherche de la row
                With Range(tabl_equipe.ListColumns(1).Range.Address)
                    Set cel_row = .Find(LinProd, Lookat:=xlWhole)
                    If Not cel_row Is Nothing Then
                        Set c_row = Range(cel_row.Address)
                    End If
                End With
     
                Worksheets("Team1").Cells(c_row.Row, col.Column).Value = AFFAIRE
                Set c = .FindNext(c)
                Worksheets("Team1").Activate
            End If
     
        End With
    Exit Sub
     
    End Sub
    Je sais pas si j'ai bien exposé ma demande. Si vous avez des question n’hésitez pas. Votre aide me sera d'une grande utilité

    Après avoir quelques recherche sur le net, il parait que c'est ma fonction .findnext qui ne marche pas. Quelqu'un aurait une amélioration à me proposer quant à mon code ci dessus (voir message avec code au dessus).

    Merci d'avance

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    Que tu ne répondes pas aux intervenants ne motive pas vraiment, ne soit pas surpris de l'attente.
    Personne n'apprécie d'être transparent, surtout après avoir pris du temps pour rendre service...

    Ceci dit, vu que tu imbrique plusieurs .find, j'ai dans l'idée que ton Set c = .FindNext(c) se refère au dernier .find et non au premier et qu'excel se fasse des noeuds.
    Tu devrais essayer de le remplacer par un .find complet avec le paramètre after:=c
    (bien que la chaine recherchée soit la même mais c'est un hasard, tu aurais écrit tes 2 .find dans l'autre sens tu l'aurais fait sur Semaine)

    D'autre part tu fais ton Set c = .FindNext(c) pour les mouches. Je ne vois pas de structure style Do...Loop et après lui tu quittes ta procédure.
    eric

  6. #6
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    A la lecture de ton code, on ressort avec + de questions qu'avant sa lecture

    ce que j'ai compris :

    - tu cherches toutes les lignes contenant L1.1 dans la 6ème colonne du tableau "tab_mission"
    - par chacune de ses lignes, tu récupère la "semaine" en colonne 12 et l' "affaire" en colonne 1
    - tu cherches toutes les lignes contenant L1.1 dans la première colonne du tableau "tab_equipe"
    - pour chacune de ses lignes, tu cherches la colonne dont le titre correspond à "semaine" et tu écris l' "affaire" dedans


    ceci devrait être un début de piste sur ce postulat, testes et regarde si ça correspond (même partiellement) à ce que tu cherches.
    si ça correspond pas, explique plus précisément :

    - ce que fait la procédure
    - ce que toi tu veux faire réellement


    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 toto()
    Const LeMotCle As String = "L1.1"
    Dim Plage As Range
    Dim Tabl()
     
    With Worksheets("Saisie")
        If .FilterMode Then .ShowAllData
     
        ' filtre automatique sur la colonne 6 avec LeMotCle pour critère
        ' mise sous tableau de la plage filtrée
        With .ListObjects("tab_mission")
            .HeaderRowRange.AutoFilter 6, LeMotCle
            Tabl = .DataBodyRange.SpecialCells(xlCellTypeVisible).Value
            .HeaderRowRange.AutoFilter
        End With
    End With
     
    With Worksheets("Team1")
        If .FilterMode Then .ShowAllData
     
        With .ListObjects("tab_equipe")
            .HeaderRowRange.AutoFilter 1, LeMotCle
            ' boucle sur chaque ligne trouvée dans le premier tableau
            For i = LBound(Tabl, 1) To UBound(Tabl, 1)
                ' plage de cellules situées dans la colonne ayant pour en-tête la "semaine" et ayant LeMotCle en colonne 1
                Set Plage = .ListColumns(Tabl(i, 12)).DataBodyRange.SpecialCells(xlCellTypeVisible)
     
                ' écriture de l' "affaire" dans les cellules trouvées
                If Not Plage Is Nothing Then Plage.Value = Tabl(i, 1)
            Next i
            .HeaderRowRange.AutoFilter
        End With
    End With
     
    End Sub

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Bonjour eriiic,

    Merci pour ta réponse, je comprend bien tes remarques et j'apprécie beaucoup de ton aide et aussi celui des autres personnes qui ont répondu à mon appelle à l'aide.
    J'ai un peu du mal à gérer les find et findnext. Je vais plutôt partir sur le modèle de code de "joe.levrai" que je comprend mieux.

    Bonjour joe.levrai,

    Je tiens aussi à te remercier, pour ton aide. Ce que tu as compris de mon code est correcte. Par contre lorsque je lance le code,il m'affiche une erreur sur cette ligne, que l'indice n'appartient pas à la sélection.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Plage = .ListColumns(Tabl(i, 12)).DataBodyRange.SpecialCells(xlCellTypeVisible)
    Je vais me pencher sur le débugage, je reviendrai vers vous si je trouve une solution, sinon, si vous la trouvez avant, elle est la bienvenue.

    Merci encore à vous deux

    Bangibess

    Après plusieurs tentatives, le programme me renvoie un tableau "Tabl" sur un seule ligne, alors que j'aimerais qu'il m'affiche toutes les L1.1 trouvés par filtre. C'est pour cela que je ne peux pas effectuer une boucle. ( i = 1).
    Pourriez vous m'aider à trouver une solution svp? Merci

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

Discussions similaires

  1. Remplacer une boucle for par une boucle while
    Par sakakara dans le forum Langage
    Réponses: 2
    Dernier message: 07/10/2015, 19h31
  2. Réponses: 5
    Dernier message: 05/02/2010, 19h04
  3. [hold] pour une boucle [for] de plot
    Par Newenda dans le forum MATLAB
    Réponses: 12
    Dernier message: 31/07/2009, 11h50
  4. création d'une boucle for pour interrogation requête sql
    Par philder62 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/12/2007, 15h14
  5. utiliser une valeur float pour une boucle for
    Par didi59650 dans le forum Débuter
    Réponses: 6
    Dernier message: 18/04/2006, 17h32

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