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 10/02/2012, 11h42   #1
Invité régulier
 
Inscription : juin 2007
Messages : 23
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 23
Points : 5
Points : 5
Par défaut Boucle For qui ne fonctionne pas pour toutes les valeurs

Bonjour à tous,

Je rencontre un problème assez particulier...

J'ai une boucle qui rempli des cases d'une feuille Excel.

Code :
1
2
3
4
5
 For i = 1 To 5
        If Not TabColInfo(i).colonne = 0 Then
            Sheets("Projets").Cells(ligne_vide, TabColInfo(i).colonne).Value = TabColInfo(i).infosaisie
        End If
    Next i
ligne_vide est le numéro de la 1ère ligne vide déterminée dans une autre fonction.
TabColInfo(i).colonne est le numéro de colonne déterminée dans une autre fonction.
TabColInfo(i).infosaisie est la valeur à mettre dans la case et qui vient d'une saisie dans un Userform.

Mon problème est que pour i = 1, 3, 4 et 5 tout se passe bien mais pas pour i = 2 !!!!
Encore plus surprenant, quand je fait une ligne dédiée pour i = 2, ca fonctionne très bien !
Code :
1
2
'i = 2
'Sheets("Projets").Cells(ligne_vide, TabColInfo(i).colonne).Value = TabColInfo(i).infosaisie
Précision : ca fonctionnait très bien au début et plus du tout du jour au lendemain...

Je ne suis pas un pro de VB, il y a peut être une particularité qui m'échappe, en tout cas ma logique reste perplexe...

Quelqu'un a-t-il une idée d'où pourrait venir le problème ?
Merci d'avance pour votre aide.
pleskyd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 11h49   #2
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Refais ce petit test
Code :
1
2
3
For i = 1 To 5
    Debug.Print i & "  " & TabColInfo(i).colonne
    If TabColInfo(i).colonne > 0 Then
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 13h13   #3
Invité régulier
 
Inscription : juin 2007
Messages : 23
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 23
Points : 5
Points : 5
Merci pour la réponse, mais j'avais déjà fait le test et toutes mes variables contiennent bien la bonne valeur au moment de ma boucle.

Par contre je viens de faire une modif de la valeur max de ma variable i. Pour l'exemple j'avais mis 5 mais en fait dans mon code c'est une valeur x qui vaut 103.

Code :
1
2
3
4
5
6
 const x = 103
For i = 1 To x
        If Not TabColInfo(i).colonne = 0 Then
            Sheets("Projets").Cells(ligne_vide, TabColInfo(i).colonne).Value = TabColInfo(i).infosaisie
        End If
    Next i
Quand je remplace x par une petite valeur (5 ou 10), le cas i = 2 fonctionne. Quand x est une grande valeur (103), le cas i = 2 ne fonctionne pas, pourtant les autres cas i =1 , 3, ..., 103 fonctionnent bien.

Il y a une raison logique ? Ca va me rendre fou ce truc...
pleskyd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 13h16   #4
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Qu'est ce que tu as comme valeur de TabColInfo(i).colonne quand i=0?
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 13h26   #5
Invité régulier
 
Inscription : juin 2007
Messages : 23
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 23
Points : 5
Points : 5
TabColInfo(0).colonne = 33

J'utilise la colonne 33 pour mettre la date du jour donc i = 0 n'est pas dans ma boucle.
pleskyd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 13h37   #6
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Excuses, je voulais dire quand i=2
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 13h43   #7
Invité régulier
 
Inscription : juin 2007
Messages : 23
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 23
Points : 5
Points : 5
TabColInfo(i).colonne a la valeur 3 quand i = 2.
Mais dans la case (ligne_vide, 3) rien ne s'affiche (sauf si x est petit)...
pleskyd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 14h25   #8
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Il ne reste qu'à joindre un fichier exemple sans données confidentielles
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 14h57   #9
Invité régulier
 
Inscription : juin 2007
Messages : 23
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 23
Points : 5
Points : 5
Et voici.
Alors... La boucle en question se trouve dans le module Parcours_Création_Projet et dans Sub remplis_cellules()

