Os tipos de objetos de planilha
Se você já precisou alternar entre planilhas no VBA do Excel, certamente deve ter tido a dúvida entre a diferença do objeto Worksheet (planilha de trabalho) e Sheet (planilha). Para entender a resposta, é preciso saber da existência do objeto Chart (gráfico). Vejamos:
– Worksheet se refere a
planilhas de trabalho, ou seja, aquelas que contêm linhas e colunas que tanto
editamos;
– Chart se refere
a planilhas de gráfico, aquelas onde apenas um gráfico é exibido;
– Sheet se refere
tanto a planilhas de gráfico como de trabalho, isto é, todas as planilhas da
pasta de trabalho.
Em termos de propriedades e métodos, não há diferenças entre Worksheet e Sheet, ambos têm a mesma quantidade. Mas há uma diferença crucial no método Count: quando usado no objeto Worksheet retorna apenas a quantidade de planilhas de trabalho, enquanto com Sheet retorna a quantidade de planilhas de trabalho e de planilhas de gráfico.
Esse método Count
é muito útil quando precisamos saber a quantidade de planilhas existentes para,
por exemplo, passar por todas as planilhas em um processo de varredura, como
também para acrescentar uma planilha nova ao final. Vamos praticar estes
exemplos.
Suponha que você tenha uma pasta de trabalho com várias planilhas e quer ter uma nova chamada Resultados no final da lista. A princípio seria criar o código para gerar essa planilha quando fosse preciso. O código é bem simples:
Sub CriarPlanResultados()
' Adiciona a planilha ao final da lista
Sheets.Add
After:=Sheets(Sheets.Count)
' Renomeia a planilha para Resultados
ActiveSheet.Name =
"Resultados"
End Sub
Note que a planilha adicionada será automaticamente
selecionada. Desta forma, podemos renomeá-la logo em seguida. O padrão do
método Add é adicionar a planilha antes da planilha atual, por isso coloquei no
código para ele criar logo após a última (valor de índice Sheets.Count). Pode-se colocar a planilha no começo usando Before:=Sheets(1), o local pode ser
mudado de acordo com a necessidade.
Com relação ao índice de planilhas, há detalhes importantes
a saber. Primeiro, o contador inicia sempre em 1 e vai até o valor de Sheets.Count. Qualquer valor fora disso
retorna mensagem de erro. Segundo, ao adicionar ou mover planilhas, é preciso
saber que o índice pode alterar com a mudança. No caso de adicionar a planilha
no começo, a planilha nova será a nova Sheets(1),
a ex-primeira planilha passa a ser Sheets(2)
e assim por diante. O índice sempre será de acordo com a ordem em que elas
estiverem arrumadas.
A sub-rotina de criar planilha está pronta. Porém, temos de pensar na possibilidade da planilha existir, para o caso do usuário ter de processar a macro de novo. Assim, teremos de ter também um código para tratar essa situação. Poderia usar o método Delete, mas não recomendo, porque ele mostrará um alerta dizendo que pode haver conteúdo na planilha (existe um jeito de contornar o alerta, mas exige mais atenção do desenvolvedor). Desta forma, a melhor forma é limpar o conteúdo da planilha existente. Vamos criar uma sub-rotina para executar essa limpeza:
Sub LimparPlanResultados()
' Seleciona a planilha Resultados
Sheets("Resultados").Select
' Garante que a planilha Resultados estará no fim da lista
ActiveSheet.Move
After:=Sheets(Sheets.Count)
' Limpa toda a área usada da planilha
ActiveSheet.UsedRange.EntireColumn.Delete
End Sub
Esta sub-rotina tem três passos: seleciona a planilha
Resultados, move para o fim da lista de planilhas e elimina todo o conteúdo
usado (UsedRange), incluindo formatações. Ou seja, temos uma planilha zerada para usar.
Até agora temos duas sub-rotinas: uma para criar e outra
para limpar, para o caso de já existir. Falta agora um processo que decida qual
dessas sub-rotinas será utilizada. Para isso vamos criar uma estrutura de
varredura e uma de decisão:
Sub VerificarPlanResultados()
Dim Indice As Integer
' Estrutura para varrer as planilhas em busca de uma com o nome
Resultados
For Indice = 1 To
Sheets.Count
If Sheets(Indice).Name
= "Resultados" Then
Sheets(Indice).Select
' Sai da estrutura de repetição se encontrar a planilha
Exit For
End If
Next
' Ao final da iteração, se não houver uma planilha Resultados,
será preciso criar,
' caso contrário ela será limpa
If ActiveSheet.Name =
"Resultados" Then
LimparPlanResultados
Else
CriarPlanResultados
End If
' Executa uma sub-rotina para formatar a planilha
FormatarPlanResultados
End Sub
O laço é bem simples, cria um índice para que seja
verificada se a planilha do índice atual se chama Resultados, selecionando e
saindo quando isso acontecer. Logo a seguir há uma nova verificação: se a
planilha resultados foi encontrada (razão para selecionar a planilha na
estrutura anterior), será efetuada a limpeza dela, caso contrário será criada
uma nova planilha. Em seguida, qualquer que seja o caso (planilha criada ou
planilha limpa), irá processar uma rotina para inicializar essa planilha de
resultados, colocando cabeçalho e dados iniciais, formatando células etc.
Perceba como a estrutura de repetição é interessante:
podemos utilizá-la para verificar a existência de uma planilha com determinado
nome (como feito acima), localizar alguma informação específica em alguma
planilha ou ainda processar dados de várias planilhas de uma vez só.
Da mesma forma, saber como funciona o índice de planilhas e
como movimentá-las é muito útil para garantir que sejam processadas em uma
ordem específica, porque pode acontecer do usuário mover alguma planilha de
posição. Analise o código abaixo:
' Garante que Jan se torne a planilha 1
Sheets("Jan").Move Before:=Sheets(1)
' Move Fev após Jan
Sheets("Fev").Move After:=Sheets(1)
' Move Mar após Fev
Sheets("Mar").Move After:=Sheets(2)
' Move Abr após Mar
Sheets("Abr").Move After:=Sheets(3)
Um código
de reorganização como este antes de começar o processamento das planilhas
garante que será feito na ordem necessária, assim não haverá problema caso o usuário mude alguma de lugar..

