VBA - Artigo 006 - Decidindo tipos de dados


Decidindo tipos de dados


As variáveis podem ser dos mais diversos tipos, como você deve ter percebido nas várias videoaulas do Alessandro Trovato que deve ter assistido. Deve saber que uma variável não declarada é do tipo variant e também que é uma boa prática usar o Option Explicit no começo do módulo para forçar que as variáveis sejam declaradas antes do uso.

Talvez já ocorreu de precisar modificar o tipo da variável, porque a anterior não suportou algum valor e deu um erro. Assim fica tentador sempre usar o double em detrimento do single e long ao invés de integer, mas dependendo da quantidade de variáveis utilizadas e do ambiente, o desempenho pode ficar comprometido.

O objetivo deste artigo é ajudar a escolher o tipo mais adequado às necessidades. Suponha que você precise de uma variável Linha para indicar o número da linha onde o processamento está no momento. Se você tem certeza absoluta de que não haverá muitas linhas, pode usar o tipo integer. Entretanto, se você acha que a quantidade de linhas pode crescer tanto a ponto de ultrapassar 32.767 linhas, é melhor usar o tipo long, que permitirá até a última linha existe no Excel, que atualmente é 1.048.576. É possível também usar o tipo byte, que aceita valores de 0 a 255. Assim, a escolha depende da necessidade.

Da mesma forma, dependendo da precisão desejada devemos escolher entre os tipos double e single. Suponha que precise colocar o número Pi no código. É possível defini-lo como constante, ou seja, atribui um valor e ele não poderá ser modificado em nenhuma parte do processo. Veja o código abaixo:

Const Pi As Double = 3.14159265358979

Note que não importa quantas casas decimais você acrescentar, o Excel limita em 14. Pode atribuir 3.141592653589793238462643383279 ou ainda mais casas, ao sair da linha onde está o valor o editor VBA apaga as casas que não serão consideradas. Perceba também que na declaração da constante a atribuição do valor vem logo em seguida, o que não é possível fazer em variáveis. Sempre que houver um valor que não deve ser modificado, declare como constante.

Coloque o comando abaixo em uma sub-rotina e execute:

Debug.Print Pi

Ele exibirá na área Verificação imediata o valor de Pi, que será 3,14159265358979. Agora altere a linha da declaração de double para single e executar o Debug.Print novamente. O resultado apresentado será 3,141593, ou seja, menos casas decimais. Portanto, a decisão aqui vai depender da quantidade de casas decimais que devem ser consideradas no cálculo. Se houver necessidade de precisão, use double, caso contrário use single.

Até agora vimos somente os tipos de dados numéricos. O tipo de dados string é de tamanho variável por padrão, mas é possível definir com tamanho fixo. Veja o exemplo abaixo:

Dim SiglaEstado As String * 2

A variável SiglaEstado foi definida com tamanho fixo de 2 bytes. Isso significa que se estiver vazio o valor será "  " (dois espaços), portanto é preciso tomar atenção para não comparar a variável com "" (nenhum espaço, conteúdo vazio), a não ser que utilize o comando Trim, que remove os espaços extras à esquerda e à direita. Também significa que essa variável não aceitará nenhum valor com mais de dois bytes. Se for atribuído "XYZ", o valor armazenado será "XY", tudo após o limite será descartado.

String de tamanho fixo é útil quando precisa trabalhar com blocos de texto de tamanho definido e imutável. Também é útil quando for preciso trabalhar com arquivos de tamanho fixo, onde cada campo deve ocupar um espaço alocado no registro. Não é recomendável usar se o bloco de texto for de tamanho variável, porque tudo que não for utilizado será preenchido com espaços. Imagine uma variável NomeCidade com tamanho fixo de 40 e gravando a informação na planilha: a quantidade de espaço desperdiçada será gigantesca. Neste caso será preciso utilizar o Trim antes de atribuir o valor nas células para evitar gravar tanto espaço em branco, como mostrado abaixo:

Cells(Linha, Coluna).Value = Trim(NomeCidade)

Desta forma "São Paulo" irá ocupar apenas 8 bytes na célula e não 40, incluindo 32 espaços em branco à toa. Mas se for para gravar um registro em arquivo de tamanho fixo, deve-se gravar os 40 bytes para ocupar devidamente o espaço alocado. Vou tratar de arquivos em um artigo futuro.

