2012-05-16 1 views
6

В подпрограмме я хочу открыть книгу, прочитать ее и закрыть.
По некоторым причинам, я получаю сообщение об ошибке:Ошибка при закрытии открытой книги в VBA Userform

Run-time error '1004': 

Method 'Close' of object _Workbook failed 

я определил минимальный фрагмент кода, чтобы воспроизвести проблему.
Создайте новый файл Excel. В нем создайте Userform. О том, создать кнопку Command со следующим кодом Нажмите событие:

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 

Что действительно озадачивает меня в том, что эта ошибка не происходит с тем же кодом, когда кнопка Command не на UserForm (на равнине кнопка прямо на рабочем листе).

Я даже не знаю, что еще сообщить или где искать объяснение этого поведения (помимо StackOverflow!). Я пишу VBA с помощью Excel для Mac 2011 и могу перейти в Windows Excel 2010, если это имеет значение.

+0

FWIW, ваш код работает для меня в Windows Excel 2010 с пользовательской формой (а также в виде простого кода). – stephan

+0

Darn :(Я полагаю, что сейчас я должен проверить его на Windows. Хотя мне бы хотелось увидеть решение, которое работает как для Windows, так и для Mac. –

ответ

7

Да, в Excel 2011, это ошибка (Недокументированные - я еще не нашел документацию для него). Вы должны слегка изменить код. Попробуйте

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 
+0

Какая глупая ошибка. Перемещаем 'Unload Me' под' Dim' (я также добавил некоторые строки «ScreenUpdating = False»/​​'True', чтобы немного сгладить его). –

0

Я имел точно такую ​​проблему на Excel 11 на Mac (работал отлично Excel 2013 на Windows), только ошибка в модуле подразделам, который был вызван из UserForm. Если кто-то (например, я) пытается использовать метод workbook.close из суб/функции в модуле (или другом месте), который не находится внутри самого UserForm, вы не можете использовать «Me». «Me» используется только в самом коде UserForm.

Вместо «Разгрузить меня» используйте функцию выгрузки и имя вашего UserForm.

Unload UserFormName