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 de boucle for


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur JAVA & PHP
    Inscrit en
    Mai 2013
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur JAVA & PHP
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2013
    Messages : 86
    Par défaut Problème de boucle for
    Bonjour,

    J'essai de parcourir une feuille avec une boucle for pratique que j’utilise régulièrement pourtant cette fois je n'arrive pas a comprendre pourquoi je n'entre pas dans ma boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
           For i = 4 To Worksheets("Traitements").Range("A50").End(xlUp).Row
     
                MsgBox Worksheets("Traitements").Range("A" & i).Value
     
            Next

  2. #2
    Expert éminent 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
    Par défaut
    remplace A50 par A48454

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur JAVA & PHP
    Inscrit en
    Mai 2013
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur JAVA & PHP
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2013
    Messages : 86
    Par défaut
    Effectivement ça fonctionne seulement on va parcourir toute la feuille de calcul alors que j'ai des données sur les 300 première lignes.

  4. #4
    Expert éminent 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
    Par défaut
    Non
    Le end(xlup) remonte a partir du nombre de lignes choisi jusqu'à la dernière cellule remplie.
    En réalité en fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("toto")range("A" &rows.count).end(xlup).row

  5. #5
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Si je puis me permettre.

    on va parcourir toute la feuille de calcul
    Pas du tout.
    Teste en intégrant cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Msgbox Worksheets("Traitements").Range("A6500").End(xlUp).Row
    En ce qui concerne la dernière ligne, pour ma part, je préfère coder ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim dernl as Integer 'Adapter éventuellement en Long
    With Worksheets("lafeuille")
       dernl = .Cells(.Rows.Count,1).End(xlUp).Row
    End With
    Et ce justement pour cette précaution ci-dessus.

  6. #6
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Bonjour à tous,

    Je vais ajouter mon grain sel

    je suis d'accord avec ce qui à été dis précédemment cependant

    - Dans le cas où il y a peu de lignes et pas de ligne vide on peut descendre de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DerLign = [A1].End(xlDown).Row
    car il s'arrête à la premirère ligne vide

    - Dans le cas ou on veut la dernière ligne utilisée quelque soit la colonne sans que l'on sache quelle est la colonne la plus longue on peut utilisé ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Der_Lign_Max = ThisWorkbook.Worksheets("Traitements").UsedRange.Rows.Count
     
    'et cela marche en colonne aussi
     
    Der_Col_Max = ThisWorkbook.Worksheets("Traitements").UsedRange.Columns.Count

    PS : j'avoue que j'utilise beaucoup cette dernière, mais cela n'enlève rien aux codes précedemment proposés qui fonctionnent très bien

  7. #7
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut Igloobel

    Dans le cas où il y a peu de lignes et pas de ligne vide on peut descendre de cette façon :
    Pour ma part, quel que soit le nombre de lignes, mieux vaut partir de la dernière de la feuille.
    C'est à mon avis une habitude à prendre.

    Dans le cas ou on veut la dernière ligne utilisée quelque soit la colonne sans que l'on sache quelle est la colonne la plus longue on peut utilisé ce code
    Oui.
    Mais à condition que le champ de données débute en A1.
    Ouvre une nouvelle feuille et entre des données de B8 à E10.
    Reviens avec le résultat du code que tu proposes.

    En règle générale; même si j'y déroge parfois, j'utilise la propriété UsedRange avec la plus grande parcimonie.
    Le moindre format modifié, le moindre effacement peut en altérer la valeur.

    Pour connaître la dernière ligne, sans connaître la colonne à tester, je préfère considérer le maximum des dernières lignes de chaque colonne.

    Peut-être SpecialCells. Et encore...

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur JAVA & PHP
    Inscrit en
    Mai 2013
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur JAVA & PHP
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2013
    Messages : 86
    Par défaut
    Merci à vous 2 pour votre aide


  9. #9
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour le fil,

    Que ce soit avec UsedRange ou avec CurrentRegion, il faut tenir compte de l'emplacement du début de la zone.
    Dans ce cas, quel que soit l'emplacement j'utilise toujours :
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With ThisWorkbook.Worksheets("MaFeuille")
      Der_Lign = .UsedRange.Row +.UsedRange.Rows.Count -1
      ' ou 
      Der_Lign = .CurrenRegion.Row +.CurrentRegion.Rows.Count -1
    End With

  10. #10
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour à vous, Bonjour au Forum,

    Pour Patrice.

    Pas plus.
    J'ai testé
    Sur une nouvelle feuille, informer G11 à M19
    En cellule H23, juste un motif de fond (couleur)
    Le code que tu indiques retourne 23.

  11. #11
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Par défaut
    Bonjour

    J’avais déjà signalé ce problème de dernière ligne avec .End(xlup) dans mon classeur :
    Retrouvez-vous cela avec vos versions ou est-ce mon classeur qui est corrompu ?
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

  12. #12
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour Ordonc,

    Il y a un code particulier pour les tableaux structurés

    Je réunis actuellement plusieurs codes à ce sujet.

    Adapte 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Option Explicit
     
    Sub Macro1()
     
    Dim laligne As Byte
     
    With Worksheets("ENTREE").ListObjects("Tableau1")
              'indice dans la feuille, de la ligne correspondant à la première cellule vide du premier champ du tableau
               'Voir aussi plus bas
               laligne = .ListColumns("Date").Range.Find("", SearchDirection:=xlNext).Row
               'indice relatif dans l'objet tableau1, de la ligne correspondant à la première cellule vide du premier champ du tableau
               laligne = laligne - .HeaderRowRange.Row
                'remplissage ligne
               .ListColumns("Date").DataBodyRange.Rows(laligne).Value = 1
               'Replacer en plage normale
               .Unlist
    End With
     
    ''indice dans la feuille, de la ligne correspondant à la première cellule vide du premier champ du tableau
    'idem que plus haut mais plus fun!
     
    With Worksheets("ENTREE").ListObjects("Tableau1")
                laligne = .DataBodyRange.Row + .HeaderRowRange.Row + 1
    End With
     
    End Sub

  13. #13
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Par défaut
    Re

    Merci Marcel pour ce retour .
    Aurais-je mal présenté le problème?
    Il ne se situe qu’ici* avec la présence d’un tableau (traité ou pas**):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Dim n As Long
      For n = 2 To 8
        Cells(2, n) = Cells(Rows.Count, n).End(xlUp).Row
      Next
    * Tu préfères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim dernl as Integer 'Adapter éventuellement en Long
    With Worksheets("lafeuille")
       dernl = .Cells(.Rows.Count,1).End(xlUp).Row
    End With
    Et, sachant que Rows.Count ne dépend que du nombre de lignes admis dans le classeur donc que le . est superflu, je préfère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Dl as long
    Dll=Sheets(“lafeuille”).Cells(Rows.Count,1).End(xlUp).Row
    Mais cela n’évacue pas les réponses anormales de cette procédure .

    ** Maintenant, pour les Tableaux (ListObjets), c’est une toute autre histoire et je préfère celle que je me raconte avec des mots, des expressions simples (basiques) !

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

Discussions similaires

  1. [ActionScript] Problème avec boucle 'FOR'
    Par BnA dans le forum Flash
    Réponses: 7
    Dernier message: 02/11/2006, 09h26
  2. [VBS][Débutant] Problème syntaxe boucle For
    Par _alex_ dans le forum VBScript
    Réponses: 2
    Dernier message: 26/07/2006, 14h26
  3. problème dans boucle for de lecture de fichier ini
    Par chourmo dans le forum Delphi
    Réponses: 3
    Dernier message: 06/07/2006, 09h31
  4. [batch]inventaire réseau-problème de boucle "for"
    Par mathieu_r dans le forum Windows
    Réponses: 1
    Dernier message: 23/06/2006, 20h17
  5. [Eval] Problème de boucle for sur des tableaux
    Par battle_benny dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/01/2006, 23h55

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