Pour tester il faut aller dans l'onglet "Action" du fichier Excel et cliquer sur le bouton "Ajouter une ligne projet".
Ensuite il faut remplir les champs obligatoires du formulaire qui s'affiche.

Une fois le parcours de userform terminé, onglet "Action" -> bouton "Consulter le portefeuille" et aller à la dernière ligne observer les modifications.
Fichiers attachés
Type de fichier : zip Classeur2.zip (311,4 Ko, 4 affichages)
pleskyd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 16h04   #10
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Bon, c'est trop pour tester néanmoins, je me suis permis de tester ton code autrement (et sans utilisation des userform) pour éventuellement pouvoir discerner le problème.

Ci-joint le code utilisé
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
69
70
Public Creation As Boolean
Public S1 As String
Public S2 As String
Dim Ligne_vide As Integer
Dim i As Integer
Type ColonneEtInfoSaisie
    LibelleColonne As String
    Colonne As Integer
    InfoSaisie As String
End Type
Const x = 103
Global TabColInfo(x) As ColonneEtInfoSaisie
 
Sub Parcours_Creation_Projet()
Dim j As Integer
 
'---Pour le test à la place des usf
For j = 1 To x
    TabColInfo(j).InfoSaisie = "P-AA-BBBB" & j
Next j
'---
Creation = True
If Creation = True Then
    Call Trouve_Numeros_Des_Colonnes
    Call Trouve_1ere_Ligne_Vide
    Call Remplis_Cellules
End If
End Sub
 
Sub Trouve_Numeros_Des_Colonnes()
Dim Colonne_Existe As Range
 
For i = 0 To x
    TabColInfo(i).LibelleColonne = Sheets("Listes").Cells(i + 2, Sheets("Listes").Range("A1", "Z1").Find("Libellés Colonnes", Range("A1"), , , , xlNext).Column)
    Set Colonne_Existe = Sheets("Projets").Range("A1", "EZ4").Find(TabColInfo(i).LibelleColonne, Range("A1"), , , , xlNext)
    If Not Colonne_Existe Is Nothing Then
        TabColInfo(i).Colonne = Sheets("Projets").Range("A1", "EZ4").Find(TabColInfo(i).LibelleColonne, Range("A1"), , , , xlNext).Column
        Set Colonne_Existe = Nothing
    Else
        TabColInfo(i).Colonne = 0
    End If
Next i
 
End Sub
 
Sub Trouve_1ere_Ligne_Vide()
 
Ligne_vide = Sheets("Projets").UsedRange.Find("*", Cells(1, TabColInfo(0).Colonne), , , , xlPrevious).Row + 1
End Sub
 
Sub Remplis_Cellules()
Dim j As Integer
 
With Worksheets("Projets")
    .Range("O1:AA1").Copy .Cells(Ligne_vide, 15)
    .Range("AD1").Copy .Cells(Ligne_vide, 30)
    .Range("AF1").Copy .Cells(Ligne_vide, 32)
    .Range("B1").Copy .Cells(Ligne_vide, 2)
 
    'rempli le fichier avec les valeurs saisies
    For i = 1 To x
        Debug.Print "i " & i & " - Colonne: " & TabColInfo(i).Colonne & " - InfoSaisie: " & TabColInfo(i).InfoSaisie
        If TabColInfo(i).Colonne > 0 Then
            .Cells(Ligne_vide, TabColInfo(i).Colonne).Value = TabColInfo(i).InfoSaisie
            j = j + 1
        End If
    Next i
End With
MsgBox j & " =x, TabColInfo(i).Colonne>0 quelque soit i (pas de problème pour i=2)"
End Sub
J'ai changé x de 1 à 103 sans rencontrer le problème à ce niveau.
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 16h39   #11
Invité régulier
 
Inscription : juin 2007
Messages : 23
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 23
Points : 5
Points : 5
Ok je vois ce que tu as fais.
Tu as été vérifier dans l'onglet "Projets" que toutes les cellules de la dernière ligne soient remplis ?

Du coup il sort d'où mon problème ?
Je peux traiter cette ligne à part pour que ca fonctionne mais c'est moche et rageant parce qu'incompréhensible !!
pleskyd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 16h43   #12
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Les colonnes DWH, US, EAI, SIG, Date de MAJ, Décalage TTD, ne sont jamais remplies.
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 16h49   #13
Invité régulier
 
