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 While à deux arguments


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Septembre 2020
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Contrôleur de Gestion
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2020
    Messages : 32
    Par défaut Boucle While à deux arguments
    Bonjour à tous,

    J'ai adapté un code que j'utilisais déjà dans un autre fichier, et cette fois-ci, j'ai besoin de faire une boucle avec deux arguments, mais je ne pense pas que la boucle While convienne dans ce cas-là.

    Pour vous donner du contexte, j'ai un onglet "Résultats" contenant une succession de tableaux (colonnes A à F). Dans la colonne A se trouve le numéro/nom de l'onglet dont proviennent les données en colonne C (exemple de noms : 01, 02, 03 etc)
    Nom : Capture003.PNG
Affichages : 103
Taille : 4,9 Ko


    Dans l'onglet "Import", je souhaite coller les données contenues en colonne B & C de "Résultats", à partir de C8. Seulement, je ne souhaite coller que les données qui remplissent deux conditions :
    Condition 1 : en H2 de l'onglet "Import", on va inscrire le nom de l'onglet que l'on veut traiter (par exemple : 02). Je ne veux copier que les lignes qui auront en colonne A de "Résultats" la même valeur que H2 de "Import" (pas de problème sur cette étape)
    Condition 2 : en colonne C de "Résultats", il y a plusieurs mises en forme conditionnelles. En plus de la condition 1, je voudrais également que les données copiées répondent à ce critère : .DisplayFormat.Interior.Color = RGB (255,199, 206)

    Voici donc 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
     
    Sub Remplissage()
     
    Dim a As Integer, Ligne As Long, Lg As Long, rFind As Range
     
    a = ActiveSheet.Range("H2")  ' numéro d'onglet placé dans H2
    Lg = 8   ' n° ligne à partir de laquelle recopier à la suite les données
    Set rFind = Sheets("Résultats").Columns("A").Find(a) ' Recherche numéro d'onglet en colonne A de "Résultats"
        If rFind Is Nothing Then
            MsgBox "Numéro d'onglet non trouvé"
            Exit Sub
        End If
     
    Ligne = rFind.Row           '--- n° ligne première facture trouvée
    Set rFind = Nothing
    Application.ScreenUpdating = False  ' désactive rafraichissement écran
     
     
        With Sheets("Résultats")
            While .Range("A" & Ligne) = a And Cells(Ligne, 3).DisplayFormat.Interior.Color = RGB(255, 199, 206) '--- boucle sur les lignes de "trié DEF", arrêt dès que a non trouvé
                .Range("B" & Ligne & ":C" & Ligne).Copy
                ActiveSheet.Range("C" & Lg).PasteSpecial Paste:=xlPasteValues
                Lg = Lg + 1         '--- ligne suivante
                Ligne = Ligne + 1   '--- ligne suivante
                        If Lg > 9 Then
                        Rows(Lg).Insert Shift:=x1Down, CopyOrigin:=x1FormatFromLeftOrAbove
                        End If
            Wend
        End With
        Application.ScreenUpdating = True
     
    End Sub
    En appliquant ce code, il ne se produit rien (lorsque que je retire la partie And de la boucle, cela fonctionne bien).
    Si j'ai bien compris le fonctionnement de la boucle While, elle s'arrête dès qu'un élément ne correspond plus. Donc dans mon cas, elle n'a pas la possibilité de tourner sur tout mon tableau.
    j'hésite donc au type de boucle approprié.

    Pour information, dans l'onglet "Résultats", les données sont bien triées : c'est-à-dire que les noms d'onglet en colonne A sont bien regroupés (les lignes 01 sont suivies des lignes 02, puis 03... il n'y a pas de mélange)

    Auriez-vous un conseil sur le type de boucle à utiliser ?

    Merci par avance pour votre aide !

  2. #2
    Membre averti
    Homme Profil pro
    Automat
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Automat
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Par défaut AND
    Je n'ai jamais essayé avec une boucle While, je pense que ca va planter, mais si tu utilise un condition1 "AND" condition2

    Sinon effectivement passe par une autre boucle

  3. #3
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 414
    Par défaut
    Bonjour,

    Il me semble qu'il manque un point devant Cells() à la ligne 20:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            While .Range("A" & Ligne) = a And .Cells(Ligne, 3).DisplayFormat.Interior.Color = RGB(255, 199, 206)
    ' ou
            While .Range("A" & Ligne) = a And .Range("C" & Ligne).DisplayFormat.Interior.Color = RGB(255, 199, 206)
    Cordialement.

  4. #4
    Membre averti
    Femme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Septembre 2020
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Contrôleur de Gestion
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2020
    Messages : 32
    Par défaut
    Bonjour,

    Effectivement, il manque un point devant Cells, mais cela ne change pas le résultat de la macro, malheureusement.
    C'est un mystère pour moi...

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 228
    Par défaut
    Hello,
    pourquoi ne fais-tu pas un IF dans ta boucle ? comme ceci par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
           While .Range("A" & Ligne) = a 
                 If  .Cells(Ligne, 3).DisplayFormat.Interior.Color = RGB(255, 199, 206) then 
                     .Range("B" & Ligne & ":C" & Ligne).Copy
                     ActiveSheet.Range("C" & Lg).PasteSpecial Paste:=xlPasteValues
                 End If
                Lg = Lg + 1         '--- ligne suivante
                Ligne = Ligne + 1   '--- ligne suivante
                        If Lg > 9 Then
                        Rows(Lg).Insert Shift:=x1Down, CopyOrigin:=x1FormatFromLeftOrAbove
                        End If
            Wend
    Ami calmant, J.P

Discussions similaires

  1. [MySQL] Boucle WHILE, argument IF et Tableaux
    Par sim911 dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 28/02/2010, 00h44
  2. Arrêter deux boucles while
    Par ABN84 dans le forum LabVIEW
    Réponses: 4
    Dernier message: 30/04/2009, 10h51
  3. optimisation d'une requête+deux curseurs+deux boucles while
    Par jawadi95 dans le forum Développement
    Réponses: 1
    Dernier message: 10/07/2008, 10h59
  4. boucle while - passe deux fois dans la boucle.
    Par Benji01 dans le forum VBA Access
    Réponses: 2
    Dernier message: 05/05/2008, 12h23
  5. [MySQL] gestion d'affichage entre deux boucle while mysql_fetch_array()
    Par tkwleboss dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/11/2007, 21h37

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