VBA - Artigo 014 - Formatação de células no VBA

Formatação de células no VBA

A formatação de células é algo extremamente corriqueiro no Excel. Não importa se a planilha é simples ou um relatório extenso, as pessoas sempre irão formatar as células de alguma forma. Quando se usa código VBA para gerar conteúdo novo se torna essencial formatar as células geradas de alguma forma, para que o usuário não precise fazer isto posteriormente, perdendo tempo precioso. Afinal, deixar as planilhas visualmente belas e agradáveis à vista é algo que todos sempre almejam.

O Excel possui várias propriedades de formatação de células que serão listadas aqui com um intuito de ser um guia de referência, um lugar onde você provavelmente virá quando precisar lembrar de alguma formatação específica. Vale notar que Cells é um objeto do tipo Range, portanto quase todas as formas servem para ambos (com raras exceções).

Aba Número:

A propriedade NumberFormat é equivalente a toda a aba Número. Seu formato é o seguinte:

Range("A1").NumberFormat = "General"

No código de exemplo acima, General se refere à forma Geral, ou seja, nenhuma formatação específica. Você deve conhecer várias das formatações existentes, pois esta é uma das atividades mais corriqueiras dos usuários de Excel.

Todas as opções e formas usadas no formato Personalizado podem ser transcritas para este comando, lembrando que no VBA deve-se usar a forma imperial, ou seja, ponto para separar decimal e vírgula para separar milhar. Além disso, as opções de cores devem ser escritas em inglês, como [Red] ao invés de [Vermelho].

Experimente as várias formas que você costuma usar na área de Verificação imediata no editor de VBA e veja as formatações possíveis. Note que as formatações que você usar via código irão aparecer na lista de formatos personalizados. Use por exemplo "000", que mantém o número com três dígitos, colocando zeros à esquerda e veja esse formato aparecer em Personalizado na janela de formatação de células.

Uma breve explicação sobre alguns caracteres especiais usados na formatação:

- 0: Formata números. O número de zeros à esquerda do ponto decimal indica a quantidade mínima de dígitos exibidos, com zeros preenchendo quando o número não tiver dígitos suficientes. À direita do ponto decimal indica a quantidade de dígitos exibidos, arredondando caso haja mais casas decimais que o desejado.

- #: Formata números. Funciona de forma similar ao zero, mas não preenche com zeros quando não há dígitos suficientes à esquerda do ponto decimal e não exibe zeros não significativos à direita do ponto decimal.

- ?: Formata números. Funciona de forma similar ao zero, a única diferença é que deixa um espaço caso não haja dígitos significativos à direita do ponto decimal. É útil para alinhar os pontos decimais dos números sem precisar preencher com zeros à direita.

- (ponto decimal): Indica o ponto decimal nos números, que será exibida como uma vírgula no Excel que use o formato brasileiro.

- (vírgula): Indica o separador de milhar dos números, que será exibido como um ponto no Excel que use o formato brasileiro. Também serve como escala de número: cada vírgula ao final da máscara remove um milhar do número. É útil no caso de número muito grandes e a forma de exibir for em escala de milhares, milhões ou bilhões.

- %: Usado para exibição de percentuais. Atente ao fato de que 1 com essa máscara equivale a 100%.

- E+ e E-: É usado para notação científica. O número de zeros à direita do sinal + ou – indica a quantidade de dígitos que serão exibidos após o sinal. A máscara antes do E define o formato de exibição dos números.

- (ponto e vírgula): Serve para separar até quatro seções com diferentes formatações. A primeira se refere aos números positivos, a segunda aos negativos, a terceira ao zero e a quarta a texto.

- @: Indica texto. Se for a única formatação, tudo que for digitado nesta célula será considerado texto. É mais utilizado em seções (item acima), como a quarta seção.

- _: Acrescenta um espaço equivalente ao caractere à direita do mesmo. Muito usado com parênteses em seções de números positivos quando o negativo possui parênteses, de forma a alinhar o ponto decimal.

- *: Repete o caractere à direita até preencher a célula. "R$ * #,##0.00" repete o caractere de espaço, deixando o sinal de moeda alinhado à esquerda e o número alinhado à direita.

Aba Alinhamento:


Para alinhamento, há duas propriedades: HorizontalAlignment e VerticalAlignment. A primeira é de longe a mais utilizada. Sua forma de uso:

Range("A1").HorizontalAlignment = xlLeft
Range("A1").VerticalAlignment = xlBottom

Para o alinhamento horizontal, temos cinco opções básicas: xlLeft, xlCenter, xlRight, xlJustify e xlDistributed, alinham a célula à esquerda, centralizado, à direita, justificado à esquerda e justificado centralizado, respectivamente. Há também a opção xlCenterAcrossSelection, que será tratada mais adiante.

Para o alinhamento vertical, também temos cinco opções básicas: xlTop, xlCenter, xlBottom, xlJustify e xlDistributed que alinham acima, centralizado, abaixo e justificado respectivamente (xlJustify e xlDistributed aparentam ter o mesmo resultado).

A propriedade IndentLevel equivale ao Recuo na janela de formatação de células. Aceita valores entre 0 e 15, sendo 0 equivalente a nenhum recuo. Quando maior o valor, maior o recuo. Exemplo:

Range("A1").IndentLevel = 2

Alternativamente, pode-se usar a propriedade AddIndent, que é uma propriedade booleana, ou seja, aceita apenas valores True ou False. True acrescenta um recuo, enquanto False é o valor padrão, ou seja, sem recuo. Exemplo:

Range("A1").AddIndent = True

Outra propriedade importante no alinhamento é WrapText, que define se o texto da célula pode ser quebrado em várias linhas ou não. Também é uma propriedade booleana: True quebra o texto automaticamente, False mantém o texto em uma única linha. Exemplo:

Range("A1").WrapText = True

Também tem a propriedade booleana ShrinkToFit, que equivale à opção Reduzir para caber. Quando True reduz o corpo do texto para caber na célula, enquanto False mantém o texto no tamanho definido.

Range("A1").ShrinkToFit = True

Já a propriedade booleana MergeCells trata da mesclagem de células. True define se o intervalo de células será mesclado, enquanto False não será mesclado. Também é possível usar os métodos Merge para mesclar e UnMerge para separar células. Veja exemplos:

Range("A1:D1").MergeCells = True
Range("A1:D1").Merge
Range("A1:D1").UnMerge

Trabalhar com células mescladas pode acabar dando dor de cabeça, principalmente quando é preciso copiar e colar células. Há uma alternativa que é usar a propriedade HorizontalAlignment com valor xlCenterAcrossSelection. No exemplo abaixo o conteúdo da célula A1 será distribuído entre as células A1 a D1, de maneira semelhante à mesclagem, mas mantendo as células individualmente separadas:

Range("A1:D1").HorizontalAlignment = xlCenterAcrossSelection

Se você acrescentar algum valor a alguma das variáveis entre B1 e D1, haverá uma quebra na distribuição, fazendo a centralização somente com as células livres à direita no intervalo. Observe a imagem:


Ao contrário do que se pode imaginar, não há a opção xlCenterAcrossSelection para a propriedade VerticalAlignment.

A propriedade Orientation trata da orientação da célula, ou seja, a inclinação. É possível associar valores entre -90 e 90, além de algumas constantes: xlDownward (equivalente a -90), xlHorizontal (equivalente a 0), xlUpward (equivalente a 90) e xlVertical, que coloca o texto na vertical (observe na tela de formatação de alinhamento para entender). Exemplo:

Range("A1").Orientation = xlUpward

Já a propriedade ReadingOrder equivale ao campo Direção do texto. Possui os seguintes valores possíveis: xlContext (contexto, que é o valor padrão), xlLTR (da esquerda para a direita) e xlRTL (da direita para a esquerda). Exemplo:

Range("A1").ReadingOrder = xlContext

Aba Fonte:

O objeto Font é equivalente a toda a aba Fonte e possui diversas propriedades. A propriedade Name, como o nome sugere, define o tipo de letra que será utilizado. Já a propriedade Size define o tamanho do corpo do texto. O exemplo abaixo formata a célula A1 como Arial tamanho 12:

Range("A1").Font.Name = "Arial"
Range("A1").Font.Size = 12

As propriedades Bold e Italic formatam a célula como negrito e itálico, respectivamente. Há a opção de usar outra propriedade chamada FontStyle. Veja os exemplos:

Range("A1").Font.Bold = True
Range("A1").Font.Italic = True
Range("A1").Font.FontStyle = "Bold Italic"

