Desenvolvimento - Office

Excel: Implementando propriedades personalizadas sem classes

É pouco sabido que a pasta de trabalho e planilhas funcionam como “classes personalizadas” no Excel. Isso implica que podemos criar propriedades que serão adicionadas ao objeto em questão sem a necessidade da criação, programação e instanciamento de classes.

por Robert Martim



É pouco sabido que a pasta de trabalho e planilhas funcionam como “classes personalizadas” no Excel. Isso implica que podemos criar propriedades que serão adicionadas ao objeto em questão sem a necessidade da criação, programação e instanciamento de classes.

NOTA
Caso o leitor queira aprender mais sobre classes, veja o curso de classes disponível no site. Nele há tudo que você precisa saber sobre criação de propriedades, métodos, eventos, etc.

Observe o exemplo:

EstaPasta_de_trabalho.ComputerName

No exemplo acima, criamos uma propriedade nova para o objeto EstaPasta_de_trabalho chamada ComputerName (o nome utilizado mantém o idéia de polimorfismo, veja o curso de Classes para explicações completas).

IMPORTANTE

Infelizmente, a tradução de certos objetos do Excel faz com que VBA escrito em pastas em inglês se comportem de forma diferente em português.

Ao criar um documento no Excel em inglês use ThisWorkbook.NomeDaPropriedade. Quando criar um documento em português use EstaPasta_de_trabalho.NomeDa-Propriedade. O mesmo vale para planilhas, Sheet1.NomeDaPropriedade e Plan1.NomeDaPropriedade.

Finalmente, caso queira, modifique o nome do objeto utilizando a propriedade Name. Ao fazer isso, você poderá padronizar os nomes. O ideal é que todos os objetos possuam o nome em ingles para efeitos de polimorfismo.


Via de regra, propriedades podem vir nas seguintes formas:

Somente escrita: neste caso possuímos apenas a instrução Property Let no objeto em questão. Um valor pode ser passado, mas não pode ser lido da propriedade;

Somente leitura: neste caso possuímos apenas a instrução Property Get no objeto em questão. Um valor pode ser lido, mas não pode ser passado para a propriedade;

Escrita/Leitura: Uma propriedade completa poderá ser escrita e lida pelo usuário.



Property Let para ThisWorkbook


A instrução Property Let permite que o usuário (ou programador) passe um valor para uma propriedade qualquer. Aqui, passaremos um valor para uma propriedade dentro da pasta de trabalho, isto é, criaremos uma propriedade dentro da janela de código da pasta de trabalho.

Note que, por definição, qualquer código digitado em uma pasta de trabalho é privado (Private). Porém, propriedades criadas desta forma serão expostas em todo o projeto. Caso queira que seja privada, utilize a palavra-chave Private.

A criação de uma propriedade é bastante simples:

Private pstrComputerName As String

Public Property Let ComputerName(ByVal strCName As String)
pstrComputerName = strCName
End Property


Na parte das declarações gerais da pasta de trabalho, declaramos uma variável global privada a qual será utilizada dentro da pasta de trabalho. Por exemplo, poderíamos passar o valor para a propriedade da seguinte forma:


Figura 1-1 Expondo propriedades personalizadas

Conforme observado, o ideal é que você mantenha os objetos com um nome reconhecido internacionalmente para evitar confusão em termos de nomenclatura. O objeto EstaPasta_de_trabalho é reconhecido internacionalmente como ThisWorkbook. Sendo assim, é interessante manter esta nomenclatura. Embora não seja algo obrigatório, isso facilitará a compreensão por terceiros.

Para modificar o nome do objeto, abra a Janela de Propriedades (pressione F4) caso não esteja aberta. Abra o objeto em questão e modifique a propriedade Name para ThisWorkbook:


Figura 1-2 Nome do objeto no idioma de instalação do Excel

Após a modificação:


Figura 1-3 Nome do objeto modificado para efeitos de polimorfismo

