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 :

Boucle For qui ne fonctionne pas pour toutes les valeurs [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 23
    Points : 13
    Points
    13
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Refais ce petit test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To 5
        Debug.Print i & "  " & TabColInfo(i).colonne
        If TabColInfo(i).colonne > 0 Then
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Qu'est ce que tu as comme valeur de TabColInfo(i).colonne quand i=0?
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    TabColInfo(0).colonne = 33

    J'utilise la colonne 33 pour mettre la date du jour donc i = 0 n'est pas dans ma boucle.

  6. #6
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Excuses, je voulais dire quand i=2
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    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)...

  8. #8
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Il ne reste qu'à joindre un fichier exemple sans données confidentielles
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    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 Fichiers attachés

  10. #10
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    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 : 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
    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.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    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 !!

  12. #12
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Les colonnes DWH, US, EAI, SIG, Date de MAJ, Décalage TTD, ne sont jamais remplies.
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    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 !

  14. #14
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    C'était un problème au niveau des Find

    Remplace tes 3 procédures par celles-ci
    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
    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.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    Ca fonctionne !

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

    ++

  16. #16
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Pour optimiser le code, remplace la sub concernée par celle-ci
    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
    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.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

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

Discussions similaires

  1. [CakePHP] Behavior Cakephp 3 qui ne fonctionne pas avec toutes les entity associées
    Par HBPOM dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 27/03/2015, 13h34
  2. une boucle for qui ne fonctionne pas
    Par piffeo dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/11/2008, 21h52
  3. Fonction mysql qui ne fonctionne pas pour un ancien postgreIste
    Par floreasy dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 15/01/2008, 18h49
  4. boucle for qui ne marche pas
    Par Invité dans le forum Langage
    Réponses: 16
    Dernier message: 12/06/2006, 10h59
  5. Requete qui ne fonctionne pas sur toutes les versions de MySQL
    Par goldorax113 dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/06/2006, 11h04

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