Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/01/2012, 10h51   #1
Invité de passage
 
Inscription : juillet 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 14
Points : 2
Points : 2
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 :
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 !
Zaelos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 11h22   #2
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 924
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 924
Points : 7 254
Points : 7 254
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

Citation:
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 :
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

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 11h53   #3
Invité de passage
 
Inscription : juillet 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 14
Points : 2
Points : 2
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 :
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
Zaelos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 13h20   #4
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 924
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 924
Points : 7 254
Points : 7 254
Citation:
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

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 13h39   #5
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
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 :
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
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/01/2012, 14h07   #6
Invité de passage
 
Inscription : juillet 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 14
Points : 2
Points : 2
c'est bien pour retrouver une valeur numérique.

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

Je vous retournerais le code fonctionnel, ou non
Zaelos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 15h21   #7
Invité de passage
 
Inscription : juillet 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 14
Points : 2
Points : 2
Bon voilà j'ai fait quelques modifications, et le code est déjà bien plus sympathique à regarder le voici :

Code :
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 ;-)
Zaelos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 18h20   #8
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
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 :
For Each Rg In Range("A1:AN100")
Ce tableau est fixe ou le nombre de lignes est amené à varier?

Code :
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 :
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 :
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 :
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 :
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
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/01/2012, 08h33   #9
Invité de passage
 
Inscription : juillet 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 14
Points : 2
Points : 2
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 :
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 :
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 !
Zaelos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 10h49   #10
Invité de passage
 
Inscription : juillet 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 14
Points : 2
Points : 2
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 :
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
Zaelos est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h46.


 
 
 
 
Partenaires

Hébergement Web