Outro problema que pode acontecer é o usuário renomear a
planilha. Isto pode atrapalhar a execução se você usa a forma WorkSheets("Nome Da Planilha"), mas há como garantir
que os nomes sejam mantidos. Olhando no VBA
Project vemos que os objetos de planilha têm nomes como Plan1, Plan2 etc, seguido do nome que aparece na guia de planilhas. Você pode
inclusive conferir na Verificação imediata digitando o código abaixo:
? Plan1.Name
Será retornado o nome da planilha Plan1. Isso significa que sua
planilha pode ser referenciada por Plan1
no código, mas esse nome não é nada prático. É possível renomear as planilhas
usando o botão Propriedades que está
na guia Desenvolvedor. Ele abrirá a
seguinte janela:
O primeiro campo é (Name) é o nome do objeto, da mesma forma que os objetos de formulário. Basta
alterar para um nome que podemos entender no código, como plnCadastro. Na hora do código podemos utilizar esse nome, se
quisermos. Também é possível mudar o nome que o usuário vê via código:
plnCadastro.Name = "Cadastro"
Desta forma, não importa se o usuário mudar o nome da
planilha, podemos renomeá-la de volta ao nome que queremos.
É possível fazer essa alteração no editor de VBA. Selecione a planilha desejada e veja as propriedades dela na seção Propriedades. Se não estiver visível, use a tecla de atalho F4.
Imagino que a partir dos próximos projetos você irá renomear o objeto planilha desta forma e passará a usar esse nome para referenciar no código, deixando de lado a forma WorkSheets("NomeDaPlanilha"). Fica bem mais prático. Bons códigos!
É possível fazer essa alteração no editor de VBA. Selecione a planilha desejada e veja as propriedades dela na seção Propriedades. Se não estiver visível, use a tecla de atalho F4.
Imagino que a partir dos próximos projetos você irá renomear o objeto planilha desta forma e passará a usar esse nome para referenciar no código, deixando de lado a forma WorkSheets("NomeDaPlanilha"). Fica bem mais prático. Bons códigos!
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.

Nenhum comentário