Praticamente todos nós iniciamos o contato com macros através de códigos pré-existentes e da utilização do gravador de macros.
Quando lançamos mão deste último recurso, o código obtido é, geralmente enorme e possui muitas linhas que são supérfluas.
Vamos partir de um exemplo utilizando um código criado através do gravador de macros e transformá-lo num código mais limpo para otimizarmos a aplicação de bordas a um intervalo.
O código a seguir foi obtido acionando o gravador de macros e, em seguida, aplicando bordas simples nos contornos e na parte interior do intervalo A1:D10.
Sub AplicandoBordas_V01() ' ' AplicandoBordas_V01 Macro ' ' Range("A1:D10").Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With End Sub
Não sei vocês, mas o código me parece muito grande para realizar algo tão simples quanto aplicar uma formatação.
Para tentarmos reduzir o código, é importante entendermos como as bordas de células se apresentam na estrutura de objetos do VBA.
Dentre as propriedades do objeto Range, existe uma coleção (Classe) denominada Borders.
Através de alterações das propriedades dos elementos desta coleção é que podemos aplicar cores, espessura e estilo de linhas às bordas de um intervalo utilizando VBA.
Os elementos (itens) da coleção Borders e os seus respectivos valores numéricos são:
xlDiagonalDown | 5 |
xlDiagonalUp | 6 |
xlEdgeLeft | 7 |
xlEdgeTop | 8 |
xlEdgeBottom | 9 |
xlEdgeRight | 10 |
xlInsideVertical | 11 |
xlInsideHorizontal | 12 |
Desta forma para exibirmos ou ocultarmos bordas, devemos acessar os elementos desta coleção e aplicarmos as mudanças necessárias às suas propriedades.
Normalmente precisamos modificar as seguintes propriedades:
Estilo da linha (LineStyle)
Cor da linha (ColorIndex)
Espessura da linha (Weight)
Assim como a coleção Borders, a propriedade LineStyle pode apresentar uma série de valores definidos pelas constantes a seguir. Ao lado de cada uma está a descrição do tipo de linha que define.
Nome | Descrição |
xlContinuous | Linha contínua |
xlDash | Linha tracejada |
xlDashDot | Traços e pontos alternados |
xlDashDotDot | Traço seguido por dois pontos |
xlDot | Linha pontilhada |
xlDouble | Linha dupla |
xlLineStyleNone | Sem linha |
xlSlantDashDot | Traços inclinados |
Para uma análise detalhada sobre ColorIndex visite o post: http://wp.me/p1uYv4-gC
A espessura (Weight) pode assumir os valores a seguir:
Nome | Descrição |
xlHairline | Fio (a borda mais fina) |
xlThin | Fina |
xlMedium | Média |
xlThick | Grossa |
Após compreendermos estes detalhes, vamos pensar em como otimizar o código:
1. É necessário informar o intervalo a ser formatado;
2. É necessário percorrer uma série de valores correspondentes à coleção das bordas deste intervalo;
3. Não queremos que apareçam as bordas diagonais;
4. As bordas devem ser contínuas, na cor preta e de espessura fina.
Atendendo aos requisitos acima, chegamos à segunda versão do código:
Sub AplicandoBordas_V02() 'Define o intervalo cujas bordas serão formatadas Set rg = ActiveSheet.[A1:D10] 'Define o loop para percorrer os item da coleção Borders For k = 5 To 12 'Só serão formatados os itens de valor maior que 6 'excluindo desta forma xlDiagonalDown (5) e 'xlDiagonalUp (6) If k > 6 Then With rg.Borders.Item(k) 'Define o estilo de linha .LineStyle = xlContinuos 'Define a cor da linha .ColorIndex = 0 'Define a espessura da linha .Weight = xlThin End With End If Next k End Sub
É possível também utilizar um vetor que contém os valores correspondentes às de bordas que serão coloridas:
Sub AplicandoBordas_V03() 'Define o intervalo cujas bordas serão formatadas Set rg = ActiveSheet.[A1:D10] 'Vetor que contém os valores correspondentes às bordas a serem formatadas 'Pode ser construído utilizando-se os valores numéricos das constantes: 'Bordas = Array(7, 8, 9, 10, 11, 12) Bordas = Array(xlEdgeLeft, xlEdgeTop, xlEdgeBottom, xlEdgeRight, xlInsideVertical, _ xlInsideHorizontal) 'Define o loop para percorrer os item da coleção Borders For k = LBound(Bordas) To UBound(Bordas) With rg.Borders.Item(Bordas(k)) 'Define o estilo de linha .LineStyle = xlContinuos 'Define a cor da linha .ColorIndex = 0 'Define a espessura da linha .Weight = xlThin End With Next k End Sub
Comentários:
Observem que agora fica bem mais fácil modificar qualquer parâmetro (intervalo, cor, espessura, etc), bastando modificar uma única linha de código.
Deixo para vocês o desafio de alterar a macro para que sejam formatas apenas as bordas que contornam o intervalo, na cor vermelha e com espessura grossa.
Abraços!
Texto muito útil, respondeu minhas dúvidas! Obrigado!
Excelente Texto, didático e objetivo, parabéns!
Prezado…
Estou substituindo a linha
Set rg = ActiveSheet.[A1:D10]
por
Set rg = ActiveSheet.[“A6:K” & linhas]
estou tentando usar com um parâmetro e não está aceitando.