Vale notar que Bold e Italic são propriedades booleanas, enquanto FontStyle é do tipo string, portanto cuidado para não colocar texto inválido. A vantagem de FontStyle é poder usar aspas duplas (ou seja, nenhum valor) para resetar as propriedades da célula.

A propriedade Underline define se o texto será sublinhado ou não. Aceita os seguintes valores: xlUnderlineStyleNone (nenhum sublinhado), xlUnderlineStyleSingle (sublinhado simples), xlUnderlineStyleDouble (sublinhado duplo), xlUnderlineStyleSingleAccounting (sublinhado contábil simples) e xlUnderlineStyleDoubleAccounting (sublinhado contábil duplo). Forma de uso:

Range("A1").Font.Underline = xlUnderlineStyleSingle

A propriedade booleana Strikethrough define se o texto será tachado (True) ou não (False). As propriedades Superscript e Subscript definem se o texto será sobrescrito ou subscrito quando definidos como True, mas somente uma das duas ficará ativa por vez, ou seja, habilitar uma desabilita a outra. Exemplo:

Range("A1").Font.Strikethrough = True
Range("A1").Font.Superscript = False
Range("A1").Font.Subscript = False

Para definir a cor do texto da célula temos duas opções: Color e ColorIndex. A primeira permite todas as cores, enquanto a segunda permite usar cores pré-definidas com valores entre 0 e 56.

A propriedade Color permite todas as cores e pode receber constantes do Office (vbBlack, vbBlue, vbGreen, vbRed, vbWhite e vbYellow), bem como pode usar em conjunto com a função RGB (que recebe valores de 0 a 255 para os parâmetros vermelho, verde e azul). Todos os exemplos abaixo definem a cor como vermelho:

Range("A1").Font.ColorIndex = 3
Range("A1").Font.Color = vbRed
Range("A1").Font.Color = RGB(255, 0, 0)

É possível formatar textos individualmente em uma célula usando o objeto Character antes de Font. Coloque o texto ABC na célula A1 e execute as seguintes linhas:

Range("A1").Characters(Start:=1, Length:=1).Font.ColorIndex = 3
Range("A1").Characters(Start:=2, Length:=1).Font.ColorIndex = 4
Range("A1").Characters(Start:=3, Length:=1).Font.ColorIndex = 5


O resultado será uma letra de cada cor, em vermelho, verde e azul. Vale notar que isto só funciona para textos, não números. Desta forma você pode formatar palavras diferentes, bastando tomar atenção onde cada palavra começa (Start) e qual o comprimento de cada uma (Length).

Aba Borda:

A formatação das bordas tem várias possibilidades. A mais simples é utilizando o método BorderAround, que cria uma linha ao redor do intervalo. Tem várias opções: LineStyle, Weight, ColorIndex e Color. As duas últimas referem a cores e funcionam exatamente como visto anteriormente em fontes. Apenas uma das duas é necessária, escolha a melhor para o momento.

LineStyle define o tipo da linha e pode ter os seguintes valores: xlNone (nenhuma linha), xlDot (pontilhado), xlDashDotDot (traço-ponto-ponto), xlDashDot (traço-ponto), xlDash (tracejado), xlSlantDashDot (traço inclinado-ponto), xlContinuous (linha contínua) e xlDouble (linha dupla).

Weight define a espessura da linha e pode ter os seguintes valores: xlHairline (fio de cabelo), xlThin (fino), xlMedium (médio) e xlThick (grosso).

Mas atenção, que nem todas as combinações são possíveis. Alguns estilos de linha e espessura são “independentes”, ou seja, ao serem definidos automaticamente definem seu par. São eles: xlSlantDashDot, xlDouble e xlHairline.

Com todas as características de linhas e espessuras conhecidos, podemos ver como usar o método BorderAround:

Range("B2:D4").BorderAround linestyle:= xlContinuous, Weight :=xlMedium

Esse comando irá colocar uma linha contínua de espessura média ao redor do intervalo B2:D4, as linhas internas continuarão do jeito que estavam. O que fazer para colocar uma linha ao redor de cada célula individual? Fazer uma rotina de repetição para colocar a linha ao redor de cada uma ou usar outra forma de colocar borda? Neste caso podemos usar a propriedade Borders.

