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 :

Boucles imbiquées avec "critère d'arrêt"..


Sujet :

Macros et VBA Excel

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut Boucles imbiquées avec "critère d'arrêt"..
    Tout d'abord bonjour à toutes et à tous !

    J'ai de nouveau un petit problème avec mon code et je ne sais pas trop par quel bout m'y prendre et c'est pourquoi je viens à vous

    Voilà le code que j'ai pour l'instant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For j = 9 To Cells(65536, "B").End(xlUp).Row
            Set c = Cells(j, "B").Find(What:="Nom Module", lookat:=xlPart)
            If Not c Is Nothing Then
                Sheets(TAFT).Copy After:=Sheets(Sheets.Count)
                ActiveSheet.Name = Sheets(5).Cells(j, "C").Value
                ActiveSheet.Visible = True
                Sheets(5).Activate
            End If
    Next
    Cette partie de mon code fait défiler les cellules de la colonne B jusqu'à trouver un champ s'appelant "Nom Module x" où x est un entier. A chaque fois qu'il en trouve un, il crée une feuille en la copiant sur une feuille exemple masquée et il l'appelle selon le nom présent dans la colonne C en face de "Nom Module x". A la fin je mets cette dernière feuille en visible et je resélectionne ma feuille de base. Voilà pour le moment

    Pour l'instant ce n'est pas très compliqué mais je ne sais pas du tout par quel bout m'y prendre pour la suite.

    En effet, je voudrais que pour chacun des "Nom Module" de la colonne B, je puisse parcourir ma colonne E en cherchant "Nom Interface". Cependant, il faut s'arrêter de la parcourir juste avant de tomber sur un second "Nom Module" dans la colonne B. En fait, je cherche à trouver combien de fois "Nom Interface" se répète dans la colonne E afin d'effectuer des actions sur la feuille que je viens de créer mais il faut que je m'arrête avant un 2ème "Nom Module" de B car ce sera pour une autre feuille et ainsi de suite.

    En vous remerciant

  2. #2
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Idée... mais je ne sais pas si tu veux exécuter to Sheet copy pour chaque occurence du meme nom module ou 1 fois par meme nom module. j'ai supposé que 1 fois par meme nom module. Sinon tu déplace le if c<> old_module apres sheets(5).activate

    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
     
    Dim old_module As String
    old_module = ""
    For j = 9 To Cells(65536, "B").End(xlUp).Row
            Set c = Cells(j, "B").Find(What:="Nom Module", lookat:=xlPart)
            If Not c Is Nothing Then
                If c <> old_module Then
                    c = old_module
                    Sheets(TAFT).Copy After:=Sheets(Sheets.Count)
                    ActiveSheet.Name = Sheets(5).Cells(j, "C").value
                    ActiveSheet.visible = True
                    Sheets(5).Activate
                    'ici insérer recherche et comptage nom interface
                    '.....
                End If
            End If
    Next

  3. #3
    Membre émérite
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2006
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 542
    Par défaut
    Bonjour à tous
    Bonjour DeaD78, Godzestla

    En complément de Godzestla :

    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
    Dim c As Range
    Dim compte, d As Integer
    Dim firstaddress1 As String
    Dim ligne1, ligne2 As Integer
    Dim mavar1, mavar2 As String
     
    Sub cherche()
     
    With Worksheets("Feuil3").Range("b:b")
     
    mavar1 = "Nom Module"
    mavar2 = "Nom Interface"
        Set c = .Find(mavar1, LookIn:=xlValues, Lookat:=xlWhole)
        If Not c Is Nothing Then
            firstaddress1 = c.Address
            Do
                ligne1 = c.Row
     
                'tu crées ta feuille et ....
                    'Sheets(TAFT).Copy After:=Sheets(Sheets.Count)
                    'ActiveSheet.Name = Sheets(5).Cells(j, "C").Value
                    'ActiveSheet.Visible = True
                    'Sheets(5).Activate
     
                Set c = .FindNext(c)
                ligne2 = c.Row
                For d = ligne1 To ligne2 - 1
                    If Range("e" & d) = mavar2 Then compte = compte + 1
                Next d
                'tu traites le compte de "Nom Interface" et tu réinitialise compte=0
     
            Loop While Not c Is Nothing And c.Address <> firstaddress1
        End If
    End With
     
    End Sub
    Eric

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Merci beaucoup, je vais tester ça de ce pas et je vous tiens au courant

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Bon, j'ai carrément du mal. Voilà où j'en suis :

    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
    Sub CstrArchi()
     
    Dim i As Integer, j As Long, k As Long, cpt As Integer
    Dim TAFT As String
    Dim c As Range, d As Range
     
        cpt = 0
     
        UserForm5.Show
        For i = 0 To 4
            If UserForm5.ListBox1.Selected(i) Then
                TAFT = UserForm5.ListBox1.List(i)
            End If
        Next
        Unload UserForm5
     
        For j = 9 To Cells(65536, "B").End(xlUp).Row
            Set c = Cells(j, "B").Find(What:="Nom Module", lookat:=xlPart)
            If Not c Is Nothing Then
                Sheets(TAFT).Copy After:=Sheets(Sheets.Count)
                ActiveSheet.Name = Sheets(5).Cells(j, "C").Value
                ActiveSheet.Visible = True
                Sheets(5).Activate
     
                'L1 = c.Row
                'MsgBox (L1)
                'L2 = c.FindNext(c)
                'MsgBox (L2)
     
                For k = L1 To L2
                    Set d = Cells(k, "D").Find(What:="Nom Interface", lookat:=xlPart)
                    If Not d Is Nothing Then
                       cpt = cpt + 1
                    End If
                    MsgBox (cpt)
                Next            
            End If    
       Next
     
    End Sub
    La dernière partie du code me permet de chercher le nombre de fois que Nom Interface apparaît dans la colonne D et d'incrémenter mon compteur en fonction de ces apparitions. Cependant il faut que ça le fasse pour chaque module trouvé soit entre les lignes L1 et L2 (entre le premier "Nom Module" trouvé jusqu'au second puis du second jusqu'au troisième). Je dois ainsi, à chaque fois compter ce nombre de "Nom Interface" pour pouvoir utliser ce nombre par la suite.

    Merci

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut FindNext Recherches imbriquées ?
    Bonjour,

    Alors voilà, j'ai le bout de code suivant :

    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
    Sub CstrArchi()
    
    Dim i As Integer, j As Integer, k As Integer, TAFT As String
    Dim c As Range, d As Range
        
        UserForm5.Show
        For i = 0 To 4
            If UserForm5.ListBox1.Selected(i) Then
                TAFT = UserForm5.ListBox1.List(i)
            End If
        Next
        Unload UserForm5
    
        For j = 10 To Cells(65536, "B").End(xlUp).Row
            Set c = Cells(j, "B").Find(What:="Nom Module", lookat:=xlPart)
            If Not c Is Nothing Then
                Sheets(TAFT).Copy After:=Sheets(Sheets.Count)
                ActiveSheet.Name = Sheets(5).Cells(j, "C").Value
                ActiveSheet.Visible = True
                Sheets(5).Activate
            
                For k = j To ???
                    Set d = Cells(k, "D").Find(What:="Nom Interface", lookat:=xlPart)
                        If Not d Is Nothing Then
                            MsgBox ("Hello")
                    End If
                Next
            End If
        Next
    
    End Sub
    Je veux donc faire une première recherche sur la colonne B (je recherche la valeur "Nom Module"). Pour celle-ci, pas de problème, ça fonctionne. Par contre, je veux faire une deuxième recherche imbriquée dans la première (en recherchant la valeur "Nom Interface"). Celle-ci doit commencer à partir de la ligne où on a trouvé "Nom Module" jusqu'à la ligne où le deuxième "Nom Module" a été trouvé et ainsi de suite. C'est ce que je n'arrive toujours pas à faire. En rouge, dans le code, j'ai mis l'endroit où on devrait mettre la valeur de la ligne où la valeur "Nom Module" suivante a été trouvée. Je pensais résoudre le problème avec la fonction FindNext mais je n'y arrive pas.

    Et voilà un petit "exemple" pour expliquer ce que je recherche à faire :

    Colonne B
    Colonne D
    Nom Module 1

    Nom Interface 1

    Nom Interface 2

    Nom Interface 3


    Nom Module 2

    Nom Interface 1

    Nom Interface 2

    Nom Module 3

    Nom Interface 1

    Nom Interface 2

    En gros pour chaque "Nom Module" trouvé, je crée des feuilles. Ensuite, pour chacun de ces "Nom Module", je dois compter combien il y a de "Nom Interface". Si vous avez une petite idée de comment traiter le problème, je suis preneur

    En vous remerciant d'avance !

  7. #7
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Et tu n'as pas appliqué les solutions qui t'étaient proposées.
    La solution D'Edelweisseric entre autres.

    Pas bien de demander et de ne rien en faire.

    Alors autant chercher seul dans la , et en plus c'est comme cela qu'on apprend le mieux.

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Désolé fring ainsi que tous les autres, j'aurais dû poster mon message à la suite de l'autre, c'est vrai

    Sinon, Godzestla, je me suis rendu compte qu'il ne servait à rien de gérer la gestion des doublons au niveau des modules : en effet, dans ma colonne B, je n'ai que des "Nom Module 1(ou 2 ou 3 etc)". Pour chacun de ces modules, il faut créer une nouvelle feuille. De plus, pour chacun de ces "Nom Module", il y a obligatoirement un ou plusieurs "Nom Interface 1(ou 2 ou 3 etc)". Il faut donc simplement faire cette recherche pour chacun des modules. Ce que je n'ai pas réussi à faire avec ce que vous m'avez proposé Vendredi

    EDIT : j'ai essayé avec la solution d'Edelweisseric mais je n'ai pas réussi et c'est pour ça que le titre du deuxième Topic contenait le keyword FindNext...

  9. #9
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Sinon, Godzestla, je me suis rendu compte qu'il ne servait à rien de gérer la gestion des doublons au niveau des modules : en effet, dans ma colonne B, je n'ai que des "Nom Module 1(ou 2 ou 3 etc)". Pour chacun de ces modules, il faut créer une nouvelle feuille. De plus, pour chacun de ces "Nom Module", il y a obligatoirement un ou plusieurs "Nom Interface 1(ou 2 ou 3 etc)". Il faut donc simplement faire cette recherche pour chacun des modules. Ce que je n'ai pas réussi à faire avec ce que vous m'avez proposé Vendredi
    C'est là que je ne suis pas d'accord et que j'insiste FORT.

    Je m'en réfère à ton exemple
    Colonne B
    Colonne D
    Nom Module 1
    Nom Interface 1

    Nom Interface 2

    Nom Interface 3

    Nom Module 2
    Nom Interface 1

    Nom Interface 2
    Nom Module 3
    Nom Interface 1

    Nom Interface 2
    Ma formation informatique, meme si elle date un peu maintenant dit que la base c'est de faire un process qui correspond à la présentation du flux des données.

    Ici, pour moi , pas de doute. (ou alors tu as mal expliqué).

    Colonne B Colonne D

    Module Machin1 InterfaceTruc1
    Module Machin1 Interfacetruc2
    Module Machin2 InterfaceTruc1
    Module Machin2 Interfacetruc3
    Module machin2 Interfacetruc4

    Donc, donc, DONC :

    Le principe est de :
    1) Lire le premier nom de module,
    2) le sauver
    3) creér ta feuille
    3) mettre le compteur interface à 0
    4) tant que module trouvé = meme que ancien (aussi pour premier ligne),
    incrémenter compteur interface
    recherche module
    5) Et hop on recommence en 2) avec le module suivant tant qu'il y en a.

    Je crois donc que tu te compliques la vie en voulant attaquer le problème par la face nord, alors qu'il y un ascenseur au sud. (la solution d'Eric)

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Bon, merci beaucoup, je me suis inspiré de la solution d'Edelweissreic pour faire ce que je pouvais et ça marche (ça a l'air en tout cas) sous cette forme :

    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
    Sub CstrArchi()
     
    Dim i As Integer, j As Integer, k As Long, TAFT As String
    Dim L1 As Long, L2 As Long, cpt As Integer
    Dim c As Range, d As Range
     
        UserForm5.Show
        For i = 0 To 4
            If UserForm5.ListBox1.Selected(i) Then
                TAFT = UserForm5.ListBox1.List(i)
            End If
        Next
        Unload UserForm5
     
     
     
     
        For j = 10 To Cells(65536, "B").End(xlUp).Row
            Set c = Cells(j, "B").Find(What:="Nom Module", lookat:=xlPart)
            If Not c Is Nothing Then
                L1 = c.Row
                Sheets(TAFT).Copy After:=Sheets(Sheets.Count)
                ActiveSheet.Name = Sheets(5).Cells(j, "C").Value
                ActiveSheet.Visible = True
                Sheets(5).Activate
                Set c = Sheets(5).Range("B:B").FindNext(c)
                If c.Row <> 10 Then
                    L2 = c.Row
                Else
                    L2 = 65536
                End If
                cpt = 0
                For k = L1 To L2 - 1
                    Set d = Cells(k, "D").Find(What:="Nom Interface", lookat:=xlPart)
                    If Not d Is Nothing Then
                        cpt = cpt + 1
                        MsgBox cpt
                    End If
                Next
            End If
        Next
     
    End Sub
    Encore merci.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/03/2009, 15h08
  2. Boucle avec tempo qui s'arrête a minuit
    Par thedjtony dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/04/2008, 00h35
  3. Formulaires : problème avec les slashes et les quotes
    Par GarGamel55 dans le forum Langage
    Réponses: 1
    Dernier message: 12/10/2005, 16h59

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