2012-05-16 9 views
6

W podprogramie chcę otworzyć skoroszyt, zrobić z niego odczyt i zamknąć go.
Z jakiegoś powodu otrzymuję błąd:Błąd podczas zamykania otwartego skoroszytu w VBA Userform

Run-time error '1004': 

Method 'Close' of object _Workbook failed 

I określiły minimalny fragment kodu do odtworzenia problemu.
Utwórz świeży plik programu Excel. W tym celu utwórz formularz użytkownika. Na który należy utworzyć przycisk polecenia z następującego kodu zdarzenia 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 

Co mnie naprawdę wprawia w zakłopotanie, że ten błąd się nie dzieje z tym samym kodem, gdy przycisk poleceń nie jest na UserForm (na równinie przycisk prosto w arkuszu roboczym).

Nie wiem nawet, co jeszcze zgłosić lub gdzie szukać wyjaśnić to zachowanie (poza StackOverflow!). Piszę VBA przy użyciu programu Excel dla komputerów Mac 2011 i można przenieść do systemu Windows Excel 2010, jeśli ma to znaczenie.

+0

Twój kod wydaje się działać dla mnie w Windows Excel 2010 z formularzem użytkownika (a także jako zwykły kod). – stephan

+0

Darn :(Przypuszczam, że powinienem przetestować go na Windowsie teraz.Ale chciałabym zobaczyć rozwiązanie, które działa zarówno na Windowsie jak i na Macu –

Odpowiedz

7

Tak, w programie Excel 2011 jest to błąd (Nieudokumentowane - nie znalazłem jeszcze dla niego dokumentacji). Musisz nieznacznie zmodyfikować kod. Spróbuj tego

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

Co za głupi błąd Przenieś 'Unload Me' poniżej" Dim " oświadczenia i to działa. Dziękuję! (Dodałem też trochę linii 'ScreenUpdating = False' /' True', aby nieco go wygładzić). –

0

miałem dokładnie ten problem w programie Excel 11 na Mac (działało dobrze Excel 2013 w systemie Windows), wystąpił tylko błąd w sub modułu, który został wywołany z UserForm. Jeśli ktoś (np. Ja) próbuje użyć metody workbook.close z sub/funkcji w module (lub innej lokalizacji), która nie znajduje się wewnątrz samego UserForm, nie można użyć "Ja". "Ja" jest użyteczne tylko w samym kodzie UserForm.

Zamiast "Rozładuj mnie" użyj funkcji zwolnienia i nazwy swojego UserForm.

Unload UserFormName 
Powiązane problemy