Inscription : juin 2007
Messages : 23
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 23
Points : 5
Points : 5
Date de Maj et Décalage TTD c'est normal.

Par contre DWH, US, EAI, SIGMA devraient se remplir. Je pense que tu as pu recréer le problème mais sur d'autres cellules.

Dans un sens ca me rassure... Je ne suis donc pas fou !
pleskyd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 19h15   #14
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
C'était un problème au niveau des Find

Remplace tes 3 procédures par celles-ci
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
Sub Trouve_Numeros_Des_Colonnes()
Dim c As range
 
With Worksheets("Projets")
    For i = 0 To x
        With Worksheets("Listes")
            Set c = .range("A1:Z1").Find("Libellés Colonnes", LookIn:=xlValues, lookat:=xlWhole)
            If Not c Is Nothing Then
                TabColInfo(i).LibelleColonne = .Cells(i + 2, c.Column).Value
                Set c = Nothing
            End If
        End With
        If TabColInfo(i).LibelleColonne <> "" Then
            Set c = .Rows("2:4").Find(TabColInfo(i).LibelleColonne, LookIn:=xlValues, lookat:=xlWhole, SearchDirection:=xlPrevious)
            If Not c Is Nothing Then
                TabColInfo(i).Colonne = c.Column
                Set c = Nothing
            End If
        End If
    Next i
End With
End Sub
 
Sub Trouve_1ere_Ligne_Vide()
 
With Worksheets("Projets")
    Ligne_vide = .UsedRange.Find("*", .Cells(1, TabColInfo(0).Colonne), , , xlByColumns, xlPrevious).Row + 1
End With
End Sub
 
Sub Remplis_Cellules()
Dim j As Integer
 
With Worksheets("Projets")
    .range("O1:AA1").Copy .Cells(Ligne_vide, 15)
    .range("AD1").Copy .Cells(Ligne_vide, 30)
    .range("AF1").Copy .Cells(Ligne_vide, 32)
    .range("B1").Copy .Cells(Ligne_vide, 2)
 
    'Rempli le fichier avec les valeurs saisies
    For i = 0 To x
        If TabColInfo(i).Colonne > 0 Then .Cells(Ligne_vide, TabColInfo(i).Colonne).Value = IIf(i = 0, Date, TabColInfo(i).InfoSaisie)
    Next i
End With
End Sub
Attention quand même à l'utilisation abusive et injustifiée des variables publiques.
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/02/2012, 14h54   #15
Invité régulier
 
Inscription : juin 2007
Messages : 23
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 23
Points : 5
Points : 5
Ca fonctionne !

Merci beaucoup mercatog d'avoir pris le temps de m'aider, je vais (peut-être) enfin pouvoir finir mon dev

++
pleskyd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2012, 15h16   #16
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Pour optimiser le code, remplace la sub concernée par celle-ci
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
Sub Trouve_Numeros_Des_Colonnes()
Dim LaCol As Integer
Dim c As Range
 
With Worksheets("Listes")
    Set c = .Range("A1:Z1").Find("Libellés Colonnes", LookIn:=xlValues, lookat:=xlWhole)
    If Not c Is Nothing Then
        LaCol = c.Column
        Set c = Nothing
    End If
End With
 
With Worksheets("Projets")
    If LaCol > 0 Then
        For i = 0 To x
            TabColInfo(i).LibelleColonne = Worksheets("Listes").Cells(i + 2, LaCol).Value
 
            If TabColInfo(i).LibelleColonne <> "" Then
                Set c = .Rows("2:4").Find(TabColInfo(i).LibelleColonne, LookIn:=xlValues, lookat:=xlWhole, SearchDirection:=xlPrevious)
                If Not c Is Nothing Then
                    TabColInfo(i).Colonne = c.Column
                    Set c = Nothing
                End If
            End If
        Next i
    End If
End With
End Sub
__________________
Cordialement.
mercatog 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 09h53.


 
 
 
 
Partenaires

Hébergement Web