Artigo: 555159 - Última revisão: segunda-feira, 12 de Julho de 2004 - Revisão: 1.0

Como utilizar uma classe (objecto) a partir fora do projecto do VBA em que foi declarado como

Author: Tushar Mehta MVP
Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Reduzir tudo

Sugestões

Como um projecto VBA pode usar um objeto declarado no módulo de classe de outro projecto

Autor
O autor desta sugestão é Tushar Mehta. Pode contactar-lhe através o Website: www.tushar-mehta.com
 
Introdução
Uma das vantagens da utilização objecto orientado Programming (OOP) é o reaproveitamento do código. A forma típica de fazê-lo é para criar uma instância um objecto de uma classe já definido com a variável Set = novo sintaxe ClassName . Os programadores de VBA utilizar esses objectos sempre que utilizam qualquer objecto dentro o respectivo plataforma de aplicações. Os exemplos incluem o objecto de livro no Excel, o objecto de apresentação no PowerPoint ou o objecto documento no Word. Para além disso, VBA programadores utilização userforms, que são objectos que pertencem a um tipo especial de classe. Todos estes objectos são definidos em bibliotecas que se encontram fora do projecto do programador de VBA. Faça clique sobre as ferramentas no | opção de menu Referencesà para ver a lista de bibliotecas externas que o Visual Basic Editor (VBE) estabelece automaticamente no nome do programador.
 
Nesta sugestão, são explicados como lhes aceder uma classe personalizada numa biblioteca externa criada pelo-nos. Enquanto o exemplo utilizado abaixo baseia-se no Excel 2003, as sugestões aplica a outros produtos MS Office que suportam o VBA e é aplicável a versões 2000 ou posterior.
 
Trata-se uma sugestão de nível intermediate / avançados e-lo pressupõem um determinado nível com programação VB(A) de conforto.
 
Existem dois configurar distintas Passos necessários antes de poder aceder um objecto declarado no módulo de classe do outro projecto VBA um projecto VBA. O primeiro conjunto torna o módulo de classe utilizável fora do projecto no qual está declarado e fornece um meio pelo qual um objecto pode ser instanciado. O segundo conjunto trata os como o projecto do cliente utiliza esta classe.
 
Configurar o projecto que contém a definição de classe
Por predefinição num módulo classe tem a propriedade Instancing definida como privada . Isso significa que apenas o projecto que contém a definição de classe pode instâncias um objecto dessa classe. Outra a opção que suporta VBA apenas é Public, não creatable . O que isso significa é que um projecto externo pode usar um objeto desta classe, mas que não é possível criar instâncias-lo. Pode parecer estranho, mas essa é a maneira trata-se. A forma para alterar a propriedade a partir do valor predefinido consiste em Seleccione o módulo de classe no explorador Project VBE, seleccione o módulo de classe de interesse, aceder Janela de Propriedades e altere a propriedade Instancing para PublicNotCreatable 11D2- (se necessário, utilize a tecla F4 para torná-la visível), (se necessário, utilize F4 para torná-la visível), e altere a propriedade Instancing para 11D2-PublicNotCreatable .
 
A seguir juntamente com o exemplo nesta sugestão, criar um módulo de classe, atribua-lhe clsEmployee , alterar a respectiva propriedade Instancing, e adicione o seguinte código ao mesmo.
 
Opção explícita
Dim sName As String
Propriedade Get Name() como cadeia
    Nome = sName
    Propriedades de fim
Propriedade Name(uName As String) Let
    sName = uName
    Propriedades de fim
 
Em seguida, uma vez que a propriedade Instancing da classe é public NotCreatable, o projecto tem fornecem uma forma para um cliente para criar uma instância do objecto. Adicionar uma nova função de um módulo padrão:
 
Opção explícita
Função como New_clsEmployee() clsEmployee pública
    Definir New_clsEmployee = New clsEmployee
    Função de fim

Onde clsEmployee é o nome da classe de interesse. Para além disso, este não deve ser um módulo privada.
 
