Pergunta sobre vba, excel-vba, excel, excel-vba-mac – Erro ao fechar uma pasta de trabalho aberta no formulário de usuário do VBA

6

Em uma sub-rotina, quero abrir uma pasta de trabalho, fazer algumas leituras dela e fechá-la.
Por algum motivo, recebo um erro:

Run-time error '1004':

Method 'Close' of object _Workbook failed

Eu identifiquei um trecho de código mínimo para reproduzir o problema.
Crie um novo arquivo excel. Nele, crie um Userform. Nessa, crie um botão de comando com o seguinte código de evento Click:

Private Sub CommandButton1_Click()
    Dim filename As String
    Dim opened_workbook As Workbook

    filename = Application.GetOpenFilename()    ' User selects valid Excel file
    Set opened_workbook = Application.Workbooks.Open(filename)
    ' File operations would occur here
    opened_workbook.Close    ' Exception thrown here

    MsgBox "If you got here, it worked!"
    Unload Me
End Sub

O que realmente me deixa perplexo é que esse erro não acontece com o mesmo código quando o botão de comando não está em um formulário de usuário (em um botão simples direto na planilha).

Eu nem sei mais o que denunciar ou onde procurar para explicar esse comportamento (além do StackOverflow!). Estou escrevendo o VBA usando o Excel para Mac 2011 e posso migrar para o Windows Excel 2010 se isso fizer diferença.

FWIW, seu código parece funcionar para mim no Windows Excel 2010 com um formulário de usuário (e também como código simples). stephan
Darn :( Eu suponho que eu deveria testá-lo no Windows agora mesmo. Embora eu adoraria ver uma solução que funcione tanto para Windows e Mac. Prashant Kumar

Sua resposta

2   a resposta
0

Eu tive esse problema exato no Excel 11 no Mac (trabalhou bem Excel 2013 no Windows), somente o erro ocorreu em um sub de módulo que foi chamado do UserForm. Se alguém (como eu) estiver tentando usar o método workbook.close de um sub / função em um módulo (ou outro local) que não esteja dentro do UserForm, não será possível usar 'Me'. 'Me' só é utilizável dentro do próprio código UserForm.

Em vez de 'Unload Me', use a função unload e o nome do seu formulário de usuário.

Unload UserFormName
7

Sim, no Excel 2011, é um bug (Não documentado - ainda não encontrei uma documentação para ele). Você tem que modificar ligeiramente o código. Tente isso

Private Sub CommandButton1_Click()
    Dim filename As String
    Dim opened_workbook As Workbook

    filename = Application.GetOpenFilename()    ' User selects valid Excel file
    Set opened_workbook = Application.Workbooks.Open(filename)

    Unload Me

    opened_workbook.Close    

    MsgBox "If you got here, it worked!"
End Sub
Que bobo bobo. Movido oUnload Me abaixo doDim declarações e funciona. Obrigado! (Eu também adicionei algunsScreenUpdating = False/True linhas para suavizar um pouco). Prashant Kumar

Perguntas relacionadas