Question

J'ai une feuille de calcul Excel comme celle-ci

id | data for id
   | more data for id
id | data for id
id | data for id
   | more data for id
   | even more data for id
id | data for id
   | more data for id
id | data for id
id | data for id
   | more data for id

Maintenant, je souhaite regrouper les données d'un identifiant en alternant la couleur d'arrière-plan des lignes

var color = white
for each row
    if the first cell is not empty and color is white
        set color to green
    if the first cell is not empty and color is green
        set color to white
    set background of row to color

Quelqu'un peut-il m'aider avec une macro ou du code VBA

Merci

Était-ce utile?

La solution

Je pense que cela fait ce que vous recherchez.Inverse la couleur lorsque la cellule de la colonne A change de valeur.S'exécute jusqu'à ce qu'il n'y ait plus de valeur dans la colonne B.

Public Sub HighLightRows()
    Dim i As Integer
    i = 1
    Dim c As Integer
    c = 3       'red

    Do While (Cells(i, 2) <> "")
        If (Cells(i, 1) <> "") Then    'check for new ID
            If c = 3 Then
                c = 4   'green
            Else
                c = 3   'red
            End If
        End If

        Rows(Trim(Str(i)) + ":" + Trim(Str(i))).Interior.ColorIndex = c
        i = i + 1
    Loop
End Sub

Autres conseils

J'utilise cette formule pour obtenir l'entrée d'une mise en forme conditionnelle :

=IF(B2=B1,E1,1-E1))    [content of cell E2]

Où la colonne B contient l'élément qui doit être regroupé et E est une colonne auxiliaire.Chaque fois que la cellule supérieure (B1 dans ce cas) est la même que la cellule actuelle (B2), le contenu de la ligne supérieure de la colonne E est renvoyé.Sinon, il renverra 1 moins ce contenu (c'est-à-dire que la sortie sera 0 ou 1, selon la valeur de la cellule supérieure).

enter image description here

enter image description here

enter image description here

Basé sur la réponse de Jason Z, qui d'après mes tests semble fausse (au moins sur Excel 2010), voici un peu de code qui fonctionne pour moi :

Public Sub HighLightRows()
    Dim i As Integer
    i = 2 'start at 2, cause there's nothing to compare the first row with
    Dim c As Integer
    c = 2       'Color 1. Check http://dmcritchie.mvps.org/excel/colors.htm for color indexes

    Do While (Cells(i, 1) <> "")
        If (Cells(i, 1) <> Cells(i - 1, 1)) Then 'check for different value in cell A (index=1)
            If c = 2 Then
                c = 34   'color 2
            Else
                c = 2   'color 1
            End If
        End If

        Rows(Trim(Str(i)) + ":" + Trim(Str(i))).Interior.ColorIndex = c
        i = i + 1
    Loop
End Sub

Faut-il utiliser du code ?si le tableau est statique, pourquoi ne pas utiliser la fonctionnalité de formatage automatique ?

enter image description here

Cela peut également être utile si vous « fusionnez des cellules » des mêmes données.alors peut-être que si vous fusionnez les cellules de « données, plus de données, encore plus de données » en une seule cellule, vous pourrez plus facilement gérer le cas classique « chaque ligne est une ligne ».

Je le propose et j'ai essayé de le modifier pour mon usage.J'ai des numéros de commande dans la colonne a et certaines commandes occupent plusieurs lignes.Je veux juste alterner le blanc et le gris par numéro de commande.Ce que j'ai ici alterne chaque ligne.

ChangeBackgroundColor() ' ChangeBackgroundColor Macro ' ' Keyboard Shortcut: Ctrl+Shift+B Dim a As Integer a = 1 Dim c As Integer c = 15 'gray Do While (Cells(a, 2) <> "") If (Cells(a, 1) <> "") Then 'check for new ID If c = 15 Then c = 2 'white Else c = 15 'gray End If End If Rows(Trim(Str(a)) + ":" + Trim(Str(a))).Interior.ColorIndex = c a = a + 1 Loop

