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;
contêm linhas e colunas que tanto editamos;
– Chart se refere a planilhas de gráfico, aquelas onde apenas um
gráfico é exibido;
gráfico é exibido;
– Sheet se refere tanto a planilhas de gráfico como de trabalho,
isto é, todas as planilhas da pasta 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.
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.
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.
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.
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:
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
Resultados
For Indice = 1 To Sheets.Count
If Sheets(Indice).Name =
“Resultados” Then
“Resultados” Then
Sheets(Indice).Select
‘ Sai da estrutura de repetição se encontrar a planilha
Exit
For
For
End If
Next
‘ Ao final da iteração, se não houver uma planilha Resultados, será
preciso criar,
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.
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ó.
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:
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..
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:
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:
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:
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!
Pedro Martins
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!
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.
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.
1980, quando teve um MSX e aprendeu a programar em BASIC. É a favor da
disseminação do conhecimento.
Catálogo de aulas (NOVIDADE)
Criei um catálogo de aulas para ajudar você em seus estudos. Acesse clicando na imagem abaixo ou clique aqui.