Macro do Excel para formatar células com base no valor e no grupo com linhas em branco abaixo

1

Estou tentando criar uma macro do Excel para formatar alguns dados que são exportados de outro programa. Aqui está um exemplo do layout de dados:

ID        Code      SubCodes
1         A1        1
1                   30
1         B2        23
1                   35
2         A1        1
2                   30
2         A1        6
2                   10
2                   12
2         C3        2
2         C3        4

Eu quero criar "grupos" principais e "grupos" menores usando formatação. Eu não necessariamente quero usar o recurso de agrupamento do Excel. Eu gostaria de primeiro agrupar por ID, o que é bastante fácil, e adicionar uma linha de borda grande em negrito após cada ID. A parte em que estou tendo problemas é com os grupos menores, já que os subcódigos não têm o código pai em sua linha, se houver mais de 1, e pode haver vários códigos com diferentes subcódigos diferentes. Os grupos menores teriam então uma linha de fronteira mais fraca depois de cada um.

Aqui está um exemplo da formatação desejada:

ID        Code      SubCodes
============================
1         A1        1
1                   30
----------------------------
1         B2        23
1                   35
============================
2         A1        1
2                   30
----------------------------
2         A1        6
2                   10
2                   12
----------------------------
2         C3        2
----------------------------
2         C3        4
============================

Então, como posso fazer com que esses grupos menores incluam as linhas com códigos em branco abaixo deles?
Isso seria preferencialmente em uma macro como o arquivo é exportado do programa e, em seguida, precisará ser formatado. No entanto, se houver uma maneira melhor, estou definitivamente aberto a isso. O objetivo final é tornar os dados facilmente legíveis.

Aqui está o código que tenho agora para criar a formatação do maior agrupamento.

Sub Macro1()

    Dim StartRow As String
    Dim LastRow As Integer
    Dim Rng As Range
    Dim cValue As String

    Application.ScreenUpdating = False

    StartRow = "1"
    LastRow = ActiveSheet.UsedRange.Rows.Count
    Set Rng = Range("A" & StartRow, "A" & LastRow)

    Cells.ClearOutline

    cValue = Range("A" & StartRow).Value
    For Each Cell In Rng
        If Cell.Value <> cValue Then
            With Cell.Borders(xlEdgeTop)
                .LineStyle = xlContinuous
                .ColorIndex = 0
                .TintAndShade = 0
                .Weight = xlMedium
            End With
        Else
            cValue = Cell.Value
        End If
    Next Cell

    Application.ScreenUpdating = True 

End Sub
    
por ElectronicDrug 22.06.2015 / 18:11

1 resposta

1

Isso deve funcionar (mudar de acordo com sua preferência) -

Sub Macro1()

     Dim LastRow As Integer
     LastRow = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row
     ActiveSheet.Cells.Borders.LineStyle = xlNone

    For Each c In Range("A1:A" & LastRow)
        If c <> c.Offset(1) Then
            With Range(c, c.Offset(, 2)).Borders(xlEdgeBottom)
                .LineStyle = xlContinuous
                .ColorIndex = 0
                .TintAndShade = 0
                .Weight = xlMedium
            End With

        End If
    Next

    For Each c In Range("B1:B" & LastRow)
        If c.Borders(xlEdgeBottom).LineStyle = xlNone And c.Offset(1) <> "" Then
            With Range(c.Offset(, -1), c.Offset(, 1)).Borders(xlEdgeBottom)
                .LineStyle = xlDashDot
            End With
        End If
    Next

End Sub
    
por 22.06.2015 / 20:34