End Sub

Si vous sélectionnez l'option de menu Mise en forme conditionnelle sous l'élément de menu Format, une boîte de dialogue vous permettra de construire une logique à appliquer à cette cellule.

Votre logique n'est peut-être pas la même que votre code ci-dessus, elle pourrait ressembler davantage à :

La valeur cellulaire est | égal à | | et | Blanc ....Choisissez ensuite la couleur.

Vous pouvez sélectionner le bouton Ajouter et rendre la condition aussi grande que nécessaire.

J'ai retravaillé la réponse de Bartdude, pour Light Grey / White basée sur une colonne configurable, en utilisant des valeurs RVB.Une variable booléenne est inversée lorsque la valeur change et est utilisée pour indexer le tableau de couleurs via les valeurs entières True et False.Fonctionne pour moi en 2010.Appelez le sous avec le numéro de feuille.

Public Sub HighLightRows(intSheet As Integer)
    Dim intRow As Integer: intRow = 2 ' start at 2, cause there's nothing to compare the first row with
    Dim intCol As Integer: intCol = 1 ' define the column with changing values
    Dim Colr1 As Boolean: Colr1 = True ' Will flip True/False; adding 2 gives 1 or 2
    Dim lngColors(2 + True To 2 + False) As Long   ' Indexes : 1 and 2
          ' True = -1, array index 1.    False = 0, array index 2.
    lngColors(2 + False) = RGB(235, 235, 235) ' lngColors(2) = light grey
    lngColors(2 + True) = RGB(255, 255, 255) '  lngColors(1) = white

    Do While (Sheets(intSheet).Cells(intRow, 1) <> "")
        'check for different value in intCol, flip the boolean if it's different
        If (Sheets(intSheet).Cells(intRow, intCol) <> Sheets(intSheet).Cells(intRow - 1, intCol)) Then Colr1 = Not Colr1
        Sheets(intSheet).Rows(intRow).Interior.Color = lngColors(2 + Colr1) ' one colour or the other
        ' Optional : retain borders (these no longer show through when interior colour is changed) by specifically setting them
        With Sheets(intSheet).Rows(intRow).Borders
            .LineStyle = xlContinuous
            .Weight = xlThin
            .Color = RGB(220, 220, 220)
        End With
        intRow = intRow + 1
    Loop
End Sub

Bonus optionnel :pour les données SQL, coloriez toutes les valeurs NULL avec le même jaune que celui utilisé dans SSMS

Public Sub HighLightNULLs(intSheet As Integer)
    Dim intRow As Integer: intRow = 2 ' start at 2 to avoid the headings
    Dim intCol As Integer
    Dim lngColor As Long: lngColor = RGB(255, 255, 225) ' pale yellow

    For intRow = intRow To Sheets(intSheet).UsedRange.Rows.Count
        For intCol = 1 To Sheets(intSheet).UsedRange.Columns.Count
            If Sheets(intSheet).Cells(intRow, intCol) = "NULL" Then Sheets(intSheet).Cells(intRow, intCol).Interior.Color = lngColor
        Next intCol
    Next intRow
End Sub

J'utilise cette règle dans Excel pour formater des lignes alternées :

  1. Mettez en surbrillance les lignes auxquelles vous souhaitez appliquer un style alterné.
  2. Appuyez sur "Formatage conditionnel" -> Nouvelle règle
  3. Sélectionnez "Utiliser une formule pour déterminer les cellules à formater" (dernière entrée)
  4. Entrez la règle dans la valeur de format : =MOD(ROW(),2)=0
  5. Appuyez sur "Format", effectuez le formatage requis pour les lignes alternées, par exemple.Remplissage -> Couleur.
  6. Appuyez sur OK, appuyez sur OK.

Si vous souhaitez plutôt formater des colonnes en alternance, utilisez =MOD(COLUMN(),2)=0

Voilà !

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top