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 :

Remplacer des mises en forme conditionnelle par macro VBA


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Points : 32
    Points
    32
    Par défaut Remplacer des mises en forme conditionnelle par macro VBA
    Bonjour,

    Dans mon classeur de planification j'ai une feuille regroupant l'année 2018 (janvier à décembre) au complet et 12 feuilles pour chaque mois (étant en copie liaison avec le contenue de la feuille 2018).

    Toutes mes feuilles comportent les mêmes MFC. Exemple: si la lettre "j" est entrée, alors la cellule sera verte avec bordure fine, si la lettre "n" est entrée alors, la cellule sera noir avec bordure fine.

    Est-il possible de remplacer ces MFC par une macro VBA?

    Etant donnée le nombre de MFC, je me demandais si une macro pourrai accélérer mon classeur car celui-ci est passablement lent avec toutes ces MFC.

    J'avais créé un macro qui "regardait" dans tout mon tableau si la lettre "j" était présente dans certaines cellules et les colorait en vert avec bordure fine si c'était le cas. Cela fonctionnait bien mais prenait énormément de temps car le planning est composé de 100 lignes sur 730 colonnes (les jours étant doublés pour l'horaire de jour ou de nuit)

    Merci à vous et salutations

  2. #2
    Nouveau membre du Club
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Points : 32
    Points
    32
    Par défaut
    Afin de confirmer ce que je pensais, j'ai copié mon classeur et supprimer TOUTES les MFC de chaque feuille. (Il n'y avait aucun doublon de MFC dans chaque feuille)

    BILAN, le classeur à retrouvé toute sa rapidité.

    Pensez-vous qu'il existe un moyen pour remplacer les MFC par du VBA?

    Salutations

  3. #3
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    A mettre dans le module de la feuille concernée et à adapter selon les besoins :
    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
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
        If Target.Count > 1 Then Exit Sub
     
        Select Case Target.Value
     
            Case "j"
                Target.Interior.ColorIndex = 4 'vert
                Target.Borders.LineStyle = xlContinuous
     
            Case "n"
                Target.Interior.ColorIndex = 1 'noir
                Target.Borders.LineStyle = xlContinuous
     
            Case Else 'autre, pas de bordure et pas de couleur
                Target.Interior.ColorIndex = 0 'aucune couleur
                Target.Borders.LineStyle = xlNone
     
        End Select
     
    End Sub
     
    'procédure pour connaître l'index des couleurs
    Sub Couleurs()
     
        Dim I As Integer
     
        For I = 0 To 56
            Cells(I + 1, 1).Interior.ColorIndex = I 'couleur en colonne A
            Cells(I + 1, 2).Value = I 'index en colonne B
        Next I
     
    End Sub
    Et si toutes les feuilles doivent être concernées, à mettre dans le module du classeur :
    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
     
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
     
        If Target.Count > 1 Then Exit Sub
     
        Select Case Target.Value
     
            Case "j"
                Target.Interior.ColorIndex = 4 'vert
                Target.Borders.LineStyle = xlContinuous
     
            Case "n"
                Target.Interior.ColorIndex = 1 'noir
                Target.Borders.LineStyle = xlContinuous
     
            Case Else 'autre, pas de bordure et pas de couleur
                Target.Interior.ColorIndex = 0 'aucune couleur
                Target.Borders.LineStyle = xlNone
     
        End Select
     
    End Sub

  4. #4
    Nouveau membre du Club
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par Theze Voir le message
    Bonjour,

    A mettre dans le module de la feuille concernée et à adapter selon les besoins :
    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
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
        If Target.Count > 1 Then Exit Sub
     
        Select Case Target.Value
     
            Case "j"
                Target.Interior.ColorIndex = 4 'vert
                Target.Borders.LineStyle = xlContinuous
     
            Case "n"
                Target.Interior.ColorIndex = 1 'noir
                Target.Borders.LineStyle = xlContinuous
     
            Case Else 'autre, pas de bordure et pas de couleur
                Target.Interior.ColorIndex = 0 'aucune couleur
                Target.Borders.LineStyle = xlNone
     
        End Select
     
    End Sub
     
    'procédure pour connaître l'index des couleurs
    Sub Couleurs()
     
        Dim I As Integer
     
        For I = 0 To 56
            Cells(I + 1, 1).Interior.ColorIndex = I 'couleur en colonne A
            Cells(I + 1, 2).Value = I 'index en colonne B
        Next I
     
    End Sub
    Et si toutes les feuilles doivent être concernées, à mettre dans le module du classeur :
    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
     
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
     
        If Target.Count > 1 Then Exit Sub
     
        Select Case Target.Value
     
            Case "j"
                Target.Interior.ColorIndex = 4 'vert
                Target.Borders.LineStyle = xlContinuous
     
            Case "n"
                Target.Interior.ColorIndex = 1 'noir
                Target.Borders.LineStyle = xlContinuous
     
            Case Else 'autre, pas de bordure et pas de couleur
                Target.Interior.ColorIndex = 0 'aucune couleur
                Target.Borders.LineStyle = xlNone
     
        End Select
     
    End Sub
    Merci pour les codes

    Cela fonctionne parfaitement pour les lettres. Cependant, il y a un problème. La MFC qui colore en gris mes colonnes en fonction de la date, prend le dessus sur le code VBA ( la cellule reste gris avec la lettre j et juste la bordure)

    Est-il possible de faire une MFC pour différencier les jours semaine des jours week-end? Ou, est-il possible de mettre la MFC en second plan

    J'ai mes dates de AC11 à ACF11 (les dates étant doublées). Je souhaiterai que lorsque la date correspond à un weekend, cela colore les colonnes en dessous.

    Exemple pour le 06.01.2018 qui correspond à un samedi, ma MFC actuelle colore les colonnes AM11 à AN183 en gris.

    Je pense qu'il faudrait utiliser quelques chose comme ça, mais il ne fonctionne pas.

    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
     
    Dim CC
    Dim SelectDate As Range
    Dim PlagePlanning As Range
     
    SelectDate = WorkSheets("2018").Range("AC11:ACF11)
    PlagePlanning = WorkSheets("2018").Range("AC12:ACF183)
     
    For Each CC In PlagePlanning 
        If Weekday(SelectDate, vbMonday) > 5 Then 
            With CC
              .Borders(xlEdgeLeft).LineStyle = xlContinuous
              .Borders(xlEdgeLeft).Weight = xlThin
              .Borders(xlEdgeRight).LineStyle = xlContinuous
              .Borders(xlEdgeRight).Weight = xlThin
              .Interior.ColorIndex = 48 'gris
           End With
       End If
    Next CC
     
    End Sub
    Merci d'avance pour votre aide

  5. #5
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    La MFC est prioritaire sur les paramétrages par VBA donc, il te faut supprimer les MFC qui posent problème et les remplacer par du code VBA.
    Pour connaître le numéro du jour de la semaine (1 pour lundi et 7 pour dimanche) tu as la fonction "Weekday()" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub Test()
     
        MsgBox Weekday(Date, vbMonday)
     
    End Sub

  6. #6
    Nouveau membre du Club
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par Theze Voir le message
    Bonjour,

    La MFC est prioritaire sur les paramétrages par VBA donc, il te faut supprimer les MFC qui posent problème et les remplacer par du code VBA.
    Pour connaître le numéro du jour de la semaine (1 pour lundi et 7 pour dimanche) tu as la fonction "Weekday()" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub Test()
     
        MsgBox Weekday(Date, vbMonday)
     
    End Sub
    Merci pour la réponse.

    Oui j'utilise deja If Weekday(SelectDate, vbMonday) > 5 Then dans un UserForm de mon classeur, afin de déterminer l'activation d'une option selon jour de la semaine (cela fonctionne).

    Par contre, je ne sais pas comment faire pour, lorsque la date en ligne 11 est un samedi ou dimanche, cela colore la colonne en dessous (de la ligne 12 à 188)

    Si vous avez une idée cela m'aiderai.

    Je vous remercie pour votre aide.

    Salutations

  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 761
    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 761
    Points : 28 619
    Points
    28 619
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il y a certainement moyen de gagner en efficacité et rapidité si tu revoyais l'organisation des tes données.
    Douze feuilles représentant chacune un mois n'est pas la bonne manière d'organiser un classeur. Une seule feuille reprenant les données de l'année entière est plus logique. Il suffit ensuite d'avoir une ou plusieurs feuilles synthétisant les données.
    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
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Re,

    Testes et adapte ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    If Target.Row = 11 Then
     
        If IsDate(Target.Value) Then
     
            If Weekday(Target.Value, vbMonday) > 5 Then
                Range(Cells(12, Target.Column), Cells(188, Target.Column)).Interior.ColorIndex = 16
            Else
                Range(Cells(12, Target.Column), Cells(188, Target.Column)).Interior.ColorIndex = 0
            End If
     
        End If
     
    End If

  9. #9
    Nouveau membre du Club
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par Theze Voir le message
    Re,

    Testes et adapte ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    If Target.Row = 11 Then
     
        If IsDate(Target.Value) Then
     
            If Weekday(Target.Value, vbMonday) > 5 Then
                Range(Cells(12, Target.Column), Cells(188, Target.Column)).Interior.ColorIndex = 16
            Else
                Range(Cells(12, Target.Column), Cells(188, Target.Column)).Interior.ColorIndex = 0
            End If
     
        End If
     
    End If
    Merci, je vais tester demain matin et vous tiens au courant.

    Je vais également essayé d’adapter cela pour les jours fériés colorant en bleu pâle les Colonne de ceux-ci.

    Je les ai listés dans dans une feuille "listes"

    Je pense devoir créer une variable Range genre DateFeries qui sera égale à worksheets("listes"). Range(B3:B15) et intègre cela.

    Merci pour votre aide salutations et bonne soirée

  10. #10
    Nouveau membre du Club
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Points : 32
    Points
    32
    Par défaut
    J'ai réussi à colorer mes colonnes en fonction de si la date est un jour fériés comprise dans ma liste. Sa fonctionne mais le code est vraiment pas beau à voir.
    Il faudrait surement utiliser Find et rechercher si mes dates sont des jours fériés, j'ai essayé mais ca ne fonctionne pas

    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
     
    Sub MFC_Jours ()
    Dim Date1 As Date
    Dim Date2 As Date
    Dim Date3 As Date
    Dim Date4 As Date
    Dim Date5 As Date
    Dim Date6 As Date
    Dim Date7 As Date
    Dim Date8 As Date
    Dim Date9 As Date
    Dim Date10 As Date
     
    Date1 = Worksheets("Listes").Range("F8")
    Date2 = Worksheets("Listes").Range("F9")
    Date3 = Worksheets("Listes").Range("F10")
    Date4 = Worksheets("Listes").Range("F11")
    Date5 = Worksheets("Listes").Range("F12")
    Date6 = Worksheets("Listes").Range("F13")
    Date7 = Worksheets("Listes").Range("F14")
    Date8 = Worksheets("Listes").Range("F15")
    Date9 = Worksheets("Listes").Range("F16")
    Date10 = Worksheets("Listes").Range("F17")
     
    Set SelectionDate = ActiveSheet.Range("AC11:ACF11")
     
        For Each Cellule In SelectionDate
        'Couleur colonne Fériés RGB(183, 222, 232)
            ElseIf Cellule.Value = Date1 Or Cellule.Value = Date2 Or Cellule.Value = Date3 Or Cellule.Value = Date4 Or Cellule.Value = Date5 Or Cellule.Value = Date6 Or Cellule.Value = Date7 Or Cellule.Value = Date8 Or Cellule.Value = Date9 Or    Cellule.Value = Date10 Then
                Range(Cells(12, Cellule.Column), Cells(183, Cellule.Column)).Interior.Color = RGB(183, 222, 232)
        'Couleur colonne Weekend RGB(217, 217, 217)
            ElseIf Weekday(Cellule, vbMonday) > 5 Then
                Range(Cells(12, Cellule.Column), Cells(183, Cellule.Column)).Interior.Color = RGB(217, 217, 217)     
            ElseIf Cellule.Value = "" Then
                Range(Cells(12, Cellule.Column), Cells(183, Cellule.Column)).Interior.Color = RGB(255, 255, 255) 'ColorIndex = xlColorIndexNone
            End If
        Next Cellule
    End Sub
    Il faudrait surement utiliser Find et rechercher si mes dates sont des jours fériés, j'ai essayé mais ca ne fonctionne pas.

    Si quelqu'un a une idée.

    salutations

  11. #11
    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 761
    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 761
    Points : 28 619
    Points
    28 619
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour vérifier si une date est fériée et lui appliquer une mise en forme, j'utilise la fonction EQUIV.
    La liste des jours fériés dans une plage de cellules d'une colonne et nommée par exemple JoursFeries
    Si l'a formule ci-dessous renvoie VRAI, la date contenue en A2 est un jour férié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =NON(ESTNA(EQUIV(A2;JoursFeries;0)))
    En VBA on peut procéder de la même manière

    1. Déclarer une variable nommée Pos de type Long
    2. Attribuer la référence à la plage nommée JoursFeries à la variable objet SelectionFeries
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Set SelectionFeries = Range("JoursFeries")
    3. Dans la boucle For Each Cellule In SelectionDate, chercher si la valeur de la variable objet Cellule est présente dans la liste des jours fériés et effectuer le test
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      On Error Resume Next
      Pos = WorksheetFunction.Match(CLng(Cellule.Value), SelectionFeries, 0)
      On Error GoTo 0
      If Pos Then
      ' Appliquer la mise en forme
      End If
    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

  12. #12
    Nouveau membre du Club
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Pour vérifier si une date est fériée et lui appliquer une mise en forme, j'utilise la fonction EQUIV.
    La liste des jours fériés dans une plage de cellules d'une colonne et nommée par exemple JoursFeries
    Si l'a formule ci-dessous renvoie VRAI, la date contenue en A2 est un jour férié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =NON(ESTNA(EQUIV(A2;JoursFeries;0)))
    En VBA on peut procéder de la même manière

    1. Déclarer une variable nommée Pos de type Long
    2. Attribuer la référence à la plage nommée JoursFeries à la variable objet SelectionFeries
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Set SelectionFeries = Range("JoursFeries")
    3. Dans la boucle For Each Cellule In SelectionDate, chercher si la valeur de la variable objet Cellule est présente dans la liste des jours fériés et effectuer le test
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      On Error Resume Next
      Pos = WorksheetFunction.Match(CLng(Cellule.Value), SelectionFeries, 0)
      On Error GoTo 0
      If Pos Then
      ' Appliquer la mise en forme
      End If
    Je vous remercie pour le code.

    Cependant, je fait peut-être quelques chose de faux car cela me colore toutes mes colonnes.

    Saluations

  13. #13
    Nouveau membre du Club
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Points : 32
    Points
    32
    Par défaut
    J'ai essayer comme ceci:

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
     
    Sub MFC_Jours2()
    Dim Cellule As Range
    Dim SelectionDate As Range
    Dim CouleurWE
    Dim CouleurVac
    Dim CouleurFeries
    Dim CouleurFDV
     
    Dim SelectionVacances As Range
    Dim SelectionFDV As Range
    Dim SelectionFeries As Range
    Dim SelectionAnnee As Range
     
     
    Dim PosFeries As Long
    Dim PosFDV As Long
    Dim PosVacances As Long
    Dim PosAnnee As Long
     
    Set SelectionFeries = Worksheets("Listes").Range("F8:F17")
    Set SelectionFDV = Worksheets("Listes").Range("F20:F22")
    Set SelectionVacances = Worksheets("Listes").Range("H8:H93")
     
    CouleurWE = RGB(217, 217, 217)
    CouleurVac = RGB(231, 255, 231)
    CouleurFeries = RGB(183, 222, 232)
    CouleurFDV = RGB(255, 220, 185)
        For Each Cellule In SelectionDate
            On Error Resume Next
     
            PosFDV = WorksheetFunction.Match(CLng(Cellule.Value), SelectionFDV, 0)
            PosFeries = WorksheetFunction.Match(CLng(Cellule.Value), SelectionFeries, 0)
            PosVacances = WorksheetFunction.Match(CLng(Cellule.Value), SelectionVacances, 0)
     
            On Error GoTo 0
     
                If PosFDV Then
                    Range(Cells(12, Cellule.Column), Cells(183, Cellule.Column)).Interior.Color = CouleurFDV
     
                ElseIf Weekday(Cellule, vbMonday) > 5 Then
                    Range(Cells(12, Cellule.Column), Cells(183, Cellule.Column)).Interior.Color = CouleurWE
     
                ElseIf PosVacances Then
                Range(Cells(12, Cellule.Column), Cells(183, Cellule.Column)).Interior.Color = CouleurVac
     
                ElseIf PosFeries Then
                    Range(Cells(12, Cellule.Column), Cells(183, Cellule.Column)).Interior.Color = CouleurFeries
     
                Else
                    Range(Cells(12, Cellule.Column), Cells(183, Cellule.Column)).Interior.Color = RGB(255, 255, 255)
                End If
        Next Cellule
     
    End Sub
    Avec le code écrit ainsi, c'est la CouleurVac (verte pâle) qui colore quasi tout, sauf les weekend qui sont bien en gris et les trois dates FDV qui sont en saumon.

  14. #14
    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 761
    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 761
    Points : 28 619
    Points
    28 619
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Le problème c'est que tu poses une question qui semble précise sur les jours fériés et que tu intègres la réponse que l'on te donne pour trois cas.
    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

  15. #15
    Nouveau membre du Club
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Le problème c'est que tu poses une question qui semble précise sur les jours fériés et que tu intègres la réponse que l'on te donne pour trois cas.
    Bonjour,

    Je pensais qu'il était possible d'adapter pour les deux autres.

    Malheureusement en utilisant que le code pour les jours fériés, cela me colore toutes les colonnes et non celles étant dans ma plage Feries2018

  16. #16
    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 761
    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 761
    Points : 28 619
    Points
    28 619
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je pensais qu'il était possible d'adapter pour les deux autres.
    Oui bien entendu mais n'y a t'il pas des dates se trouvant dans plusieurs listes ?
    Il y a lieu également de vérifier l'ordre de priorité de la structure décisionnelle.
    Je préfère de loin le Select Case aux ElseIf moins facile à lire
    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

  17. #17
    Nouveau membre du Club
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,

    Oui bien entendu mais n'y a t'il pas des dates se trouvant dans plusieurs listes ?
    Il y a lieu également de vérifier l'ordre de priorité de la structure décisionnelle.
    Je préfère de loin le Select Case aux ElseIf moins facile à lire

    Effectivement il y a des dates ce trouvant dans plusieurs liste, faudrait-il ne pas les insérée ?

    Je ne suis pas très doué en vba pour utilisé select case.

    Pouvez vous me montrer afin que j’aprenne ?

    Merci

  18. #18
    Nouveau membre du Club
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par MicKRub Voir le message
    Effectivement il y a des dates ce trouvant dans plusieurs liste, faudrait-il ne pas les insérée ?

    Je ne suis pas très doué en vba pour utilisé select case.

    Pouvez vous me montrer afin que j’aprenne ?

    Merci
    J'ai essayé cela mais ça ne semble pas fonctionner
    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
     
    Select Case ActiveSheet.Name
        Case Is = "2018"
            Set SelectionDate = ActiveSheet.Range("AC11:ACF11")
        Case Is = "Février"
            Set SelectionDate = ActiveSheet.Range("AC11:CE11")
        Case Is = "Avril", "Juin", "Septembre", "Novembre"
            Set SelectionDate = ActiveSheet.Range("AC11:CJ11")
        Case Is = "Janvier", "Mars", "Mai", "Juillet", "Août", "Octobre", "Décembre"
            Set SelectionDate = ActiveSheet.Range("AC11:CL11")
    End Select
     
     
    For Each Cellule In SelectionDate
        Select Case Cellule.Value
            Case Is = "DateFDV1", "DateFDV2", "DateFDV3"
                Range(Cells(12, Cellule.Column), Cells(183, Cellule.Column)).Interior.Color = CouleurFDV
     
            Case Is = "Date1", "Date2", "Date3", "Date4", "Date5", "Date6", "Date7", "Date8", "Date9", "Date10"
                Range(Cells(12, Cellule.Column), Cells(183, Cellule.Column)).Interior.Color = CouleurFeries
     
            Case Is = "DateVac1", "DateVac2", "DateVac3", "DateVac4", "DateVac5", "DateVac6", "DateVac7", "DateVac8", "DateVac9", "DateVac10", _
                "DateVac11", "DateVac12", "DateVac13", "DateVac14", "DateVac15", "DateVac16", "DateVac17", "DateVac18", "DateVac19", "DateVac20", _
                "DateVac21", "DateVac22", "DateVac23", "DateVac24", "DateVac25", "DateVac26", "DateVac27", "DateVac28", "DateVac29", "DateVac30", _
                "DateVac31", "DateVac32", "DateVac33", "DateVac34", "DateVac35", "DateVac36", "DateVac37", "DateVac38", "DateVac39", "DateVac40", _
                "DateVac41", "DateVac42", "DateVac43", "DateVac44", "DateVac45", "DateVac46", "DateVac47", "DateVac48", "DateVac49", "DateVac20", _
                "DateVac51", "DateVac52", "DateVac53", "DateVac54", "DateVac55", "DateVac56", "DateVac57", "DateVac58", "DateVac59", "DateVac60", _
                "DateVac61", "DateVac62", "DateVac63", "DateVac64", "DateVac65", "DateVac66", "DateVac67", "DateVac68", "DateVac69", "DateVac70", _
                "DateVac71", "DateVac72", "DateVac73", "DateVac74", "DateVac75", "DateVac76", "DateVac77", "DateVac78", "DateVac78", "DateVac80", _
                "DateVac81", "DateVac82", "DateVac83", "DateVac84", "DateVac85", "DateVac86" '"DateVac1" To "DateVac86"
                Range(Cells(12, Cellule.Column), Cells(183, Cellule.Column)).Interior.Color = CouleurVac
        End Select
            If Weekday(Cellule, vbMonday) > 5 Then
                Range(Cells(12, Cellule.Column), Cells(183, Cellule.Column)).Interior.Color = CouleurWE
            End If
    Next Cellule
    A la place de cette horrible chose qui fonctionne

    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
     
     
    Select Case ActiveSheet.Name
        Case Is = "2018"
            Set SelectionDate = ActiveSheet.Range("AC11:ACF11")
        Case Is = "Février"
            Set SelectionDate = ActiveSheet.Range("AC11:CE11")
        Case Is = "Avril", "Juin", "Septembre", "Novembre"
            Set SelectionDate = ActiveSheet.Range("AC11:CJ11")
        Case Is = "Janvier", "Mars", "Mai", "Juillet", "Août", "Octobre", "Décembre"
            Set SelectionDate = ActiveSheet.Range("AC11:CL11")
    End Select
     
    For Each Cellule In SelectionDate
     
        If Cellule.Value = DateFDV1 Or Cellule.Value = DateFDV2 Or Cellule.Value = DateFDV3 Then
     
                Range(Cells(12, Cellule.Column), Cells(183, Cellule.Column)).Interior.Color = CouleurFDV
     
        'Couleur colonne Fériés RGB(183, 222, 232)
        ElseIf Cellule.Value = Date1 Or Cellule.Value = Date2 Or Cellule.Value = Date3 Or Cellule.Value = Date4 Or Cellule.Value = Date5 Or Cellule.Value = Date6 Or Cellule.Value = Date7 Or Cellule.Value = Date8 Or Cellule.Value = Date9 Or Cellule.Value = Date10 Then
                Range(Cells(12, Cellule.Column), Cells(183, Cellule.Column)).Interior.Color = CouleurFeries
        'Couleur colonne Weekend RGB(217, 217, 217)
            ElseIf Weekday(Cellule, vbMonday) > 5 Then
     
                Range(Cells(12, Cellule.Column), Cells(183, Cellule.Column)).Interior.Color = CouleurWE
     
        'Couleur colonne Vacances RGB(231, 255, 231)
            ElseIf Cellule.Value = DateVac1 Or Cellule.Value = DateVac2 Or Cellule.Value = DateVac3 Or Cellule.Value = DateVac4 Or Cellule.Value = DateVac5 Or Cellule.Value = DateVac6 Or Cellule.Value = DateVac7 Or Cellule.Value = DateVac8 Or Cellule.Value = DateVac9 Or Cellule.Value = DateVac10 Or _
            Cellule.Value = DateVac11 Or Cellule.Value = DateVac12 Or Cellule.Value = DateVac13 Or Cellule.Value = DateVac14 Or Cellule.Value = DateVac15 Or Cellule.Value = DateVac16 Or Cellule.Value = DateVac17 Or Cellule.Value = DateVac18 Or Cellule.Value = DateVac19 Or Cellule.Value = DateVac20 Or _
            Cellule.Value = DateVac21 Or Cellule.Value = DateVac22 Or Cellule.Value = DateVac23 Or Cellule.Value = DateVac24 Or Cellule.Value = DateVac25 Or Cellule.Value = DateVac26 Or Cellule.Value = DateVac27 Or Cellule.Value = DateVac28 Or Cellule.Value = DateVac29 Or Cellule.Value = DateVac30 Or _
            Cellule.Value = DateVac31 Or Cellule.Value = DateVac32 Or Cellule.Value = DateVac33 Or Cellule.Value = DateVac34 Or Cellule.Value = DateVac35 Or Cellule.Value = DateVac36 Or Cellule.Value = DateVac37 Or Cellule.Value = DateVac38 Or Cellule.Value = DateVac39 Or Cellule.Value = DateVac40 Or _
            Cellule.Value = DateVac41 Or Cellule.Value = DateVac42 Or Cellule.Value = DateVac43 Or Cellule.Value = DateVac44 Or Cellule.Value = DateVac45 Or Cellule.Value = DateVac46 Or Cellule.Value = DateVac47 Or Cellule.Value = DateVac48 Or Cellule.Value = DateVac49 Or Cellule.Value = DateVac50 Or _
            Cellule.Value = DateVac51 Or Cellule.Value = DateVac52 Or Cellule.Value = DateVac53 Or Cellule.Value = DateVac54 Or Cellule.Value = DateVac55 Or Cellule.Value = DateVac56 Or Cellule.Value = DateVac57 Or Cellule.Value = DateVac58 Or Cellule.Value = DateVac59 Or Cellule.Value = DateVac60 Or _
            Cellule.Value = DateVac61 Or Cellule.Value = DateVac62 Or Cellule.Value = DateVac63 Or Cellule.Value = DateVac64 Or Cellule.Value = DateVac65 Or Cellule.Value = DateVac66 Or Cellule.Value = DateVac67 Or Cellule.Value = DateVac68 Or Cellule.Value = DateVac69 Or Cellule.Value = DateVac70 Or _
            Cellule.Value = DateVac71 Or Cellule.Value = DateVac72 Or Cellule.Value = DateVac73 Or Cellule.Value = DateVac74 Or Cellule.Value = DateVac75 Or Cellule.Value = DateVac76 Or Cellule.Value = DateVac77 Or Cellule.Value = DateVac78 Or Cellule.Value = DateVac79 Or Cellule.Value = DateVac80 Or _
            Cellule.Value = DateVac81 Or Cellule.Value = DateVac82 Or Cellule.Value = DateVac83 Or Cellule.Value = DateVac84 Or Cellule.Value = DateVac85 Or Cellule.Value = DateVac86 Then
     
                Range(Cells(12, Cellule.Column), Cells(183, Cellule.Column)).Interior.Color = CouleurVac
     
            ElseIf Cellule.Value <> "" Then
     
                Range(Cells(12, Cellule.Column), Cells(183, Cellule.Column)).Interior.ColorIndex = xlColorIndexNone 'Color = RGB(255, 255, 255)
     
            End If
    Next Cellule

Discussions similaires

  1. Remplacer mise en forme conditionnelle par module VBA
    Par MicKRub dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 10/05/2017, 14h23
  2. [XL-2010] Mise en forme conditionnelle par macro
    Par Fulder dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 26/04/2016, 16h30
  3. [XL-2007] Mise en forme conditionnelle par macro sur cellule contenant une formule
    Par Breton35 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/10/2015, 14h22
  4. [XL-2010] Peut-on programmer des Mises en Forme Conditionnelles par Vba ?
    Par Vad_18 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 29/04/2015, 10h42
  5. [XL-2010] Manipuler les mises en forme conditionnelles par macro
    Par EmmanuelleC dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 03/04/2014, 17h44

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