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 :

Problème boucle infini [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 7
    Points
    7
    Par défaut Problème boucle infini
    Bonjour à tous !

    Voilà j'ai créé une macro qui "scan" une page de la colonnes 1 à 40 et de chaque lignes de 1 à 100, cette macro vérifie si dans chaque cases (Cells) si il y a un "String" ou une chaîne de caractère ou encore VarType = 8. Et après il traite la ligne entière pour trouver un "Double" Ou VarType = 5 (Valeur numérique) pour ensuite enregistrer une valeur total dans une variable tableau qui est généré par le code.

    Et j'ai quelques soucis avec mon code que je n'arrive pas à trouver seul... Me suis-je perdu dans mon code ? Très certainement :-D

    Voici la bête en question :

    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
     
     
    Function scan(Page)
     
    Dim C2 As Byte
    Dim L2 As Byte
    Dim nature(50, 50)
    Dim C As Long
    Dim L As Long
    Dim CRescue As Byte 
    Dim Total As Byte
     
    Total = 1
    C2 = 0
    L2 = 0
     
        For x = 0 To 50
            nature(x, Total) = 0
        Next x
     
     
     
        For C = 1 To 40
            For L = 1 To 100
            If VarType(Cells(L, C).Value) = 8 Then ' Verifie si le type de la variable est un string
              For i = 0 To 50
                If Cells(L, C).Value Like nature(C2 + i, L2) Then ' Scan la ligne et enregistre le chiffre qui correspond en l'enregistrant et en l'additionnant au précédent
                        CRescue = C
                        While VarType(Cells(L, C).Value) = 8 Or 0
                        If C < 25 Then
                            C = C + 1
                        End If
                        Wend
                        If VarType(Cells(L, C).Value) = 5 Then
                            nature(C2 + i, Total) = nature(C2 + i, Total) + Cells(L, C).Value
                            C = CRescue
                            Exit For
                        Else
                        Exit For
                        End If
                        Exit For
                End If
                If VarType(nature(C2 + i, L2)) = 0 Then 'Enregistre le nom inconnue et enregistre le total
                    CRescue = C
                    While VarType(Cells(L, C).Value) = 0 Or 8
                    If C < 25 Then
                        C = C + 1
                    End If
                    Wend
                    If VarType(Cells(L, C).Value) = 5 Then
                        nature(C2 + i, Total) = nature(C2 + i, Total) + Cells(L, C).Value
                        C = CRescue
                        nature(C2 + i, L2) = Cells(L, C).Value
                        Exit For
                    Else
                    Exit For
                    End If
                    Exit For
                End If
     
              Next i
              End If
             Next L
             L = 1
            Next C
     
     
    End Function
    Les soucis en question sont : Comme il est indiqué dans le titre une boucle infini, second problème ma macro n'enregistre pas les valeurs numériques. :-(

    Merci d'avance !

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

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Bonjour,

    En première lecture je remarque que la première boucle utilise la variable C qui est modifiée dans dans une autre boucle (While) elle même imbriquée dans d'autres boucles "For"
    Et la je me dis que le mur n'est pas loin

    Voilà j'ai créé une macro qui "scan" une page de la colonnes 1 à 40 et de chaque lignes de 1 à 100, cette macro vérifie si dans chaque cases (Cells) si il y a un "String" ou une chaîne de caractère ou encore VarType = 8
    Pour faire cela, diriges toi plutôt vers la manipulation des objets Range plutôt que des boucle For imbriqués
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim Rg as Range
    For Each Rg in range("A1:AN100")
       ... Test a valeur de la cellule + action
    Next
    Jérôme

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Merci pour ton aide je vais essayer ça tout de suite, je te tiens au courant :-)

    Mais par contre comment pourrais-je analyser une ligne avec le fameux Rg As range ? Une fois que la chaîne de caractère à été découverte ?


    Citation Envoyé par Zaelos Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                        While VarType(Cells(L, C).Value) = 8 Or 0
                        If C < 25 Then
                            C = C + 1
                        End If
                        Wend

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

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    comment pourrais-je analyser une ligne
    La Ligne ci dessous retourne le numéro de ligne de la cellule vérifiée
    Jérôme

  5. #5
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Tu as aussi la possibilité d'utiliser
    qui représente la ligne complète.

    Il serait ensuite intéressant d'utiliser Find pour rechercher un/des éventuels doublon sur la ligne.

    [Edit]
    Find ne sera peut-être pas judicieux dans l'ensemble, tout dépend de la réponse à cette question.
    Tu recherches VarType() = 5, 5 correspond à un nombre de type Double. Mais que cherches-tu exactement, un type Double ou juste une valeur numérique?

    Si on est dans le cas de la valeur numérique, alors en complément de find, tu peux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim CellNumeric as range
    Set CellNumeric = rg.specialcells(xlCellTypeConstants,xlNumbers)
    pour rechercher les cellules de type numériques, tu peux ensuite boucler sur chacune d'elles via une boucle For Each...

    [/Edit]

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  6. #6
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    c'est bien pour retrouver une valeur numérique.

    Merci beaucoup je vais tester tout ça !!!!!

    Je vous retournerais le code fonctionnel, ou non

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Bon voilà j'ai fait quelques modifications, et le code est déjà bien plus sympathique à regarder le voici :

    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
     
     
    Function scan(Page)
     
    Dim C As Byte
    Dim L As Byte
    Dim nature(50, 50)
    Dim CRescue As Byte 'Super C à la rescousse de C
    Dim Total As Byte
    Dim Rg As Range
    Dim CellNumeric As Range
    Dim TheRow As Range
    Total = 1
    C = 0
    L = 0
     
     
        For x = 0 To 50
            nature(x, Total) = 0
        Next x
     
     
        For Each Rg In Range("A1:AN100")
            If VarType(Rg) = 8 Then ' Verifie si le type de la variable est un string
              For i = 0 To 50
                If Rg.Value Like nature(C + i, L) Then ' Scan la ligne et enregistre le chiffre qui correspond en l'enregistrant et en l'additionnant au précédent
                        Set CellNumeric = Rg.SpecialCells(xlCellTypeConstants, xlNumbers)
                        TheRow = Rows(Rg.Row)
                        For Each Rg2 In TheRow
                             If Rg2.Value Is CellNumeric Then
                                nature(C + i, Total) = nature(C + i, Total) + Rg2.Value
                             End If
                        Next Rg2
                End If
                If VarType(nature(C + i, L)) = 0 Then 'Enregistre le nom inconnue et enregistre le total
                    Set CellNumeric = Rg.SpecialCells(xlCellTypeConstants, xlNumbers)
                    nature(C + i, L) = Rg.Value
                    TheRow = Rows(Rg.Row)
                        For Each Rg2 In TheRow
                             If Rg2.Value Is CellNumeric Then
                                nature(C + i, Total) = nature(C + i, Total) + Rg2.Value
                             End If
                        Next Rg2
                End If
              Next i
            End If
        Next Rg
     
    End Function
    Merci de votre aide ! Je débloque la fin de mon prog, je vous tiens au jus ;-)

  8. #8
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    J'ai regarder ton code, il faut revoir un peu son organisation je pense.
    Je ne comprend pas bien le but final, peux-tu préciser ce que tu cherches à faire exactement.

    En plus des explication, voila quelques questions et remarques

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each Rg In Range("A1:AN100")
    Ce tableau est fixe ou le nombre de lignes est amené à varier?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For i = 0 To 50
                  If Rg.Value Like nature(C + i, L) Then
    La variable C est défini à 0 et n'est jamais modifiée, que voulais tu faire, car je pense que c'est une mauvaise idée car lorsque i=50 à la fin de la boucle si C est égale à 1, 51 est au delà des borne de ton tableau Nature, donc tu cours droit à une erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set CellNumeric = Rg.SpecialCells(xlCellTypeConstants, xlNumbers)
    Je t'ai dis une bêtise, enfin je ne pensais pas à une tel utilisation.
    Pour que ce soit intéressant, il faut utiliser SpecialCells sur la ligne complète. Ainsi CellNumeric contiendra l'ensemble des cellules ayant un contenu numérique (hors cellule ayant un contenu numérique résultant d'une formule contenu dans la cellule [possible à obtenir en changeant certains paramètres]).
    Il te faut ensuite vérifier que CellNumeric est un contenu avant de l'utiliser, en effet si aucune cellule n'a un contenu numérique, CellNumeric sera Nothing
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if not CellNumeric Is Nothing Then
    Le but est ensuite de boucler sur les cellules pointées dans CEllNumeric et d'éviter de contrôler toutes les cellules de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                    TheRow = Rows(Rg.Row)
                    For Each Rg2 In TheRow
                         If Rg2.Value Is CellNumeric Then
                            nature(C + i, Total) = nature(C + i, Total) + Rg2.Value
                         End If
                    Next Rg2
    Sans compter que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Rg2.Value Is CellNumeric Then
    est incohérent, value est un contenu de cellule et Is un comparateur de niveau Object.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  9. #9
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Merci pour t'as réponse.

    Citation Envoyé par Qwazerty Voir le message
    Je ne comprend pas bien le but final, peux-tu préciser ce que tu cherches à faire exactement.
    Pour ce qui est de la macro, ce que je veut faire c'est :

    Analyser la feuille pour créer un tableau dans une seconde feuille

    Exemple :

    ............................................................Total J...Heures..Nombre
    Quelque chose .......................................... 10.5....10,3......3
    -----------------------Sous partie---------------------------------
    ............X..................................................9,4......4,3........1
    ............Y..................................................1..........3........1
    ............Z..................................................0,1........3........1

    Ci-dessus j'ai une représentation d'une type de feuille générée automatiquement par un logiciel. Le soucis est que la partie montrée juste au-dessus est qu'il y a plusieurs parties comme celle-ci avec différentes sous-parties

    Exemple :

    ...............................................................Total J..Heures..Nombre
    Quelque chose1 .......................................... 10.5.....10,3......3
    -----------------------Sous partie---------------------------------
    ............X..................................................9,4........4,3........1
    ............Y..................................................1............3........1
    ............Z..................................................0,1.........3........1

    ..............................................................Total J...Heures...Nombre
    Quelque chose2 .......................................... 1.1........6............2
    -----------------------Sous partie---------------------------------
    ............Y..................................................1............3............1
    ............Z..................................................0,1.........3............1

    ...............................................................Total J...Heures...Nombre
    Quelque chose3 .......................................... 19,5........12,3.....10
    -----------------------Sous partie---------------------------------
    ............X..................................................9,4........4,3........1
    ............Y..................................................1............2.........3
    ............Z..................................................0,1........3............1
    ............J..................................................3............2..........4
    ............V..................................................6............1..........1

    Le truc c'est que je doit prendre dans la feuille, tout les X,Y,Z,Etc et additionner toutes ces valeurs, pour ensuite regrouper toutes les sous-parties dans une autre feuille, ensuite je doit faire la même chose avec les parties principale "Quelque chose"

    Citation Envoyé par Qwazerty Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each Rg In Range("A1:AN100")
    Ce tableau est fixe ou le nombre de lignes est amené à varier?
    Si le logiciel ne change pas les lignes varies pas, ni les colonnes

    Citation Envoyé par Qwazerty Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For i = 0 To 50
                  If Rg.Value Like nature(C + i, L) Then
    La variable C est défini à 0 et n'est jamais modifiée, que voulais tu faire, car je pense que c'est une mauvaise idée car lorsque i=50 à la fin de la boucle si C est égale à 1, 51 est au delà des borne de ton tableau Nature, donc tu cours droit à une erreur.

    J'ai mis une variable au lieu de chiffres définis, car si un dév passe derrière il n'a plus qu'a changer la variable au lieu de tout remplacer.
    Et pour le tableau, pas de soucis cela commence à 0 ce termine à 50 comme ma variable i initialisé à 0, pas de problèmes sauf si je me trompe ...

    Cordialement !

  10. #10
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    ReBonjour à tous et à toutes !!

    Mon problème est résolue, la macro est fonctionnel, je n'ai plus qu'a utilisé les valeurs de mon tableau pour les mettre dans d'autre feuille !!!!

    Merci à tous !

    Voici 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
     
    Dim C As Byte
    Dim L As Byte
    Dim nature(50, 50)
    Dim Total As Byte
    Dim Rg As Range
    TotalH = 1
    TotalJ = 2
    TotalNB = 3
    C = 0
    L = 0
     
        For Each Rg In Range("Ma_Plage")
            If VarType(Rg) = 8 Then ' Verifie si le type de la variable est un string
              For i = 0 To 50
                If Rg.Value Like nature(C + i, L) Then ' Scan la ligne et enregistre le chiffre qui correspond en l'enregistrant et en l'additionnant au précédent
                        For Each Rg2 In Range(Rg.Row & ":" & Rg.Row)
                             If VarType(Rg2) = 5 Then
                                nature(C + i, TotalH) = nature(C + i, TotalH) + Rg2.Value
                                nature(C + i, TotalJ) = nature(C + i, TotalJ) + Range("M" & Rg.Row).Value
                                nature(C + i, TotalNB) = nature(C + i, TotalNB) + Range("N" & Rg.Row).Value
                                Exit For
                             End If
                        Next Rg2
                    Exit For
                End If
                If VarType(nature(C + i, L)) = 0 Then 'Enregistre le nom inconnue et enregistre le total
                    nature(C + i, L) = Rg.Value
                        For Each Rg2 In Range(Rg.Row & ":" & Rg.Row)
                             If VarType(Rg2) = 5 Then
                                nature(C + i, TotalH) = nature(C + i, TotalH) + Rg2.Value
                                nature(C + i, TotalJ) = nature(C + i, TotalJ) + Range("M" & Rg.Row).Value
                                nature(C + i, TotalNB) = nature(C + i, TotalNB) + Range("N" & Rg.Row).Value
                             Exit For
                             End If
                        Next Rg2
                    Exit For
                End If
              Next i
            End If
        Next Rg

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

Discussions similaires

  1. Problème boucle infinie
    Par Hafa10 dans le forum Langage
    Réponses: 9
    Dernier message: 16/05/2015, 19h01
  2. [XL-2007] Problème boucle infinie
    Par s.byczek dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/02/2012, 14h49
  3. problème boucle infinie
    Par hanou88 dans le forum C
    Réponses: 7
    Dernier message: 05/11/2010, 01h15
  4. Problème de boucle infinie...
    Par anne-so dans le forum Langage
    Réponses: 1
    Dernier message: 25/04/2006, 14h10
  5. [JMeter] Problème avec la boucle infinie pour les tests
    Par zegreg dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 05/10/2005, 11h41

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