Alternance de groupes de coloration de lignes dans Excel
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
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).
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 ?
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 :
- Mettez en surbrillance les lignes auxquelles vous souhaitez appliquer un style alterné.
- Appuyez sur "Formatage conditionnel" -> Nouvelle règle
- Sélectionnez "Utiliser une formule pour déterminer les cellules à formater" (dernière entrée)
- Entrez la règle dans la valeur de format :
=MOD(ROW(),2)=0
- Appuyez sur "Format", effectuez le formatage requis pour les lignes alternées, par exemple.Remplissage -> Couleur.
- Appuyez sur OK, appuyez sur OK.
Si vous souhaitez plutôt formater des colonnes en alternance, utilisez =MOD(COLUMN(),2)=0
Voilà !