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 :

Comment programmer des boucles efficaces en VBA ?


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2018
    Messages : 19
    Points : 10
    Points
    10
    Par défaut Comment programmer des boucles efficaces en VBA ?
    Bonjour,

    Novice en VBA je m’excuse pour les termes approximatifs que je vais employer. J’ai autant de difficulté à coder qu’a explicitée ce que je code LOL, soyez indulgent.

    Afin d'introduire la problématique voici la description de ma page Excel (que je laisserais en pièce jointe)
    Il s’agit d’un calendrier mensuel, rien de bien compliqué il est très basic. Sur le côté j’ai noté des dates de réservation. Afin de rendre le calendrier le plus lisible possible, j’aimerais mettre une couleur de fond pour les jours où il y a une réservation.

    Comme il y a deux recherches en parallèle j’ai essayé d’imbriquer une boucle FOR-EACH dans une boucle DO-WHILE. J’ai essayé de retourner le code dans tous les sens mais c’est un véritable sac de nœuds. VBA et sa gymnastique intellectuelle est encore un peu trop confuse pour moi. Enfin bref, voici ce que j’ai faits
    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
     
    Sub Calendrier()
     
    Dim cellule As Range
    Dim i As Long
     
    i = 4
    Worksheets("Réservation").Range("j4:J10").Select
     
     
    While Sheets("Réservation").Range("J" & i).Value <> ""
     
        For Each cellule In Selection
            If cellule.Value = Sheets("Réservation").Range("A" & i).Value Then
                Sheets("Réservation").Range("A" & i).Value .Interior.ColorIndex = 6
            End If
        Next cellule
     
    i = i + 1
    Wend
     
    End Sub
    Certains ont dû bondir de leurs chaises en voyant les erreurs grotesques que j’ai surement faite.
    Je mesure l’ampleur de ma demande et de la difficulté, alors merci par avance à ceux qui voudront me porter secours !
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    Pourquoi passer par du VBA, alors qu'une simple MFC suffit?
    Pièce jointe 443065

    Sinon en vba
    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
    sub Calendrier()
        Dim cellule As Range
        Dim i As Long
        Application.ScreenUpdating = False
     
        i = 4
        Worksheets("Réservation").Range("j4:J10").Select
        For i = 4 To 10
            For Each cellule In [A4:G9]
                    If cellule.Value = Cells(i, "J") Then
                        cellule.Interior.ColorIndex = 6
                    End If
            Next cellule
         Next i
    End Sub
    Cdlt

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2018
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Bonjours Arturo

    Tout d’abord un grand merci pour avoir fait en quelques heures ce que je n’arrivais pas à faire depuis des jours.

    Je comprends votre interrogation.
    Le document ci-dessus a été synthétisé au maximum afin d’illustrer au mieux ma problématique.
    Mais sur mon xlsm initial j’ai un calendrier « dynamique » et j’aurais besoin de faire appel à la procédure à chaque changement de mois. Sauf erreur de ma part je ne crois que je puisse le faire avec une mise en forme conditionnelle.

    Cordialement

  4. #4
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    La partie en VBA n'utilise pas les MFC

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    je ne crois que je puisse le faire avec une mise en forme conditionnelle.
    Je ne vois aucune raison pour ne pas pouvoir le faire avec une mise en forme conditionnelle, c'est justement fait pour cela.
    Il faut juste construire une formule logique (renvoyant VRAI ou FAUX) qui corresponde à ta demande.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2018
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Autant pour moi, merci d'avoir rectifié ma bêtise ^^


    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
    sub Calendrier()
        Dim cellule As Range
        Dim i As Long
        Application.ScreenUpdating = False
     
        i = 4
        Worksheets("Réservation").Range("j4:J10").Select
        For i = 4 To 10
            For Each cellule In [A4:G9]
                    If cellule.Value = Cells(i, "J") Then
                        cellule.Interior.ColorIndex = 6
                    End If
            Next cellule
         Next i
    End Sub
    J'en profite pour en revenir à ce code. Il marche très bien mais j'ai un petit soucis avec le compteur "i". Pour le moment j'ai fait le bourrin en mon mettant for i = 4 to 999 (afin d'avoir de la marge avec les nombreuses dates que je vais ajoutés). On va dire que ça marche, mais je risque d'avoir des soucis :/

    Comment faire pour déclarer la dernière ligne d'un tableau, pour ne pas avoir à modifier le compteur ?


    Merci encore pour votre aide

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Comment faire pour déclarer la dernière ligne d'un tableau, pour ne pas avoir à modifier le compteur ?
    Il y a plusieurs manières d'obtenir la dernière ligne d'un tableau
    Pour ma part, pour des listes de données classique j'utilise toujours la propriété CurrentRegion parce-que toutes mes listes sont correctement structurées, 1ère ligne contenant les étiquettes de colonnes (titre), 1ère colonne remplie (sans lignes vides)

    Quelques exemples pour calculer la dernière ligne d'une liste des données

    Exemple 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub T1()
     ' Déclaration et assignation des variables
     Dim LastRow As Long
     Dim Sht As Worksheet
     Dim Rng As Range
     Set Sht = ThisWorkbook.Worksheets("Feuil1")
     Set Rng = Sht.Range("A1").CurrentRegion
     ' Dernière ligne d'une liste de données
     LastRow = Rng.Rows.Count
     Set Sht = Nothing: Set Rng = Nothing
    End Sub
    Exemple 2 : Cas où la colonne A, contient des lignes vides
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub T2()
     ' Déclaration et assignation des variables
     Dim LastRow As Long
     Dim Sht As Worksheet
     Set Sht = ThisWorkbook.Worksheets("Feuil1")
     ' Dernière ligne d'une liste de données
     With Sht
      LastRow = .Cells(.Cells.Rows.Count, 1).End(xlUp).Row
     End With
     Set Sht = Nothing
    End Sub
    Exemple 3 : Avec un tableau structuré (ListObject)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub T3()
     ' Déclaration et assignation des variables
     Dim LastRow As Long
     Dim Sht As Worksheet
     Dim Lst As ListObject
     Set Sht = ThisWorkbook.Worksheets("Feuil1")
     Set Lst = Sht.ListObjects(1)
     ' Dernière ligne d'une liste de données
     LastRow = Lst.DataBodyRange.Rows.Count
     ' End
     Set Sht = Nothing: Set Lst = Nothing
    End Sub
    Ce qui donnera donc pour ta boucle
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2018
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Ça marche parfaitement, merci beaucoup !!

    Par contre, pourriez vous m’éclairer sur l'intérêt des variables ?
    Car j'ai pris la mauvaise habitude de coder en déclarant très peu de variable sans me questionner sur les conséquences .

    par exemple entre ces deux codes, il y a t'il une véritable différence, et quel est l'avantage d'en déclarer autant ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Dim LastRow As Long
    LastRow = ThisWorkbook.Worksheets("Feuil1").Range("Tableau1").Rows.Count

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim LastRow As Long
     Dim Sht As Worksheet
     Dim Lst As ListObject
     Set Sht = ThisWorkbook.Worksheets("Feuil1")
     Set Lst = Sht.ListObjects(1)
     LastRow = Lst.DataBodyRange.Rows.Count


    Merci encore, pour votre temps passé sur mes demandes

Discussions similaires

  1. [AC-2007] Comment imbriquer des requêtes SQL en VBA
    Par rch05 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 09/03/2011, 21h18
  2. Réponses: 5
    Dernier message: 28/02/2011, 16h57
  3. [AC-2002] Comment remplir des champs Access par VBA
    Par SunRay dans le forum Access
    Réponses: 3
    Dernier message: 19/08/2009, 12h32
  4. Réponses: 1
    Dernier message: 04/06/2009, 14h30
  5. [MS SQL Server] comment faire des boucles en SQL ?
    Par Yorel dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/11/2006, 09h41

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