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 mise en forme conditionnelle par module 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 mise en forme conditionnelle par module VBA
    Bonsoir,

    Est-il possible de remplace une mise en forme conditionnelle par un module VBA et faire appel à celui-ci sur la feuille voulu.

    Pour un planning annuel avec des onglets par mois, j'utilise les mêmes MFC sur chaque page.

    Je me demandais s'il était possible de remplacer une mise en forme conditionnelle par un module VBA et faire appel à celui-ci sur la feuille voulu.

    Genre avec cette MFC qui met en gris les colonnes si c'est un samedi ou dimanche

    Cordialement.

    Nom : 4.jpg
Affichages : 1150
Taille : 39,7 Ko

    Nom : 1.jpg
Affichages : 1397
Taille : 236,6 Ko

  2. #2
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 520
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 520
    Points : 16 455
    Points
    16 455
    Par défaut
    Bonjour

    Je ne réponds pas à ta question mais je remarque une anomalie : ta MFC ne s'applique qu'aux colonnes concernées semble-t-il (toutes les 6 colonnes).

    Elle perd son intérêt, le but d'une MFC est qu'elle fasse le boulot sur toutes les colonnes et détermine si la colonne est concernée ou non.

    Pour VBA il faut déjà préciser si le code est à lancer ou doit s'automatiser à chaque changement des valeurs en limitant la porter à la ligne de date concernée.

  3. #3
    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
    Merci pour la réponse. en fait il y a eu un beug je ne sais pas pourquoi. J'ai corrigé le "s'applique à" comme sur l'image si dessous.

    Nom : 1.jpg
Affichages : 1095
Taille : 32,9 Ko

    Nom : 2.jpg
