VBA - Artigo 003 - Os tipos de objetos de planilha

Progredindo em VBA no Microsoft Excel

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!


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.


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.


Postagem Anterior Próxima Postagem