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 de type For Each en Dynamique [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif Avatar de L'Albatros
    Homme Profil pro
    Chercheur en économie - statistique
    Inscrit en
    Avril 2012
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en économie - statistique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2012
    Messages : 150
    Points : 239
    Points
    239
    Par défaut Boucle de type For Each en Dynamique
    Bonjour,

    Je coince sur un détail de la boucle de type For Each:
    Comment fait-on pour allouer à Range une plage "dynamique" ?
    Dans mon cas le nombre de colonnes est fixe, le nombre de lignes est variable...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'Dim Plage As Range, Cellule As Range
     
        Set Plage = ActiveSheet.Range("D1:F10")  'Selection.CurrentRegion.Select End(xlDown).End(xlToRight)...j'ai essayé tout l'arsenal
        For Each Cellule In Plage
            If Cellule Is Nothing Or (Cellule.Value = "") Then
                Cellule.Value = "0"
            End If
        Next Cellule
    Merci d'avance de votre aide

  2. #2
    Membre chevronné Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Auto-entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Points : 1 900
    Points
    1 900
    Par défaut
    salut

    en regardant tes lignes, il semblerait que certaines cellule soient vides, donc en allant vers le bas ca ne peut pas fonctionner, il faut remonter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A65536").end(xlup)

  3. #3
    Membre actif Avatar de L'Albatros
    Homme Profil pro
    Chercheur en économie - statistique
    Inscrit en
    Avril 2012
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en économie - statistique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2012
    Messages : 150
    Points : 239
    Points
    239
    Par défaut
    Je viens d'essayer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    'Dim Plage As Range, Cellule As Range
     
        Set Plage = ActiveSheet.Range("D65536").End(xlUp)
     
        For Each Cellule In Plage
            If Cellule Is Nothing Or (Cellule.Value = "") Then
                Cellule.Value = "0"
            End If
        Next Cellule
    Mes cellules de la colonne D restent vides...

    Pour info, j'avais coder ceci qui fonctionnait très bien mais qui n'est pas du tout optimisé:

    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
    'For Compteur_boucle = 1 To Range("A2").End(xlDown).Row
        If Range("F" & Compteur_boucle) = "" Then
            Range("F" & Compteur_boucle) = "Cellule Vide"
        End If
        If Range("G" & Compteur_boucle) = "" Then
            Range("G" & Compteur_boucle) = "Cellule Vide"
        End If
        If Range("J" & Compteur_boucle) = "" Then
            Range("J" & Compteur_boucle) = "Cellule Vide"
        End If
        If Range("K" & Compteur_boucle) = "" Then
            Range("K" & Compteur_boucle) = "Cellule Vide"
        End If
        If Range("L" & Compteur_boucle) = "" Then
            Range("L" & Compteur_boucle) = "Cellule Vide"
        End If
     
    Next Compteur_boucle
    En plus de faire ramer la bécane, c'est vraiment sale comme code.

  4. #4
    Membre chevronné Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Auto-entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Points : 1 900
    Points
    1 900
    Par défaut
    re:

    regarde ta ligne, elle ne fait référence qu'à une seule cellule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Plage = ActiveSheet.Range("D65536").End(xlUp)
    il faut définir une plage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set plage = range("D1:D" & range("d65536").end(xlup).row)

  5. #5
    Membre actif Avatar de L'Albatros
    Homme Profil pro
    Chercheur en économie - statistique
    Inscrit en
    Avril 2012
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en économie - statistique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2012
    Messages : 150
    Points : 239
    Points
    239
    Par défaut
    Ok. Adapté, cela nous donne ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Set Plage = ActiveSheet.Range("D1:AC" & Range("d65536").End(xlUp).Row)
     
        For Each Cellule In Plage
            If Cellule Is Nothing Or (Cellule.Value = "") Then
                Cellule.Value = "0"
                Else
                'on saute à la cellule suivante
            End If
        Next Cellule
    Ca fonctionne, mais je voudrais savoir si l'on peut optimiser l'algo:
    En effet je travaille sur un tableau de 5000 lignes et 25 colonnes...

    Y aurait-il un moyen pour diminuer le temps de calcul ?

    merci d'avance

  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
    Adapte le nom de la feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil1").UsedRange.Replace "", 0

  7. #7
    Membre expérimenté Avatar de nchal
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 512
    Points : 1 656
    Points
    1 656
    Par défaut Simple
    il suffit d'utiliser la méthode UsedRange.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Set Plage = ActiveSheet.UsedRange  
        For Each Cellule In Plage
            If Cellule Is Nothing Or (Cellule.Value = "") Then
                Cellule.Value = "0"
            End If
        Next Cellule
    Après, je te laisse te documenter sur la méthode UsedRange.

    edit: j'ai une heure de retard sur mercatog

  8. #8
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonsoir,
    je préfère de beaucoup, la méthode à mercatog, on se passe de boucle
    en la modifiant un peu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With ActiveSheet
      Set PLAGE = .Range("D1:AC" & Range("D" & .Rows.Count).End(xlUp).Row)
      PLAGE.Replace "", 0
    End With

  9. #9
    Membre actif Avatar de L'Albatros
    Homme Profil pro
    Chercheur en économie - statistique
    Inscrit en
    Avril 2012
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en économie - statistique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2012
    Messages : 150
    Points : 239
    Points
    239
    Par défaut
    Merci à tous !

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

Discussions similaires

  1. insertion de données issues d'un array sans boucles de type for each ou while.
    Par piotrowski-s dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 05/09/2012, 11h27
  2. problème avec boucle Sub et For each
    Par lbroc84 dans le forum VBScript
    Réponses: 1
    Dernier message: 23/08/2011, 19h18
  3. Boucle imbriquée avec for each et while
    Par guen dans le forum Access
    Réponses: 7
    Dernier message: 01/03/2007, 17h36
  4. boucle <xsl:for-each>
    Par Mike35 dans le forum XSL/XSLT/XPATH
    Réponses: 17
    Dernier message: 13/02/2006, 11h58
  5. Boucle For each
    Par roots_man dans le forum ASP
    Réponses: 10
    Dernier message: 18/02/2005, 09h55

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