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.