O tipo boolean aceita apenas valores Falso ou Verdadeiro. O ideal é utilizar somente quando há dois valores possíveis que aceitem resposta como "Não" e "Sim" ou "Falso" e "Verdadeiro", como, por exemplo, em uma lista de presença de alunos. Fora isso não é recomendável usar esse tipo de dado, pois irá complicar o entendimento do código. Por exemplo, sexo aceita os valores "masculino" e "feminino", mas usar uma variável boolean neste caso deixa o código confuso.

Há um tipo especial de dado chamado type. Com esse tipo é possível compor uma estrutura de dados de tipos distintos, como por exemplo, uma placa de carro. Veja a definição abaixo:

Type TipoPlaca
    Letras  As String * 3
    Numeros As Integer
End Type

Dim Placa As TipoPlaca

Veja que o bloco Type... End Type contém a definição e o Dim é necessário para declarar o objeto. Esse código pode ser declarado fora da área de sub-rotinas, sendo visível para todas as rotinas do módulo. É um tipo de objeto com propriedades (que são as variáveis declaradas) e por isso a notação segue o mesmo estilo:

Placa.Letras = "AAA"
Placa.Numeros = 1
Debug.Print Placa.Letras & String(4 - Len(CStr(Placa.Numeros)), "0") & Placa.Numeros

Observe que para exibir os números precisamos primeiro converter a variável para string para depois obter o comprimento (caso contrário será sempre 2, que é o comprimento de um tipo integer) e por fim acrescentar os zeros à esquerda.

O objeto type funciona como uma classe sem métodos e funções. Classe é um objeto com propriedades e procedimentos que será abordado em um artigo futuro por causa de sua complexidade. Entender o formato type ajudará a entender a classe no futuro, por isso pratique se puder. Tente agrupar dados sempre que tiverem alguma relação entre si. Por exemplo, agrupe os dados do cliente em uma estrutura de dados type: nome, número de cadastro, documento, telefone, endereço etc. É possível colocar qualquer tipo de dado dentro de um objeto type, isso inclui objetos do Excel, arrays, collections, classes e mesmo outros objetos type. Arrays e collections também serão em outro artigo.

Há outro tipo especial chamado enum, de enumeração. Ele é muito útil quando há uma quantidade definida de opções para associar a uma variável. Por exemplo, estado civil pode ser solteiro, casado, divorciado, viúvo, separado e companheiro. Veja a estrutura abaixo:

Enum enumEstadoCivil
    Solteiro = 1
    Casado = 2
    Divorciado = 3
    Viuvo = 4
    Separado = 5
    Companheiro = 6
End Enum

Dim EstadoCivil As enumEstadoCivil

Da mesma forma que o type, é preciso usar o Dim para declarar uma variável para aceitar esse valor. Na hora que estiver escrevendo o código e for atribuir um valor a essa variável acontece algo muito bacana:


O InteliSense do editor de VBA exibe os valores possíveis, o que é uma grande ajuda para deixar o código mais dinâmico e fácil de fazer manutenção. Note que ele colocou os valores em ordem alfabética, o que não é um problema. O valor que será associado à variável é o número correspondente ao estado civil declarado no enum. Os valores atribuídos devem ser numéricos inteiros, pois o enum só aceita valores do tipo long, não é possível associar letras ou strings. Se não for digitado nenhum valor, o Excel começa a partir do zero e vai incrementando de um em um. Mas é melhor definir os valores porque deixa documentado no código para futuras consultas.

Você pode ter reparado que o símbolo à esquerda dos valores é idêntico ao de uns valores vistos no Excel, como xlTop, xlToLeft, xlToRight e xlBottom, que acompanham o método Range.End. Todos os valores que iniciam com xl são enumerações nativas do Excel. Você pode criar um prefixo próprio para as suas enumerações se quiser, mas não é necessário.

Certamente você adquiriu conhecimentos novos com este artigo. Imagine uma estrutura de dados type com várias propriedades, algumas podendo ser enumerações ou strings de tamanho fixo, datas e números de diversos tipos. Pegue um projeto antigo pronto, faça uma cópia para editar e mãos à obra, pratique para aprender!


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