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.
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.
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.
No Visual Basic, crie um novo projecto de DLL de ActiveX . Altere o nome do projecto para ExcelTest .
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
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
Crie "ExcelTest.dll".
Crie um novo livro no Microsoft Excel. Prima ALT+F11 para abrir o Editor do Visual Basic.
A partir do menu Inserir , clique em UserForm para adicionar um novo userform o projecto VBA.
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
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 .
Guarde o livro e fechá-lo.
Agora, para reproduzir o problema com o VBA project a palavra-passe que aparece quando o Excel é encerrado:
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 .
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 .
Seleccione MinhaMacro na lista e, em seguida, clique em Executar .
Dispense o userform que a macro apresenta.
Sair do Microsoft Excel.
É 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.
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/
)
Qual foi o esforço que despendeu pessoalmente para utilizar este artigo?
Muito baixo
Baixo
Moderado
Elevado
Muito elevado
Diga-nos porquê e o que podemos fazer para melhorar estas informações
Obrigado! Os seus comentários são utilizados para ajudar-nos a melhorar o conteúdo do nosso suporte. Para obter mais opções de assistência, visite a Home Page de Ajuda e Suporte.