Artigo: 280454 - Última revisão: quinta-feira, 29 de Março de 2007 - Revisão: 5.1

Pedido de palavra-passe para o projecto VBA aparece depois do Excel é encerrado

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.

Nesta página

Expandir tudo | Reduzir tudo

Sintomas

Depois de executar uma macro que transmite uma referência para um livro que contém um projecto VBA protegida por palavra-passe para uma biblioteca de ligação dinâmica (DLL) de ActiveX, é solicitado para a palavra-passe de projecto do VBA quando o Excel é encerrado.

Causa

Este problema ocorre se a DLL de ActiveX não liberta correctamente a referência para o livro que contém o VBA protegida por palavra-passe projecto.

Resolução

Para corrigir este problema, classes de estrutura na DLL de ActiveX para que o livro referências são lançadas correctamente antes de terminar as classes.

Um cenário comum onde um evento de Terminar de classe não é despoletado é uma em que tenha uma referência circular entre objectos. Deverá ser criada uma referência circular se, por exemplo, um objecto principal cria um subordinado objecto e mãos dessa criança objecto uma referência para o principal. Se referência a criança principal não é libertada, o objecto principal não será terminada.

Os passos na secção seguinte demonstram como uma referência circular entre objectos poderão ocorrer e como será apresentado o pedido de palavra-passe se mantém os objectos para uma referência para um livro protegido quando o Excel é encerrado. A resolução, que é a chamar um método para um dos objectos para dividir as referências circulares, de modo que os objectos podem terminar, também é descrita abaixo.

Mais Informação

Passos para reproduzir o comportamento

  1. No Visual Basic, crie um novo projecto de DLL de ActiveX . Altere o nome do projecto para ExcelTest .
  2. Altere o nome de Aula1 para ParentClass e, em seguida, adicione o seguinte código ao ParentClass :
    Option Explicit
    
    Private oChild As ChildClass
    Private WorkbookRef As Object
    
    Private Sub Class_Initialize()
       Set oChild = New ChildClass
       Set oChild.Parent = Me
    End Sub
    
    Private Sub Class_Terminate()
       Set oChild.WorkbookRef = Nothing
       Set oChild.Parent = Nothing
       Set oChild = Nothing
       MsgBox "ParentClass Terminate Event"
    End Sub
    
    Public Sub Clear()
        Set oChild.Parent = Nothing
    End Sub
    
    Public Sub SetWorkbook(o As Object)
        Set WorkbookRef = o
        Set oChild.WorkbookRef = o
    End Sub
    					
  3. Adicionar outro módulo de classe, o nome ChildClass e, em seguida, adicione o seguinte código ao ChildClass :
    Public Parent As ParentClass
    Public WorkbookRef As Object
    					
  4. Crie "ExcelTest.dll".
  5. Crie um novo livro no Microsoft Excel. Prima ALT+F11 para abrir o Editor do Visual Basic.
  6. A partir do menu Inserir , clique em UserForm para adicionar um novo userform o projecto VBA.
  7. A partir do menu Inserir , clique em módulo para adicionar um novo módulo ao projecto VBA. Adicione o seguinte código ao módulo novo:
    Public o As Object
    Sub MyMacro()
        UserForm1.Show
        Set o = CreateObject("ExcelTest.ParentClass")
        o.SetWorkbook ThisWorkbook
        'o.Clear  '<=== Remove comment to demonstrate the workaround.
        Set o = Nothing
    End Sub
    					
  8. No menu Ferramentas , seleccione Propriedades VBAProject . Na caixa de diálogo que aparece, clique no separador de protecção . Clique para seleccionar Bloquear projecto para visualização . Fornecer uma palavra-passe e clique em OK .
  9. Guarde o livro e fechá-lo.
  10. Agora, para reproduzir o problema com o VBA project a palavra-passe que aparece quando o Excel é encerrado:
    1. Abra o livro que guardou no passo 9.

      No Microsoft Office Excel 2007, se for pedido por um aviso de segurança indica que as macros tiverem sido desactivadas, clique em Opções . Na caixa de diálogo segurança , clique em activar este conteúdo e, em seguida, clique em OK .
    2. Efectue uma das seguintes acções:
      • No Excel 2007, clique em macros no grupo de código no separador Programador . Se o separador Programador não um [[ear, clique no Botão do Microsoft Office , clique em Opções do Excel , clique em Popular , clique para seleccionar a caixa de verificação Mostrar separador de programador no Friso e, em seguida, clique em OK .
      • No Microsoft Office Excel 2003 ou numa versão anterior do Excel, clique em ' macro ' no menu Ferramentas e, em seguida, clique em macros .
    3. Seleccione MinhaMacro na lista e, em seguida, clique em Executar .
    4. Dispense o userform que a macro apresenta.
    5. Sair do Microsoft Excel.
    6. É solicitado para a palavra-passe de projecto do VBA quando o Excel é encerrado.
Quando utilizar os passos acima para reproduzir o problema, tenha em atenção que o evento Terminate para a classe ParentClass não é despoletado mesmo depois de definir o objecto no Excel macro como Nothing . (A ausência de MessageBox com a mensagem "ParentClass Terminar evento" indica que este evento não activado.)

Para corrigir o problema para que a referência para o livro do Excel é correctamente libertada, remover o comentário de linha designada na macro do Excel, guardar a macro e, em seguida, repita o teste. Quando a referência de livro correctamente é libertada, irá lançar o evento Terminate do objecto e já não será avisado para o VBA projecto palavra-passe quando o Excel é encerrado.

A informação contida neste artigo aplica-se a:
  • Microsoft Office Excel 2007
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
Palavras-chave: 
kbmt kbexpertisebeginner kbprb KB280454 KbMtpt
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). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 280454  (http://support.microsoft.com/kb/280454/en-us/ )