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 avec une boucle de type Do While =>Loop


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Points : 478
    Points
    478
    Par défaut Problème avec une boucle de type Do While =>Loop
    Bonjour,

    Afin de compiler des données mensuelles dans un onglet global, j'ai monté ce 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
    Application.ScreenUpdating = False
    Dim SN As Byte, SNN As String, FR As Long, LR As Long
     
    On Error Resume Next
     
        For SN = 2 To 13
        SNN = Sheets(SN).Name
            With Sheets(SN)
                .Range("A2:" & .Range("A2").SpecialCells(xlCellTypeLastCell).Address).Copy Sheets(1).Range("B65536").End(xlUp).Offset(1, 0)
            End With
            With Sheets(1)
                FR = .Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0).Row
                LR = .Cells(.Rows.Count, 2).End(xlUp).Row
                .Range("A" & FR & ":A" & LR).Value = SNN
            End With
        Next
    End Sub
    Problème, ma dernière instruction avant le Next consiste à récupérer le nom de l'onglet (qui n'est autre que le mois...) pour le coller en colonne A de mon onglet global. Ca me créé un décalage car malgré l'absence d'onglet, la boucle continue pour m'insérer le nom du dernier onglet jusqu'à 13...

    J'ai pensé à faire ceci comme ci-dessous pour parer à ce souci :

    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
    Application.ScreenUpdating = False
    Dim SN As Byte, SNN As String, FR As Long, LR As Long
    SN = 2
     
        Do While SN <> 0
        SNN = Sheets(SN).Name
            With Sheets(SN)
                .Range("A2:" & .Range("A2").SpecialCells(xlCellTypeLastCell).Address).Copy Sheets(1).Range("B65536").End(xlUp).Offset(1, 0)
            End With
            With Sheets(1)
                FR = .Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0).Row
                LR = .Cells(.Rows.Count, 2).End(xlUp).Row
                .Range("A" & FR & ":A" & LR).Value = SNN
            End With
            SN = SN + 1
        Loop
     
    End Sub
    Bien entendu ça ne marche pas (je ne maîtrise pas encore ce type de boucle)
    Ce que je veux dire ici : C'est que si il n'y a plus d'onglet, alors on sort de la boucle.
    Pourriez-vous m'aider SVP ?

    Merci d'avance !

  2. #2
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour RunSh,

    peut-être simplement remplacer

    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For SN = 2 To sheets.count
    Et je te conseille d'enlever le On error resume next...

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    Citation Envoyé par tototiti2008 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For SN = 2 To sheets.count
    Ce n'est qu'un détail mais mieux vaut utiliser:

    que

    Car la collection Sheets contiens tous les onglets du classeur alors que la collection WorkSheets ne contient que les feuilles de calcul.
    Tant qu'il n'y a que des feuilles de calcul, ça va mais s'il y a des feuilles graphiques ou autres...

  4. #4
    Membre confirmé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Points : 478
    Points
    478
    Par défaut
    Bonjour tototiti2008, bonjour Sclarckone,

    Merci pour vos réponses à tous les deux. Elles vont résoudre mon problème.
    Pour ma culture perso, je te remercie Sclarckone pour tes explications sur la différence entre "sheets" et "worksheets", encore quelque chose que je ne connaissais pas et qui va m'être bien utile (même si dans la pratique sur ce fichier là, je n'ai aucun problème car il n'y a que des feuilles de calculs).
    Par contre, tototiti2008, peux-tu m'expliquer m'expliquer pourquoi le

    est à enlever ? Dans ma tête, je pensais que ceci allait justement me permettre de sortir de la boucle dès qu'il ne trouverai plus d'onglet (puisque moins de 13 si tel est le cas).

    En tout cas encore merci !!

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    est "dangereux" parce qu'il ne fait pas de distinction sur le type d'exception qui est levé. Du coup si une exception est levée dans une autre partie du code que celle où tu t'y attends, l'exécution va quand même continuer et tu peux obtenir un comportement imprévu et inexplicable (au moins à première vue).
    C'est donc à utiliser avec beaucoup de précautions!

    Dans ton cas, c'est même inutile car utiliser:

    te permet de sortir de la boucle lorsqu'il n'y a plus de feuilles de calcul et sans lever d'exception.

  6. #6
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 239
    Points : 307
    Points
    307
    Par défaut
    Bonjour,

    j'utilise plutôt des structures de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    do
    instruction
    loop while condition
    dans ton cas , la condition
    n'est jamais vérifié car SN est initialisé à 2 et tu ne fais que l'incrémenter.

    Ta façon de faire pêche à cause des contraintes qu'elle impose : il faut que le fichier de consolidation soit ouvert en premier ou en dernier pour choisir les bornes 1 à 12 ou 2 à 13.
    Je te propose une autre structure pour avoir la liste ordonnée
    ex :
    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
     
     
    liste_mois = array ( "janvier" , "fevrier" ,"mars" , "avril" ..'tu mets le reste des mois.... )   
     
    for each  mois_ in liste_mois
      for each Feuil in worksheets
    if Feuil.name = mois then 
    ' traitement
    end if 
    next 
    next 
     
     
     
    next

  7. #7
    Membre confirmé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Points : 478
    Points
    478
    Par défaut
    J'adore ce forum, on apprend à faire des choses de x manières différentes.
    Merci pour l'eau que tu as apporté à mon moulin CodeFacile, je vais le tester et le mettre de côté, il me sera forcément utile car toutes mes macros font + ou - la même chose ^^

  8. #8
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour Sclarckone, bonjour CodeFacile,
    Re,

    Dans ton cas, c'est même inutile car utiliser:

    Code :
    WorkSheets.Count
    te permet de sortir de la boucle lorsqu'il n'y a plus de feuilles de calcul et sans lever d'exception.
    Parfaitement juste, mais dans ce cas il faudra également changer tous les "Sheets" du code en "Worksheets", sinon on peut avoir des surprises s'il y a une feuille graphique... pas seulement dans la boucle du For

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

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Bonjour,

    petite remarque complémentaire sur la gestion en boucle des sheets (ou worksheets) via le code :
    C'est extrêmement dangereux car en finalité, tu ne connais pas vraiment le numéro de ta feuille, et ce n'est absolument pas parce que tu as 13 feuilles qu'elles portent le numéro de 2 à 13, et donc Sheet2 n'est pas nécessairement la deuxième feuille.

    Si par exemple tu as 3 feuilles et rajoute 1 feuille, tu peux courament avoir ta liste Microsoft Excel object dans vba qui est
    Sheet1(Sheet1)
    Sheet2(Sheet2)
    Sheet3(Sheet4)
    Sheet4(Sheet3)

    J'en ai fait les frais et tu peux chercher trèèèèèèèèèèès longtemps avant de trouver.

    Mais, c'était juste une remarque.

  10. #10
    Membre confirmé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Points : 478
    Points
    478
    Par défaut
    C'est vrai tototiti2008, il faut être cohérent et bien penser à utiliser Worksheets ou Sheets partout, sinon ça peut vite faire n'importe quoi...

    Ta remarque est parfaitement vrai Godzestla, mais dans mon cas je n'ai aucun risque car ma première feuille est celle des données annuelles, et les 12 suivantes les mois de janvier à décembre. A moins que les technocrates décident de changer notre système calendaire, je n'ai pas de risque ^^

  11. #11
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour Godzestla,
    Re,

    @Godzestla : il faut bien faire la distinction entre le CodeName d'une feuille (nom dans Visual Basic Editor), le Name (nom de l'onglet) et le numéro.
    Ces 3 notions sont parfaitement indépendantes
    Comme le code de RunSh se base sur le numéro

    For SN = 2 To 13
    SNN = Sheets(SN).Name
    Ce qu'il faut lui préciser c'est que la feuille des données annuelles (non parcourue par sa boucle) doit absolument rester en première position, si on déplace les onglets de feuilles le code ne fonctionne plus...

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

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    @tototiti2008:

    Bien d'accord avec toi.

    Mais personnellement je bouclerais sur toutes les feuilles en omettant donc celle dont le nom (.name) est celui de l'actuelle feuille 1.

    Ainsi, le blindage est....meilleur.

    Et puis SN et SNN, c'est pour moi très peu parlant en cas de maintenance peu fréquente et aussi sujet à gros soucis en cas d'erreur de frappe (1 N de plus et on parle d'autrechose). SN_Name serait bien meilleur que SNN.

    Mais bon, c'est en forgeant qu'on ....

  13. #13
    Membre confirmé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Points : 478
    Points
    478
    Par défaut
    Je vais suivre vos conseils, il est vrai que c'est peu fiable, et que dans ma tête c'est facile car SN = Sheet Number et SNN = Sheet Number Name...
    En tout cas merci pour toutes vos petites combines qui me seront très utiles.
    Bon allez, je vous laisse, je vais continuer à forger

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

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Et les forgerons nihilistes ne sont sans doute pas légion.

  15. #15
    Membre confirmé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Points : 478
    Points
    478
    Par défaut
    J'ai tiré ça de mon film culte...
    J'avoue que je préfère "chercheur de bonheur", en espérant que tu puisses te targer de l'avoir trouvé
    Bonne journée Godzestla, et encore merci pour tous tes conseils utiles

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

Discussions similaires

  1. Problème avec une boucle do while
    Par azertym dans le forum VBA Access
    Réponses: 2
    Dernier message: 21/02/2012, 14h37
  2. [AC-2007] Probléme avec une boucle DO While
    Par theBinette dans le forum VBA Access
    Réponses: 2
    Dernier message: 12/02/2010, 17h10
  3. problème avec une boucle
    Par mars315 dans le forum Langage
    Réponses: 14
    Dernier message: 25/11/2006, 08h39
  4. Problème avec une boucle for
    Par cisse18 dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 29/03/2006, 16h50
  5. [MySQL] Problème avec une boucle
    Par yayacameleon dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 09/03/2006, 09h53

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