Finalmente, você pode chamar a propriedade utilizando o objeto ThisWorkbook o qual é reconhecido internacionalmente e não causaria confusão em termos do que ele realmente significa:


Figura 1-4 Expondo a propriedade do objeto utilizando novo nome



Property Get
para ThisWorkbook

Uma vez que você tenha definido uma propriedade de escrita, certamente que deseja ler o valor escrito. Para tanto, utilizamos a instrução Property Get para reaver o valor passado para a propriedade ou o valor fixo da propriedade:

Public Property Get ComputerName() As String
ComputerName = pstrComputerName
End Property

Note que o nome da propriedade é exatamente o mesmo, porém o valor da propriedade é o valor passado para a variável global declarada no tópico anterior. Alternativamente, você pode simplesmente definir um valor fixo para a propriedade.


Property Let e Property Get para Sheet

A mesma lógica deve ser aplicadas às planilhas. Vejamos:

Private pblnEnableActivate As Boolean

Public Property Let EnableActivate(ByVal strCName As Boolean)
pblnEnableActivate = strCName
End Property

Public Property Get EnableActivate() As Boolean
EnableActivate = pblnEnableActivate
End Property

Para que as propriedades fiquem agrupadas e por razões de polimorfismo, utilizo o nome EnableActivate. Ao expor a propriedade ela estará agrupada com outras propriedades com funções similares:


Figura 1-5 Propriedade personalizada para planilhas


Colocando em prática

O leitor pode utiizar o método de criação de propriedades personalizadas para diversas finalidades tais como encapsulação de APIs. No exemplo que segue, veremos algo simples. Suponha que o objetivo seja travar uma determinada planilha. Nós criamos a propriedade EnableActivate a qual determina se a planilha pode ou não ser ativada.

Os cenários variam. Por exemplo, poderíamos bloquear tal acesso permitindo que somente os usuários com determinados privilégios possam acessar a planilha. Aqui, modificaremos o valor da propriedade quando a pasta de trabalho for aberta:

Private Sub Workbook_Open()
Sheet1.EnableActivate = False
End Sub

Em seguida, adicione o seguinte código na planilha que deve ser travada (assumindo que a propriedade já foi declarada):

Private Sub Worksheet_Activate()
Dim ws As Worksheet

If Not (Me.EnableActivate) Then
MsgBox "Você nao pode ativar esta planilha!", vbCritical
If ThisWorkbook.Sheets.Count = 1 Then
ThisWorkbook.Sheets.Add
Else
For Each ws In ThisWorkbook.Sheets
If ws.Name <> Me.Name Then
ws.Activate
Exit For
End If
Next ws
End If
End If
End Sub

Conclusão

Neste curto artigo mostro como criar propriedades personalizadas as quais são expostas por objectos comuns no Excel como ThisWorkbook e Sheet, um recurso pouco utilizado no Excel, mas que pode economizar bastante dor de cabeça além de incorporar propriedades de fácil implementação.

Este artigo é excerto do material de Treinamento encontrado na loja do site em http://shop.linhadecodigo.com.br o qual trata de APIs, acesso ao Registry (escrita e leitura), propriedades personalizadas e enumeração personalizada. O material é desenvolvido sobre o Excel 2003 português.

Robert Friedrick Martim, Expert da Comunidade Excel
Robert Martim é Economista, Formado e Pós-Graduado em Finanças pela Universidade de Londres, Microsoft MVP Excel.

Robert Martim

Robert Martim - Formado e Pós-Graduado em Finanças pela Universidade de Londres, Reino Unido. Diretor de TI da Faircourt Capital Limited (Reino Unido). Fornece suporte pro bono em TI à entidade de caridade Nigeriana NIDOE (Nigerians in Diaspora Organisation Europe) desde 2001. Colaborador ativo do fórum Excel Avançado do site www.juliobattisti.com.br, onde divide seu conhecimento e experiência com outros membros do espaço.
Autor do livro Excel e VBA na Modelagem Financeira: Uma abordagem prática.