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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    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
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    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 confirmé
    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
    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
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    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 confirmé
    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
    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
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    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

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