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 code VBA [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Stagiaire
    Inscrit en
    Mai 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2019
    Messages : 18
    Par défaut Boucle code VBA
    Bonjour !

    Sur une macro que je retravaille, il y a un bout de code dont je ne comprend pas le sens ni l'utilité, une âme charitable pour me le faire comprendre ou bien encore me l'optimiser ?
    Voici la boucle en question :
    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
     
    i = 1
    J = 1
     
        Do While Cells(i, J) <> "DISPONIBLE"
            If J < 10 Then
            J = J + 1
            Else
            J = 1
            i = i + 1
            End If
        Loop
     
     
        Do While Cells(i, J) <> ""
            If Left(Cells(i, 1), 5) <> "Total" Then
                If Cells(i, J).Value < 0 Then
     
                    Cells(i, J).Select
     
                    With Selection.Interior
                        .PatternColorIndex = xlAutomatic
                        .Color = 255
     
                    End With
     
                Else
     
                    Cells(i, J).Select
     
                    With Selection.Interior
                        .Pattern = xlNone
                        .TintAndShade = 0
                        .PatternTintAndShade = 0
     
                    End With
     
     
                End If
            End If
            i = i + 1
        Loop
    Merci d'avance !

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Bonjour.

    À mon avis c'est cela :

    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
     
    i = 1
    J = 1
     
        '=== Cherche la première cellule qui ne contient pas le mot "DISPONIBLE" dans les colonnes A à I.
        Do While Cells(i, J) <> "DISPONIBLE"
            If J < 10 Then
                 J = J + 1
            Else
                J = 1
                i = i + 1
            End If
        Loop
        '--- Cherche la première cellule qui ne contient pas le mot "DISPONIBLE" dans les colonnes A à I.
     
        '=== Formate les cellules de la colonne de la première cellule qui ne contient pas le mot "DISPONIBLE" jusqu'à la 1ère qui est vide
        ' En partant de la première cellule qui ne contient pas le mot "DISPONIBLE"
        Do While Cells(i, J) <> ""
            If Left(Cells(i, 1), 5) <> "Total" Then
                If Cells(i, J).Value < 0 Then
     
                    Cells(i, J).Select
     
                    With Selection.Interior
                        .PatternColorIndex = xlAutomatic
                        .Color = 255
     
                    End With
     
                Else
     
                    Cells(i, J).Select
     
                    With Selection.Interior
                        .Pattern = xlNone
                        .TintAndShade = 0
                        .PatternTintAndShade = 0
     
                    End With
     
     
                End If
            End If
            i = i + 1
        Loop
        '--- Formate les cellules de la colonne de la première cellule qui ne contient pas le mot "DISPONIBLE" jusqu'à la 1ère qui est vide
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Bonjour,


    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
     
    i = 1
    J = 1
     
        Do While Cells(i, J) <> "DISPONIBLE"
            If J < 10 Then
            J = J + 1
            Else
            J = 1
            i = i + 1
            End If
        Loop
      ' boucle ligne par ligne sur 10 colonnes, s'arrête dès quelle ne trouve pas le mot "disponible" dans une cellule
    'optimisation possible: utiliser la méthode find  
     
    ' a partir de là le J ne bouge plus et représente la colonne où on a trouve le mot "disponible"
        Do While Cells(i, J) <> "" 'boucle sur les cellules de la colonne J tant qu'on ne pas une cellule vide
            If Left(Cells(i, 1), 5) <> "Total" Then si les premiers caractère de la première colonne ne sont pas "Total"
                If Cells(i, J).Value < 0 Then 'si la valeur de la cellule est négative
     
                    Cells(i, J).Select 'on sélectionne (inutile)
     
                    With Selection.Interior
                        .PatternColorIndex = xlAutomatic 'puis on colorie
                        .Color = 255 'optimisation: se passer de la sélection
     
                    End With
     
                Else 'sinon
     
                    Cells(i, J).Select 'on sélectionne (inutile)
     
     
                    With Selection.Interior 'puis on colorie d'un autre manière
                        .Pattern = xlNone 'optimisation: se passer de la sélection
                        .TintAndShade = 0
                        .PatternTintAndShade = 0
     
                    End With
     
     
                End If
            End If
            i = i + 1
        Loop

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    La première boucle cherche le mot "Indisponible" dans les colonnes A:J.
    La seconde boucle cherche le mot "Total" dans la colonne A des lignes suivantes jusqu'à la première ligne vide.
    Pour chaque ligne, si la cellule de la colonne où se trouvait "Indisponible" est négative, on la mets en rouge. Sinon, on supprime son motif.

  5. #5
    Membre averti
    Homme Profil pro
    Stagiaire
    Inscrit en
    Mai 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2019
    Messages : 18
    Par défaut
    Merci de vos réponses claires rapides!

    halaster08, tu peut me dire comment utiliser la méthode find sur le mot "DISPONIBLE", ce ne serait pas plutôt sur la cellule directement ?
    Quant à la selection je doit réecrire mon code de cette manière ?

    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
     
    Do While Cells(i, j) <> ""
            If Left(Cells(i, 1), 5) <> "Total" Then
                If Cells(i, j).Value < 0 Then
     
                    With Selection.Interior
                        .PatternColorIndex = xlAutomatic
                        .Color = 255
     
                    End With
     
                Else
     
                    With Selection.Interior
                        .Pattern = xlNone
                        .TintAndShade = 0
                        .PatternTintAndShade = 0
     
                    End With
    Merci beaucoup

  6. #6
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Comme ça va plus vide de l'écrire que de l'expliquer :

    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
    Dim RSel As Range, Cur As Range
     
    Set RSel = Columns("A:J").Find("DISPONIBLE")
    If Not RSel Is Nothing Then
        For Each Cur In Range(RSel, RSel.End(xlDown))
            If Left(Cur.Row, 5) <> "Total" Then
                If Cur.Value < 0 Then
                    Cur.Interior.PatternColorIndex = xlAutomatic
                    Cur.Interior.Color = 255
                Else
                    Cur.Interior.Pattern = xlNone
                    Cur.Interior.TintAndShade = 0
                    Cur.Interior.PatternTintAndShade = 0
                End If
            End If
        Next Cur
    End If
    C'est du code tapé à l'arrache directement sur le forum. Tu auras donc peut-être du débugage à faire.

    Cela dit, perso, j'aurai fait ça avec deux MFC plutôt qu'avec une macro.

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

Discussions similaires

  1. [AC-2013] Boucle (code VBA) pour une requête de sélection
    Par fadilaref dans le forum VBA Access
    Réponses: 12
    Dernier message: 09/03/2018, 12h59
  2. [XL-2010] Code VBA: somme de cellules avec boucle unique
    Par Thomas4530 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/01/2014, 05h16
  3. Réponses: 4
    Dernier message: 13/10/2005, 14h44
  4. Réponses: 3
    Dernier message: 06/09/2005, 10h27
  5. Comment creer une procédure stockée à partir d'un code VBA?
    Par Alcor020980 dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 24/05/2005, 19h55

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