2008-08-25 24 views
10

J'ai une feuille de calcul Excel comme celui-ciAlternance groupes coloration de lignes dans Excel

 
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 veux 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 

Can quelqu'un me aider avec une macro ou un code VBA

Merci

Répondre

4

Je pense que cela fait ce que vous cherchez. Inverse la couleur lorsque la cellule de la colonne A change de valeur. Runs jusqu'à ce qu'il n'y a pas 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 
+0

Je peux avoir mal compris, mais d'où je le vois et de mes tests, cela change de couleur de ligne en ligne, aussi longtemps que les colonnes A et B ne sont pas vides ... donc ne répondant pas à la question. Mais j'ai peut-être raté quelque chose ... –

0

Si vous sélectionnez la condition Dans l'option de menu Mise en forme de l'élément de menu Format, une boîte de dialogue vous permet de créer une logique à appliquer à cette cellule.

Votre logique pourrait ne pas être le même que votre code ci-dessus, il pourrait ressembler davantage:

valeur de la cellule est | égal à | | et | Blanc .... Choisissez ensuite la couleur.

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

1

Devez-vous utiliser du code? si la table est statique, alors pourquoi ne pas utiliser la capacité de formatage automatique?

enter image description here

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

+0

Ce que j'ai besoin mais je ne sais pas comment faire :) base sur l'explication fournie –

33

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

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

Lorsque 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 l'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

+6

Grande réponse. Comme alternative à la fonction MOD, vous pouvez utiliser '1 - E1'. Donc la formule complète est '= IF (B2 = B1, E1,1-E1)' – Kasaku

+3

Dans mon cas, je ne peux pas utiliser de point-virgule (;) dans la formule, seule la virgule (,) est acceptable pour Excel. J'utilise MS Excel v 14.0.7106.5003 32 bits. – rockXrock

+1

Est-il possible d'éviter d'utiliser une colonne supplémentaire? –

1

Sur la base de la réponse de Jason Z, de mes tests semble être mauvais (au moins sur Excel 2010), voici un peu de code qui arrive à travailler 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 
+0

J'ai d'abord répondu à la question en '08, donc ça ne me surprendrait pas du tout si Office 2010 cassait quelque chose Office 2007. –

1

Je suis le brouillon et j'ai essayé de le modifier pour mon utilisation. J'ai les numéros de commande dans la colonne a et certaines commandes prennent plusieurs lignes. Je veux juste alterner le blanc et le gris par numéro de commande. Ce que j'ai ici alterne chaque rangée.

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

0

J'ai retravaillé la réponse de Bartdude, pour gris clair/blanc basé sur une colonne configurable, en utilisant des valeurs RVB. Une variable booléenne est retournée lorsque la valeur change et est utilisée pour indexer le tableau de couleurs via les valeurs entières de Vrai et Faux. Fonctionne pour moi sur 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 

prime en option: pour les données SQL, la couleur des 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 
0

J'utilise cette règle dans Excel pour formater les lignes en alternance:

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

Si vous souhaitez formater des colonnes en alternance à la place, utilisez =MOD(COLUMN(),2)=0

Voila!

+0

Salut, vous répondez à la couleur de la ligne de remplacement, les questions veulent colorer le groupe de données non plus. – ozmike