2008-08-25 33 views
10

Tengo una hoja de cálculo de Excel como estoalterna grupos de filas colorear en 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 

Ahora quiero agrupar los datos de uno Identificación del alternando el color de fondo de las filas

 
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 

Puede alguien me ayuda con una macro o un código VBA

Gracias

Respuesta

4

Creo que esto hace lo que estás buscando. Cambia de color cuando la celda en la columna A cambia de valor. Decir, hasta que no hay valor en la columna 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

Puede que no haya entendido bien, pero desde donde lo veo y de mis pruebas, esto cambia el color de una línea a otra, siempre y cuando las columnas A y B no están vacías ... por lo que no responde la pregunta. Pero puede haberme perdido algo ... –

0

Si selecciona la Condición Al formatear la opción de menú en el elemento de menú Formato, se le dará un cuadro de diálogo que le permite construir una lógica para aplicar a esa celda.

Su lógica podría no ser el mismo que el código anterior, podría parecer más como:

valor de celda es | igual a | | y | Blanco .... Luego elige el color.

Puede seleccionar el botón Agregar y hacer que la condición sea tan grande como lo necesite.

1

¿Tienes que usar el código? si la tabla es estática, ¿por qué no utilizar la capacidad de formateo automático?

enter image description here

También puede ayudar si "combinar las celdas" de los mismos datos. así que tal vez si fusionas las celdas de "datos, más datos, incluso más datos" en una celda, puedes lidiar más fácilmente con el caso clásico "cada fila es una fila".

+0

Esto es lo que necesito pero no sé cómo hacer esto :) base en explicación proporcionada –

33

utilizo esta fórmula para obtener la entrada para un formato condicional:

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

Cuando en la columna B contiene el elemento que necesita ser agrupados y E es una columna auxiliar. Cada vez que la celda superior (B1 en este caso) es la misma que la actual (B2), se devuelve el contenido de la fila superior de la columna E. De lo contrario, devolverá 1 menos ese contenido (es decir, el outupt será 0 o 1, dependiendo del valor de la celda superior).

enter image description here

enter image description here

enter image description here

+6

Gran respuesta. Como alternativa a la función MOD, puede usar '1 - E1'. Así que la fórmula completa es '= IF (B2 = B1, E1,1-E1)' – Kasaku

+3

En mi caso, no puedo usar el punto y coma (;) en la fórmula, solo la coma (,) es aceptable para Excel. Estoy usando MS Excel v 14.0.7106.5003 de 32 bits. – rockXrock

+1

¿Es posible evitar el uso de una columna adicional? –

1

Sobre la base de la respuesta de Jason Z, que de mis pruebas parece estar mal (al menos en Excel 2010), aquí hay un poco de código que pasa a trabajar para mí:

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

Originalmente respondí la pregunta en '08, por lo que no me sorprendería si Office 2010 rompiera algo de Office 2007. –

1

Estoy barriendo esto e intenté modificarlo para mi uso. Tengo números de orden en la columna a y algunos pedidos toman varias filas. Solo quiero alternar el blanco y el gris por número de orden. Lo que tengo aquí alterna cada fila.

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

he vuelto a trabajar respuesta de Bartdude, de gris claro/blanco en base a una columna configurable, utilizando valores RGB. Una var booleana se invierte cuando el valor cambia y esto se usa para indexar la matriz de colores a través de los valores enteros de verdadero y falso. Funciona para mí en 2010. Llame al submarinista con el número de hoja.

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 

bono Opcional: para datos SQL, el color de algún valor nulo con el mismo color amarillo que se usó en 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

utilizo esta regla en Excel para dar formato a filas alternas:

  1. Resalte las filas a las que desea aplicar un estilo alternativo.
  2. Prensa "Formato condicional" -> Nueva regla
  3. Seleccione "Usar una fórmula para determinar qué células para formatear" (última entrada)
  4. Introduzca regla en valor de formato: =MOD(ROW(),2)=0
  5. Prensa "Formato" , haga el formato requerido para filas alternas, ej. Rellenar -> Color.
  6. Presione OK, presione OK.

Si desea formatear columnas alternas en cambio, utilizar =MOD(COLUMN(),2)=0

Voila!

+0

Hola, responda color de fila alternativo, las preguntas quieren colorear grupo de datos no aho .. – ozmike

Cuestiones relacionadas