Borda externa do Excel em torno de duas linhas

0
ID        Date         Code     Price
9202188   04/11/2014   212015   29,47
                       212026   30,5
9202190   03/11/2014   813012   99,47
                       814027   60,5

Eu tenho esses dados em um arquivo do Excel (como um exemplo). Cada linha começa com um número de ID e pode ter vários códigos associados a ela. (Eu tenho esses dados de um site antigo, aproximadamente neste formato).

Portanto, neste exemplo, o ID 9202188 tem dois códigos com dois preços em uma data, e esse é um item agrupado, por assim dizer.

Agora estou tentando fazer o Excel criar uma borda externa em torno do grupo inteiro, assim:

ID        Date         Code     Price
______________________________________
|9202188   04/11/2014   212015   29,47|
|_______________________212026___30,5_|
|9202190   03/11/2014   813012   99,47|
|_______________________814027___60,5_|

Isso pode ser automatizado para uma lista de, digamos, 200 grupos de itens (cada um contendo pelo menos 2 ou mais linhas, mas sempre apenas 1 número de ID)?

Eu também preciso poder classificar os grupos por ID, mantendo as linhas juntas, mas isso é outra questão.

    
por Kim Vande Walle 04.11.2014 / 10:57

2 respostas

2

Esta macro deve obter as bordas que você deseja.

Sub wrap_border()
    Dim r As Long, br As Long, lColumns_Wide As Long, lColumn_With_Solid_Data As Long
    lColumns_Wide = 17
    lColumn_With_Solid_Data = 16
    With ActiveSheet
        For r = 2 To .Cells(Rows.Count, lColumn_With_Solid_Data).End(xlUp).Row
            If CBool(Len(.Cells(r, 1).Value)) Then
                If CBool(Len(.Cells(r + 1, 1).Value)) Then
                    br = r
                ElseIf CBool(Application.CountA(.Cells(r + 1, 1).Resize(Rows.Count - r, 1))) Then
                    br = .Cells(Rows.Count, lColumn_With_Solid_Data).End(xlUp).Row
                    br = Application.Evaluate("MIN(INDEX(ROW(" & (r + 1) & ":" & br & ")+NOT(LEN(A" & (r + 1) & ":A" & br & "))*1E+99,,))")
                Else
                    br = .Cells(Rows.Count, lColumn_With_Solid_Data).End(xlUp).Row + 1
                End If
                .Cells(r, 1).Resize(br - r, lColumns_Wide).BorderAround ColorIndex:=13, Weight:=xlThick
            End If
        Next r
    End With
End Sub

Depois de executá-lo em sua planilha, você pode esperar resultados semelhantes aos seguintes.

Osparâmetrosparamodificaroestilodebordacom.BorderAroundpodemserencontradosem Método Range.BorderAround . Lembre-se de que você pode usar Color:= ou ColorIndex:= , mas não ambos. Eu acho ColorIndex mais fácil de trabalhar, desde que você consiga usar a paleta limitada. Aqui está uma tabela ColorIndex para escolher.

No que diz respeito à classificação, você terá que preencher as células em branco na coluna A ou usar uma coluna auxiliar para a direita para ajudar a manter os valores juntos.

Modificação: Eu adicionei funcionalidades adicionais para que a largura da região da borda possa ser definida. Isso requer que uma das colunas que não tenha células em branco também seja identificada. Veja as linhas 2 e amp; 3 no código revisado.

    
por 04.11.2014 / 15:07
0

Aqui está uma solução parcial usando a formatação condicional

= NÃO (ISBLANK (B2))

= ISBLANK (B2)

    
por 04.11.2014 / 18:30