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 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.
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.
No Visual Basic, crie um novo projeto ActiveX DLL . Altere o nome de projeto para ExcelTest .
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
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
Crie "ExcelTest.dll".
Crie uma nova pasta de trabalho no Microsoft Excel. Pressione ALT+F11 para abrir o Editor do Visual Basic.
No menu Inserir , clique em UserForm para adicionar um novo userform para o projeto VBA.
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
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 .
Salve a pasta de trabalho e feche-lo.
Agora, para reproduzir o problema com o VBA projeto senha apareça quando o Excel fecha:
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 .
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 .
Selecione MyMacro na lista e, em seguida, clique em Executar .
Descarte o userform que exibe a macro.
Encerre o Microsoft Excel.
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.
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/
)
Quanto esforço foi necessário para seguir os procedimentos deste artigo?
Muito baixo
Baixo
Moderado
Alto
Muito alto
O que podemos fazer para melhorar essa informação?
Para proteger sua privacidade, não inclua informações de contato em seus comentários.
Obrigado! Seus comentários são usados para nos ajudar a aperfeiçoar o conteúdo de suporte. Para obter mais opções de ajuda, visite a Home Page de Ajuda e Suporte.