Affichages : 1231
Taille : 79,0 Ko

    Voila un exemple de l'une de mes MFC que j'aimerai mettre en VBA

    Cordialement

  4. #4
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Bonjour,
    As-tu déjà essayé d'obtenir le code correspondant à la création de MFC grâce à l'enregistreur de macro?

  5. #5
    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
    Non mais je vais essayer.

    Merci

  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
    Malheureusement je ne comprend pas comment faire...

    J'ai essayer dans un module de créer un Sub Couleur () dans le but de colorer mes cellules où les lettres Q ou K apparaissent.
    Mon tableau va des lignes 20 à 138 et des colonnes AA à ACD

    Ensuite j'appelle couleur dans Private Sub Worksheet_Activate()

    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
    Sub Couleur()
        Dim iColumn As Integer
        Dim iRow As Integer
     
        For iRow = 20 To 138 'lignes  20 à 138 (à adapter)
            For iColumn = 27 To 393 'colonnes  AA(27) à ACD(393) (à adapter)
                If Cells(iRow, iColumn).Value = "Q" Then
                    Cells(iRow, iColumn).Font.Color = RGB(0, 0, 0) 'couleur à adapter
                    Cells(iRow, iColumn).Interior.Color = RGB(255, 0, 255) 'couleur à adapter
                End If
     
                If Cells(iRow, iColumn).Value = "k" Then
                    Cells(iRow, iColumn).Font.Color = RGB(0, 0, 0) 'couleur à adapter
                    Cells(iRow, iColumn).Interior.Color = RGB(151, 255, 151) 'couleur à adapter
                End If
     
            Next iColumn
        Next iRow
     
    End Sub
    Une idée?

    Cordialement

    Est-ce possible de simplifier avec quelques chose du style?
    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 Macro1()
    '
    ' Macro1 Macro
    '
     
    '
        If Range("AA20:ACD139") = "j" Then
     
        Range("AA20:ACD139").Font.Color = RGB(192, 32, 255)
     
        End If
     
     
    End Sub

  7. #7
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Bonjour,
    Ceci n'est pas le code que l'on obtient pour une mise en forme conditionnelle. Voici ce que j'obtiens avec l'enregistreur de macro (fond rouge, écriture rouge pour les cellules contenant a):
    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
    With Range("A1:D6")
            .FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
            Formula1:="=""a"""
            .FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
            With .FormatConditions(1).Font
                .Color = -16383844
                .TintAndShade = 0
            End With
            With .FormatConditions(1).Interior
                .PatternColorIndex = xlAutomatic
                .Color = 13551615
                .TintAndShade = 0
            End With
            .FormatConditions(1).StopIfTrue = False
        End With
    Ce code doit être lancé une seule fois et la mise en forme sera toujours adaptée au contenu des cellules (c'est le principe de la MFC). Pourquoi as-tu besoin d'une macro pour faire cela? As-tu bien compris le principe de la MFC?

    En ce qui concerne ta question, oui, il y a plus simple. Au lieu de faire deux boucles imbriquées, on peut n'en faire qu'une seule : une boucle sur les cellules :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim cellu As Range
    For cellu In Range("AA20:ACD139")
        If cellu.Value = "j" Then cellu.Font.Color = RGB(192, 32, 255)
    Next cellu
    Par contre, ceci n'enlèvera pas la mise en forme si on efface "j". Par ex. si tu fais :
    • Ecrire "j" en A1
    • Lancer la macro
    • Effacer "j" en A1
    • Lancer la macro

    A1 gardera la mise en forme donnée quand il était écrit "j" en A1, car tu ne dis pas qu'il faut enlever la mise en forme si A1 ne contien pas "j". Il faudrait mettre une condition Else pour le cas où aucune mise en forme doit être appliquée. Ceci est fait de façon automatique avec la MFC.

  8. #8
    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
    Merci pour cette solution.

    J'ai essayer de la copier et de l'ajuster un peu pour mon fichier, mais cela me met une erreur de compilation, erreur de syntaxe

    Nom : 1.jpg
Affichages : 1149
Taille : 49,8 Ko

    Sinon avec le code si dessous ça fonctionne mais c'est assez lent..


    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    Public Sub Couleur()
        Dim iColumn As Integer
        Dim iRow As Integer
     
        Application.ScreenUpdating = False
     
        ThisWorkbook.Worksheets("2018").Unprotect "2018"
     
        For iRow = 20 To 138 'lignes de 20 à 138
     
            Select Case iRow 'on fait un select sur iRow
                Case 21, 22, 24, 25, 27, 28, 30, 31, 33, 34, 36, 37, 39, 40, 42, 43, 45, 46, 48, 49, 51, 52, 54, 55, 57, 58, 60, 61, 63, 64, 66, 67, 69, 70, 72, 73, 75, 76, 78, 79, 81, 82, 84, 85, 87, 88, 90, 91, 93, 94, 96, 97, 99, 100, 102, 103, 105, 106, 108, 109, 111, 112, 114, 115, 117, 118, 120, 121, 123, 124, 126, 127, 129, 130, 132, 133, 135, 136
                    GoTo flNextiRow 'on passe au flag flNextiRow
                Case Else 'c'est mieux de mettre le case else, c'est pour toutes les autres lignes, mais on fait rien, donc le code continue
            End Select
            For iColumn = 27 To 758 'colonnes de AA(27) à ACD(758)
            'Vide
                If Cells(iRow, iColumn).Value = "" Then
                    'Cells(iRow, iColumn).Interior.Pattern = xlNone
                    Cells(iRow, iColumn).Font.Color = RGB(255, 255, 255)
                    Cells(iRow, iColumn).Interior.Color = RGB(255, 255, 255)
                End If
            'Jour
                If Cells(iRow, iColumn).Value = "j" Then
                    Cells(iRow, iColumn).Font.Color = RGB(0, 0, 0)
                    Cells(iRow, iColumn).Interior.Color = RGB(0, 255, 0)
                End If
            'Nuit
                If Cells(iRow, iColumn).Value = "n" Then
                    Cells(iRow, iColumn).Font.Color = RGB(255, 255, 255)
                    Cells(iRow, iColumn).Interior.Color = RGB(0, 0, 0)
                End If
            'Vacances
                If Cells(iRow, iColumn).Value = "v" Then
                    Cells(iRow, iColumn).Font.Color = RGB(0, 0, 0)
                    Cells(iRow, iColumn).Interior.Color = RGB(255, 0, 255)
                End If
            'Vacances Travail
                If Cells(iRow, iColumn).Value = "vt" Then
                    Cells(iRow, iColumn).Font.Color = RGB(0, 0, 0)
                    Cells(iRow, iColumn).Interior.Color = RGB(255, 0, 255)
                End If
            'Maladie
                If Cells(iRow, iColumn).Value = "m" Then
                    Cells(iRow, iColumn).Font.Color = RGB(0, 0, 0)
                    Cells(iRow, iColumn).Interior.Color = RGB(0, 255, 255)
                End If
            'Congé
                If Cells(iRow, iColumn).Value = "c" Then
                    Cells(iRow, iColumn).Font.Color = RGB(0, 0, 0)
                    Cells(iRow, iColumn).Interior.Color = RGB(247, 150, 70)
                End If
            'Congé statutaire
                If Cells(iRow, iColumn).Value = "cs" Then
                    Cells(iRow, iColumn).Font.Color = RGB(0, 0, 0)
                    Cells(iRow, iColumn).Interior.Color = RGB(247, 150, 70)
                End If
            'Congé férié
                If Cells(iRow, iColumn).Value = "cf" Then
                    Cells(iRow, iColumn).Font.Color = RGB(0, 0, 0)
                    Cells(iRow, iColumn).Interior.Color = RGB(247, 150, 70)
                End If
            'Congé Réserve
                If Cells(iRow, iColumn).Value = "cr" Then
                    Cells(iRow, iColumn).Font.Color = RGB(0, 0, 0)
                    Cells(iRow, iColumn).Interior.Color = RGB(250, 191, 143)
                End If
            'Instruction
                If Cells(iRow, iColumn).Value = "i" Then
                    Cells(iRow, iColumn).Font.Color = RGB(255, 255, 255)
                    Cells(iRow, iColumn).Interior.Color = RGB(83, 141, 213)
                End If
            'Ecole
                If Cells(iRow, iColumn).Value = "e" Then
                    Cells(iRow, iColumn).Font.Color = RGB(255, 255, 255)
                    Cells(iRow, iColumn).Interior.Color = RGB(0, 0, 255)
                End If
            'Reserve 1
                If Cells(iRow, iColumn).Value = "r1" Then
                    Cells(iRow, iColumn).Font.Color = RGB(0, 0, 0)
                    Cells(iRow, iColumn).Interior.Color = RGB(255, 255, 153)
                End If
            'Reserve2
                If Cells(iRow, iColumn).Value = "r2" Then
                    Cells(iRow, iColumn).Font.Color = RGB(0, 0, 0)
                    Cells(iRow, iColumn).Interior.Color = RGB(255, 255, 153)
                End If
            'Reserve 3
                If Cells(iRow, iColumn).Value = "r3" Then
                    Cells(iRow, iColumn).Font.Color = RGB(0, 0, 0)
                    Cells(iRow, iColumn).Interior.Color = RGB(255, 255, 153)
                End If
            Next iColumn
    flNextiRow:
        Next iRow
     
        ThisWorkbook.Worksheets("2018").Protect "2018"
     
     
    End Sub

  9. #9
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Oui, pardon, il y a une faute de frappe au niveau de la boucle For --> c'est une boucle For Each :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim cellu As Range
    For Each cellu In Range("AA20:ACD139")
        If cellu.Value = "j" Then cellu.Font.Color = RGB(192, 32, 255)
    Next cellu
    Mais je tiens à repriser que ceci n'est PAS une mise en forme conditionnelle. C'est une mise en forme à un moment donné qui ne s'adaptera PAS au contenu de la cellule après qu'on ait lancé le code.

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/08/2016, 08h29
  2. [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
  3. [XL-2010] Mise en forme conditionnelle par rapport à une autre cellule
    Par patch2007 dans le forum Excel
    Réponses: 10
    Dernier message: 09/03/2012, 08h56
  4. [XL-2010] Mise en forme conditionnelle par ligne
    Par sbricout dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 21/02/2011, 17h51
  5. mise en forme conditionnelle par Date
    Par bibi28 dans le forum IHM
    Réponses: 10
    Dernier message: 24/08/2008, 16h17

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