ID do artigo: 280454 - Última revisão: quinta-feira, 29 de março de 2007 - Revisão: 5.1

Prompt de senha para o projeto VBA aparece após o Excel fecha

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 | Recolher tudo

Sintomas

Depois que executar uma macro que passa uma referência para uma pasta de trabalho que contém um projeto VBA password-protected em uma biblioteca de dynamic-link ActiveX (DLL), será solicitada a senha do projeto do VBA quando o Excel fecha.

Causa

Esse problema ocorre se a DLL ActiveX não libera corretamente a referência à pasta de trabalho que contém o VBA protegido por senha projeto.

Resolução

Para corrigir esse problema, criar classes em sua DLL ActiveX de modo que as referências de pasta de trabalho são lançadas corretamente antes de encerrar as classes.

Um cenário comum onde não é disparado um evento Terminate da classe é um onde você tem uma referência circular entre objetos. Uma referência circular seria criada se, por exemplo, um objeto pai cria um filho objeto e mãos uma referência para o pai do objeto que filho. Se a referência da criança para o pai não é liberada, o objeto pai não será finalizada.

As etapas na seção a seguir demonstram como uma referência circular entre os objetos pode ocorrer e como o prompt de senha será exibida se os objetos mantenha uma referência para uma pasta de trabalho protegida quando o Excel fecha. A resolução, que é chamar um método para um dos objetos para quebrar as referências circulares para que os objetos podem encerrar, também é descrita abaixo.

Mais Informações

Etapas para reproduzir o problema

  1. No Visual Basic, crie um novo projeto ActiveX DLL . Altere o nome de projeto para ExcelTest .
  2. Altere o nome de Class1 para ParentClass e adicione o seguinte código para 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, nomeá-la ChildClass e adicione o seguinte código para ChildClass :
    Public Parent As ParentClass
    Public WorkbookRef As Object
    					
  4. Crie "ExcelTest.dll".
  5. Crie uma nova pasta de trabalho no Microsoft Excel. Pressione ALT+F11 para abrir o Editor do Visual Basic.
  6. No menu Inserir , clique em UserForm para adicionar um novo userform para o projeto VBA.
  7. No menu Inserir , clique em módulo para adicionar um novo módulo para o projeto VBA. Adicione o seguinte código para o novo módulo:
    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 , selecione Propriedades VBAProject . Na caixa de diálogo que aparece, clique em guia de proteção clique para selecionar Bloquear projeto para visualização . Fornecer uma senha e clique em OK .
  9. Salve a pasta de trabalho e feche-lo.
  10. Agora, para reproduzir o problema com o VBA projeto senha apareça quando o Excel fecha:
    1. Abra a pasta de trabalho que você salvou na etapa 9.

      No Microsoft Excel 2007, se você for solicitado por um aviso de segurança que indica que as macros foram desabilitadas, clique em Opções . Na caixa de diálogo segurança , clique em Habilitar este conteúdo e, em seguida, clique em OK .
    2. Execute uma das seguintes ações:
      • No Excel 2007, clique em macros no grupo de código no guia do desenvolvedor . Se a guia desenvolvedor , não um [[ear, clique no Botão Microsoft Office , clique em Opções do Excel , clique em popular , marque a caixa de seleção Mostrar guia Desenvolvedor na faixa de opções e, em seguida, clique em OK .
      • No Microsoft Office Excel 2003 ou em uma versão anterior do Excel, clique em macro no menu Ferramentas e, em seguida, clique em macros .
    3. Selecione MyMacro na lista e, em seguida, clique em Executar .
    4. Descarte o userform que exibe a macro.
    5. Encerre o Microsoft Excel.
    6. Você será solicitado a senha de projeto do VBA quando o Excel fecha.
Quando você usar as etapas acima para reproduzir o problema, observe que o evento Terminate para a classe ParentClass não dispara mesmo depois de definir seu objeto no Excel macro como Nothing . (A ausência de MessageBox com a mensagem "Evento Terminate ParentClass" indica que esse evento não acionado.)

Para corrigir o problema para que a referência para a pasta de trabalho do Excel é liberada corretamente, remova o comentário da linha de designado na macro do Excel, salvar a macro e, em seguida, repita o teste. Quando a referência de pasta de trabalho é liberada corretamente, Terminate evento do objeto será acionado e você não será solicitado para a VBA projeto senha quando o Excel fecha.

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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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/ )