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 :

Coloriage cellules en fonction de leurs contenus


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 116
    Par défaut Coloriage cellules en fonction de leurs contenus
    Bonjour à tous,

    J'ai un code qui me permet de colorier des cellules en entrant une série dans un inputbox.
    Je m'explique :
    J'ai dans ma colonne B, de B7 à B18, des valeurs correspondants à "name-1" dans B7, "name-2" dans B8 etc jusqu'à "name-12" dans B18.
    Ensuite j'ai ce code ci-dessus qui me permet de colorier les cellules en fonction de ce que j'entre dans mon inputbox :

    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
    Sub test()
    Dim x$, x1$, rng As Range, arr, O&, G&, B&, i&, clr&
    Dim c1 As Range, c2 As Range, mess$, c1a As Range, c2a As Range
    Retry:
    x = InputBox("enter one/two number") 'sample: name-X-3-6-X-9-/-11-12
    If x <> "" Then
      O = RGB(255, 200, 50): G = RGB(0, 255, 0): B = RGB(0, 150, 255) 'Replacing color values with variables
      Set rng = Sheets("Feuil1").Range("b7:b" & Sheets("Feuil1").[b65536].End(3).Row) 'assign cell area to rng
      x = Replace(x, "name-X-/-", "2000-2000,") '**************added line**************
      x = Replace(x, "name-/-X-", "-/-X-")
      x = Replace(x, "name-/-", "") 'If the beginning is "name-/-" then delete it
                                         'sample: no change happened --> name-X-3-6-X-9-/-11-12
      x = Replace(x, "name-X-", ",,") 'sample: name-X-3-6-X-9-/-11-12 --> ,,3-6-X-9-/-11-12
      x = Replace(x, "-/-X-", ",1000-1000,")
      If x Like ",#*" Then x = Mid(x, 2) '**************added line**************
      x = Replace(x, "-X-/-", ",2000-2000,")
      x = Replace(x, "name", "1") 'If the beginning is "name-#" then Convert to "1-#"
                                         'sample: no change happened --> ,,3-6-X-9-/-11-12
      x = Replace(x, "-/-", ",") 'sample: ,,3-6-X-9-/-11-12 --> ,,3-6-X-9,11-12
      x = Replace(x, "-X-", ",,,") 'sample: ,,3-6-X-9,11-12 --> ,,3-6,,,9,11-12
      arr = Split(x, ",") 'sample: arr have 7 elements(blank,blank,3-6,blank,blank,9,11-12)
      For i = 0 To UBound(arr) 'This cycle is used to transform elements and determine whether input is legal.
        If arr(i) <> "" Then
          If Not arr(i) Like "*-*" Then arr(i) = arr(i) & "-" & arr(i) 'sample: arr(blank,blank,3-6,blank,blank,9-9,11-12)
          If Not IsNumeric(Replace(arr(i), "-", "")) Or Not arr(i) Like "*#-#*" Then
            MsgBox "Input Error!": GoTo Retry 'If there is a mistake, start again.
          End If
        End If
      Next i
      x = Join(arr, ",") 'sample: ,,3-6,,,9,11-12 --> ,,3-6,,,9-9,11-12
      x = Replace(x, "-", ",") 'sample: ,,3-6,,,9-9,11-12 --> ,,3,6,,,9,9,11,12
      arr = Split(x, ",") 'sample: arr have 10 elements(blank,blank,3,6,blank,blank,9,9,11,12)
                               'now, each two elements represent a region. blank means filling green
      rng.Interior.Color = B 'set rng color to blue
      For i = 0 To UBound(arr) Step 2 'deal with two elements at a time
        If arr(i) = "" Then 'if blank then
          If i = 0 Then arr(i) = 1 Else arr(i) = arr(i - 1) + 1 'the previous blank = 1 or (the number in front of it + 1)
          arr(i + 1) = arr(i + 2) - 1 'the next blank = the number behind it - 1
          clr = G 'assign the green value to clr
        Else 'if not blank then
          If arr(i) = 1000 Then
            arr(i) = arr(i + 2) - 1
            arr(i + 1) = arr(i)
            clr = G
          ElseIf arr(i) = 2000 Then
            If i = 0 Then
              arr(i) = 1
              arr(i + 1) = 1
            Else
              arr(i) = arr(i - 1) + 1
              arr(i + 1) = arr(i)
            End If
            clr = G
          Else
            clr = O 'assign the orange value to clr
          End If
        End If
        With rng
          Set c1 = .Find("name-" & arr(i), lookat:=xlWhole) 'search for existence
          Set c1a = c1
          Do
            If c1a = c1a.Offset(1) Then Set c1a = c1a.Offset(1) Else Exit Do
          Loop
          Set c2 = .Find("name-" & arr(i + 1), lookat:=xlWhole)
          Set c2a = c2
          Do
            If c2a = c2a.Offset(1) Then Set c2a = c2a.Offset(1) Else Exit Do
          Loop
          If Not c1 Is Nothing And Not c2 Is Nothing Then 'if exists c1 and c2 then
            Range(Range(c1, c1a), Range(c2, c2a)).Interior.Color = clr 'fill the cell area with color, clr has been assigned before
          Else 'if not exists c1 or c2 then
            mess = trans(mess, arr(i), arr(i + 1)) 'writing information to mess, trans() is custom functions
          End If
        End With
        Set c1 = Nothing: Set c1a = Nothing: Set c2 = Nothing: Set c2a = Nothing
      Next i
    Else
      mess = "you have canceled"
    End If
    If mess <> "" Then MsgBox mess
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Function trans(mess, s1, s2)
      trans = mess & "the range containing ""name-" & s1 & """ & ""name-" & s2 & """ does not exist !!" & vbCrLf
    End Function
    Voici des exemples que je peux entrer dans mon inputbox :
    "name-8" : "name-1" jusqu'à "name-8" se colorient en orange et "name-9" jusqu'à "name-12" en bleu
    "name-/-9-12" : name-1 à name-8 en bleu et name-9 à name-12 en orange
    "name-X-9-12" : name-1 à name-8 en vert et name-9 à name-12 en orange
    "name-3-/-6-8-X-10-12" : name-1 à name-3 ainsi que name-6 à name-8 et name-10 à name-12 en orange, name-4 à name-5 en bleu, name-9 en vert
    "name-/-X-3-6-X-/-9-12" : name-3 à name-6 ainsi que name-9 à name-12 en orange, name-1 et name-8 en bleu, name-2 et name-7 en vert

    Cependant comme vous pouvez le constater, si j'entre par exemple : "name-3-/-X-9-12", il y a plusieurs "name-n" dans la plage "-/-X-" et donc la répartition des couleurs n'est pas bonne (name-4 à name-7 en bleu et name-8 en vert) contrairement au dernier exemple (name-/-X-3-6-X-/-9-12) où ici name-1 est en bleu et name-2 en vert car la répartition se fait bien qu'entre 2 "name-n".
    Ce que j'aimerais donc faire, c'est de garder la même logique que précédemment, c'est à dire si seulement un -/- ou un -X- sont présents dans une plage alors je peux colorier plusieurs "name-n" compris dans le -/- ou le -X- (voir ex name-/-9-12, name-X-9-12, name-3-/-6-8-X-10-12). Par contre, lorsque j'ai ces 2 cas : "-/-X" et "-X-/-" , j'aimerais changer la logique.
    Par exemple, si je souhaite avoir name-1 à name-3 et name-9 à name-12 en orange, puis name-4 ainsi que name-6 et name-7 en bleu, puis name-5 et name-8 en vert, cela me donnerait :
    "name-3-/-X-/-/-X-9-12"
    Et donc si je combine ça à ce que j'ai dis précédemment, je pourrais avoir : "name-X-3-/-X-/-/-X-9-/-12" ce qui me donnerait name-1 à name-2 ainsi que name-5 et name-8 en vert, name-3 ainsi que name-9 et name-12 en orange, et pour finir, name-4, name-6, name-7 et name-10 à name-11 en bleu.
    Autre exemple : "name-2-/-5-X-/-X-X-10-12" => name-1 à name-2 ainsi que name-5 et name-10 à name-12 en orange, name-3 à name-4 ainsi que name-7 en bleu et le reste en vert
    etc..

    Je bloque car mis à part rajouter des lignes de codes au début et mettre x = replace("tous les cas possibles") ça serait beaucoup trop long...
    Je suis donc preneur pour des solutions!

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

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    Essayez 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
    Option Compare Text
     
    Sub test()
        Dim x As String, NbTiret
     
        Application.ScreenUpdating = False
        Range("B7:B18").Interior.ColorIndex = xlNone
        x = InputBox("enter one/two number")
        x = Replace(x, "name", "")
        NbTiret = Split(x, "-")
     
        If UBound(NbTiret) = 1 Then 'Cas où il n'y a qu'un seul élément à traiter
            Select Case NbTiret(1)
                Case "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"
                    Range("B7:B" & NbTiret(1) + 6).Interior.Color = RGB(255, 200, 50) 'Orange
                    If UBound(NbTiret) < 12 Then Range("B" & NbTiret(1) + 7 & ":B18").Interior.Color = RGB(0, 150, 255)
                Case Is = "/"
                    Range("B7:B18").Interior.Color = RGB(0, 150, 255) 'Bleu
                Case Is = "X"
                    Range("B7:B18").Interior.Color = RGB(0, 255, 0) 'Vert
            End Select
        ElseIf UBound(NbTiret) > 1 Then 'cas avec plusieurs éléments à traiter
            Pos = 0
            For i = 0 To UBound(NbTiret)
                Select Case NbTiret(i)
                    Case "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"
                        If NbTiret(i - 1) <> "/" And NbTiret(i - 1) <> "X" And NbTiret(i - 1) <> "" Then
                            Range(Cells(NbTiret(i - 1) + 6, "B"), Cells(NbTiret(i) + 6, "B")).Interior.Color = RGB(255, 200, 50) 'Orange
                        ElseIf NbTiret(i - 1) <> "/" And NbTiret(i - 1) <> "X" And NbTiret(i - 1) = "" Then
                            Range(Cells(7, "B"), Cells(NbTiret(i) + 6, "B")).Interior.Color = RGB(255, 200, 50) 'Orange
                        Else
                            Cells(NbTiret(i) + 6, "B").Interior.Color = RGB(255, 200, 50) 'Orange
                        End If
                        Pos = NbTiret(i)
                    Case Is = "/"
                        Cells(Pos + 7, "B").Interior.Color = RGB(0, 150, 255) 'Bleu
                        Pos = Pos + 1
                    Case Is = "X"
                        Cells(Pos + 7, "B").Interior.Color = RGB(0, 255, 0) 'Vert
                        Pos = Pos + 1
                End Select
            Next i
        Else
            MsgBox "Erreur"
            Exit Sub
        End If
     
        'complétion des couleurs
        For i = 8 To 18
            If Cells(i, "B").Interior.Color = 16777215 Then Cells(i, "B").Interior.Color = Cells(i - 1, "B").Interior.Color
        Next
    End Sub
    Cdlt

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 116
    Par défaut
    Bonjour Arturo,

    Merci!
    Alors ton code marche mais il y a 2 problèmes.
    Si par exemple je mets name-/-4, name-1 à name-3 est en bleu et name-4 en orange ça ok mais name-5 à name-12 aussi est en orange alors que ça doit être bleu. C’est le même problème si je mets name-X-4.
    Et le second problème, c’est que si j’ajoute plusieurs même name-n, le coloriage ne se répartie pas bien :/
    Par exemple, si j’ai 2 name-4 et que j’entre name-4 dans l’inputbox, name-1 jusqu’au 2ème name-4 sont en orange et name-5 à name-12 en bleu

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

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    Voici avec les modifs,
    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
    Option Compare Text
     
    Sub test()
        Dim x As String, NbTiret As Variant
        Dim DernCell As Boolean
     
        Application.ScreenUpdating = False
        Range("B7:B18").Interior.ColorIndex = xlNone
        x = InputBox("enter one/two number")
        x = Replace(x, "name", "")
        NbTiret = Split(x, "-")
     
        If UBound(NbTiret) = 1 Then 'Cas où il n'y a qu'un seul élément à traiter
            Select Case NbTiret(1)
                Case "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"
                    Range("B7:B" & NbTiret(1) + 6).Interior.Color = RGB(255, 200, 50) 'Orange
                    If UBound(NbTiret) < 12 Then Range("B" & NbTiret(1) + 7 & ":B18").Interior.Color = RGB(0, 150, 255)
                Case Is = "/"
                    Range("B7:B18").Interior.Color = RGB(0, 150, 255) 'Bleu
                Case Is = "X"
                    Range("B7:B18").Interior.Color = RGB(0, 255, 0) 'Vert
            End Select
        ElseIf UBound(NbTiret) > 1 Then 'cas avec plusieurs éléments à traiter
            Pos = 0
            For i = 0 To UBound(NbTiret)
                Select Case NbTiret(i)
                    Case "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"
                        If NbTiret(i - 1) <> "/" And NbTiret(i - 1) <> "X" And NbTiret(i - 1) <> "" Then
                            Range(Cells(NbTiret(i - 1) + 6, "B"), Cells(NbTiret(i) + 6, "B")).Interior.Color = RGB(255, 200, 50) 'Orange
                        ElseIf NbTiret(i - 1) <> "/" And NbTiret(i - 1) <> "X" And NbTiret(i - 1) = "" Then
                            Range(Cells(7, "B"), Cells(NbTiret(i) + 6, "B")).Interior.Color = RGB(255, 200, 50) 'Orange
                        Else
                            Cells(NbTiret(i) + 6, "B").Interior.Color = RGB(255, 200, 50) 'Orange
                        End If
                        Pos = NbTiret(i)
                    Case Is = "/"
                        Cells(Pos + 7, "B").Interior.Color = RGB(0, 150, 255) 'Bleu
                        Pos = Pos + 1
                    Case Is = "X"
                        Cells(Pos + 7, "B").Interior.Color = RGB(0, 255, 0) 'Vert
                        Pos = Pos + 1
                End Select
            Next i
        Else
            MsgBox "Erreur"
            Exit Sub
        End If
     
        'complétion des couleurs
        For i = 8 To 18
            If Cells(i - 1, "B").Interior.Color = RGB(255, 200, 50) And Cells(i, "B").Interior.Color = 16777215 Then
                Cells(i, "B").Interior.Color = RGB(0, 150, 255) 'Bleu
            ElseIf Cells(i, "B").Interior.Color = 16777215 Then 'Si les cellules testées ne contiennent aucune couleur
                'on scrute les cellules suivantes pour savoir si la cellule testée est la dernière valeur connue
                DernCell = True
                For j = i + 1 To 18
                    If Cells(j, "B").Interior.Color <> 16777215 Then
                        DernCell = False
                    End If
                Next j
                If DernCell = True Then
                    Cells(i, "B").Interior.Color = RGB(0, 150, 255)
                Else
                    Cells(i, "B").Interior.Color = Cells(i - 1, "B").Interior.Color
                End If
            End If
        Next
    End Sub
    J'ai testé de nombreux cas de figures, pouvez-vous me confirmer que dans le cas suivant(vu que dans toutes les propositions présentées, aucune ne termine par un X):
    name-8-/-X
    on devrait trouver:
    -de 1 à 8 en orange
    -9 en bleu
    -10 en vert
    -et de 11 à 12 en bleu
    En clair, quelle que soit la dernière valeur (chiffre ou "/" ou "X") de l'élément à tester (Ex: name-8-/-X), et que, si celle-ci n'occupe pas la position 12, toutes celles qui viennent après jusqu'à la douzième doivent être en bleu.

    Cdlt

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 116
    Par défaut
    Je test ton code cette semaine je te retiens au courant

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 116
    Par défaut
    Re!

    Nan il n'y a jamais de / ou de X à la fin, en fait si la série se termine par name-n, name-n+1 à name-12 seront toujours en bleu.
    En fait voici un peu plus en détail ce que je veux faire :
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. [XL-2007] Recherche de cellules en fonction de leur valeur
    Par christophe_fr dans le forum Excel
    Réponses: 6
    Dernier message: 08/07/2014, 19h36
  2. [XL-2013] Mise en forme de cellules en fonction de leur valeur (contenu dans un tableau )
    Par pedro2792 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/01/2014, 15h03
  3. [PHPExcel] Agrandir les cellules en fonction de leur contenu
    Par KDZCrew dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 04/05/2011, 13h08
  4. Fusion de cellules en fonction de leur valeur
    Par Eusebe dans le forum BIRT
    Réponses: 9
    Dernier message: 29/04/2010, 18h56
  5. Fusion de cellules en fonction de leurs valeurs
    Par sisi37 dans le forum Composants
    Réponses: 1
    Dernier message: 28/10/2008, 15h40

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