Esta propriedade pode receber um parâmetro para definir qual das bordas será alterada. As opções são as seguintes: xlDiagonalDown (diagonal do superior esquerdo para inferior direito) xlDiagonalUp (diagonal do inferior esquerdo para superior direito), xlEdgeLeft (lateral esquerda da borda), xlEdgeTop (lateral superior da borda), xlEdgeBottom (lateral inferior da borda), xlEdgeRight (lateral direita da borda), xlInsideVertical (linhas internas verticais) e xlInsideHorizontal (linhas internas horizontais).

Assim, para preencher as linhas internas do intervalo B2:D4 para complementar o comando anterior, usaremos o seguinte código:

Range("B2:D4").Borders(xlInsideVertical).LineStyle = xlContinuous
Range("B2:D4").Borders(xlInsideHorizontal).LineStyle = xlContinuous
Range("B2:D4").Borders(xlInsideVertical).Weight = xlMedium
Range("B2:D4").Borders(xlInsideHorizontal).Weight = xlMedium

Essa forma é trabalhosa, mas ainda assim é melhor que definir cada linha individualmente. Felizmente, ainda há uma outra alternativa: quando a propriedade Borders não recebe um parâmetro, as quatro linhas laterais de cada célula do intervalo são definidas. Elimine as bordas anteriores e teste o comando abaixo:

Range("B2:D4").Borders.LineStyle = xlContinuous
Range("B2:D4").Borders.Weight = xlMedium

Você verá que todas as linhas externas e internas do intervalo receberam bordas. É bem mais prático e menos trabalhoso definir as bordas desta forma e depois alterar alguma em particular conforme a necessidade.

Aba Preenchimento:

O objeto Interior equivale à aba Preenchimento e possui algumas propriedades já conhecidas, como Color e ColorIndex. De longe são as mais usadas, mas há algumas outras propriedades particulares interessantes.

Na parte direita da janela duas caixas de combinação com opções relativas a Padrão. Trata-se de um fundo para a célula, em um dos desenhos mostrados na tela acima, que foi tirada com as opções exibidas. Esse fundo é definido com a propriedade Pattern. De acordo com a imagem acima, da esquerda para a direita e de cima para baixo, aceita os seguintes valores:

- xlPatternSolid, xlPatternGray75, xlPatternGray50, xlPatternGray25, xlPatternGray16, xlPatternGray8;
- xlPatternHorizontal, xlPatternVertical, xlPatternDownxlPatternUp, xlPatternChecker, xlPatternSemiGray75;
-  xlPatternLightHorizontal, xlPatternLightVertical, xlPatternLightDown, xlPatternLightUp, xlPatternGrid, xlPatternCrissCross.

A propriedade PatternColor é semelhante à propriedade Color e a propriedade PatternColorIndex é semelhante à ColorIndex, não muda nada na forma de usar. Combine essas cores com a cor de fundo (Color ou ColorIndex) e você pode fazer combinação de cores. O exemplo abaixo deixa a célula com listras horizontais vermelhas e amarelas:

Range("A1").Interior.Pattern = xlPatternHorizontal
Range("A1").Interior.PatternColor = vbYellow
Range("A1").Interior.Color = vbRed


A propriedade Gradient é de uso mais complexo e será adicionado futuramente.

Aba Proteção:

Nesta aba temos apenas duas opções. Como a própria janela mostra, essas opções só farão efeito quando a planilha for protegida.

Por padrão, todas as células são bloqueadas, como mostra a imagem. Caso você precise proteger a planilha e queira que algumas células possam ser editadas, a propriedade Locked dessas células precisa ser definida como False.

Range("A1").Locked = False

A opção Ocultas serve para ocultar as fórmulas na planilha, ou seja, só faz sentido usar quando há fórmula na célula e não quer que o usuário a visualize. Se for o caso, é preciso definir a propriedade FormulaHidden como True:

Range("A1").FormulaHidden = True

Aqui termina a transposição das opções de formatação para os equivalentes no VBA. Está extenso, mas acredito que deverá servir como um guia de referência futura para muita gente.

Pedro Martins


Formado em Tecnologia em Eletrônica Digital, já trabalhou como artefinalista, eletrotécnico, programador de CLP (para máquinas industriais) e analista de sistemas em sistema bancário, programando em COBOL.
Mexe com computadores e programação desde a segunda metade dos anos 1980, quando teve um MSX e aprendeu a programar em BASIC. É a favor da disseminação do conhecimento.





Outros artigos sobre o tema:
Postagem Anterior Próxima Postagem