Uma alteração final tornará vida um pouco mais fácil. Mudar o nome projecto relativamente à predefinição VbaProject para ClassProvider. para fazê-lo, seleccione o projecto no explorador de projecto de VBE, seguida, seleccione Ferramentas | Propertiesà VbaProject | separador Geral | e no campo ' nome de projecto introduza ClassProvider .
 
Guarde este ficheiro, por exemplo, como Provider.xls classe .
 
Em seguida, mover no para o projecto de cliente.
 
Configurar o projecto que irá utilizar a classe exportada
O projecto do cliente utiliza a classe muito tal como seria uma classe definida no outra qualquer biblioteca externa (como, por exemplo, num UserForm)--com uma diferença de chaves. Uma vez que não é possível criar instâncias um objecto dessa classe, tem de utilizar a função New_clsEmployee() declarada acima. Tal como com outras qualquer biblioteca externa, decida se pretende utilizar ligação antecipada ou vinculação posterior. O código abaixo demonstra ambos. Não se esqueça que a utilizar o código de ligação antecipada, o projecto de cliente tem de incluir uma referência (ferramentas | Referencesà) para o ficheiro Provider.xls classe .
 
Opção explícita
Sub UseExportedClass_EarlyBinding()
    Dim anEmployee ClassProvider.clsEmployee como
    Definir anEmployee = ClassProvider.New_clsEmployee
    anEmployee.Name = Tushar Mehta " "
    MsgBox anEmployee.Name
    End Sub
Sub UseExportedClass_LateBinding()
    Dim anEmployee como objecto
    Definir anEmployee = Application.Run("'G:\temp\class Provider.XLS'!new_clsEmployee")
    anEmployee.Name = Tushar Mehta " "
    MsgBox anEmployee.Name
    End Sub
 
Nota final
A biblioteca externa não têm de ser um ficheiro guardado normalmente. Pode ser num suplemento específico da aplicação (como, por exemplo, um ficheiro guardado com o sufixo.xla ou.ppa). Lembre-se que esse Um suplemento é aberto não através do ficheiro normal apenas | método Openà mas carregado com as ferramentas | comandos ADD-Insà.
 
Referências : O artigo único encontrados neste assunto no MSKB:
Como criar módulos de classe disponível fora-de-Process VBA
http://support.microsoft.com/default.aspx?scid=kb;en-us;244075

A informação contida neste artigo aplica-se a:
  • Microsoft Visual Basic for Applications 6.0
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Pedíamos-lhe o favor de preencher o formulário existente no fundo desta página caso tenha encontrado erros neste artigo e tenha possibilidade de colaborar no processo de aperfeiçoamento desta ferramenta. Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 555159  (http://support.microsoft.com/kb/555159/en-us/ )
Community Solutions ContentCOMMUNITY SOLUTIONS CONTENT DISCLAIMER
MICROSOFT CORPORATION AND/OR ITS RESPECTIVE SUPPLIERS MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY, RELIABILITY, OR ACCURACY OF THE INFORMATION AND RELATED GRAPHICS CONTAINED HEREIN. ALL SUCH INFORMATION AND RELATED GRAPHICS ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT AND/OR ITS RESPECTIVE SUPPLIERS HEREBY DISCLAIM ALL WARRANTIES AND CONDITIONS WITH REGARD TO THIS INFORMATION AND RELATED GRAPHICS, INCLUDING ALL IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, WORKMANLIKE EFFORT, TITLE AND NON-INFRINGEMENT. YOU SPECIFICALLY AGREE THAT IN NO EVENT SHALL MICROSOFT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, PUNITIVE, INCIDENTAL, SPECIAL, CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF USE, DATA OR PROFITS, ARISING OUT OF OR IN ANY WAY CONNECTED WITH THE USE OF OR INABILITY TO USE THE INFORMATION AND RELATED GRAPHICS CONTAINED HEREIN, WHETHER BASED ON CONTRACT, TORT, NEGLIGENCE, STRICT LIABILITY OR OTHERWISE, EVEN IF MICROSOFT OR ANY OF ITS SUPPLIERS HAS BEEN ADVISED OF THE POSSIBILITY OF DAMAGES.