Domanda

Ho un Foglio di calcolo di Excel come questo

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

Ora voglio raggruppare i dati di una carta di identità alternando il colore di sfondo delle righe

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

Qualcuno mi può aiutare con una macro o codice VBA

Grazie

È stato utile?

Soluzione

Penso che questo non quello che stai cercando.Flip colore quando la cella nella colonna a cambiamenti di valore.Funziona fino a quando non vi è alcun valore nella colonna 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

Altri suggerimenti

Io uso questa formula per ottenere l'ingresso per una formattazione condizionale:

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

Dove la colonna B contiene l'elemento che deve essere raggruppati e E è un ausiliario colonna.Ogni volta che la cella superiore (B1 in questo caso) è uguale a quello attuale (B2), la riga superiore del contenuto da colonna E viene restituito.In caso contrario, verrà restituito 1 meno che il contenuto (che è, il outupt sarà 0 o 1, a seconda del valore della cella superiore).

enter image description here

enter image description here

enter image description here

Basato su Jason Z risposta, che dai test sembra essere sbagliato (almeno su Excel 2010), ecco un po ' di codice che succede a lavorare per me :

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

È necessario utilizzare il codice?se la tabella è statico, quindi perché non utilizzare l'auto capacità di formattazione?

enter image description here

Si può anche aiutare se si "unisci celle" dei dati stessi.quindi, forse, se si uniscono le cellule di "dati ulteriori dati, anche altri dati" in una cella, è possibile gestire più facilmente con il classico "ogni riga è una riga" del caso.

Sto barrowing questo e ho cercato di modificarlo per il mio uso.Ho ordine di numeri in colonna a e alcuni ordini prendere più righe.Voglio solo alternano il bianco e il grigio per il numero di ordine.Quello che ho qui alterna ogni riga.

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

Se si seleziona la Formattazione Condizionale opzione di menu sotto la voce di menu Formato, vi sarà data una finestra di dialogo che consente di creare un po ' di logica si applica al cellulare.

La tua logica non potrebbe essere lo stesso codice di cui sopra, si potrebbe guardare più come:

Valore della cella è uguale a | | e | Nero ....Quindi scegliere il colore.

È possibile selezionare il pulsante aggiungi e rendere la condizione di grandi dimensioni di cui hai bisogno.

Ho rielaborato Bartdude la risposta, per il Grigio chiaro / Bianco, basato su un configurabili colonna, utilizzando i valori RGB.Un valore booleano var è capovolto quando cambia il valore e questo viene utilizzato per indicizzare i colori array tramite il numero intero valori True e False.Per me funziona al 2010.Chiamare il sub con il numero del foglio.

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 opzionale :per dati SQL, con qualsiasi colore di valori NULL con la stessa giallo utilizzato in sql server management studio

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

Io uso questa regola in Excel per formattare a righe alternate:

  1. Evidenziare le righe che si desidera applicare un'alternanza di stile.
  2. Premere Il Tasto "Formattazione Condizionale" -> Nuova Regola
  3. Selezionare "Utilizza una formula per determinare le celle da formattare" (ultima voce)
  4. Inserire la regola in formato valore: =MOD(ROW(),2)=0
  5. Premere il tasto "Formato", rendono necessaria la formattazione di righe alternate, ad esempio.Compila -> Colore.
  6. Premere OK, quindi Premere OK.

Se si desidera formattare alternati a colonne, invece, utilizzare =MOD(COLUMN(),2)=0

Voilà!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top