2012-12-10 16 views
5

Próbuję napisać aplikację świat powitania w języku Visual Basic for Applications, a mianowicie, aby zmodyfikować komórki w arkuszu Excel. Oto ona:skrypt VBA wisi na Workbook.Close

Sub hello() 

    Dim obj As Object 
    Dim Workbook As Object 

    Set obj = CreateObject("Excel.Application") 
    Set Workbook = obj.Workbooks.Open("C:\Users\gbuday\Desktop\Oktatás\Excel\start.xlsx") 

    Workbook.Worksheets("Munka1").Range("B3") = "Hello World!" 

    Workbook.Close 
    Set Workbook = Nothing 
    Set obj = Nothing 

End Sub 

Po uruchomieniu zawiesza Excel i nie mogę przestać skrypt działa, tylko zabić proces Excel. Debugując go, zawiesza się na linii Workbook.Close. Jaki jest problem z tą linią?

+0

Zobacz http://www.tushar-mehta.com/excel/vba/xl_doesnt_quit/ Normalnie podczas automatyzowania byłoby użyć 'WB.Quit' przed' Ustaw WB = Nothing'. Dobra praktyka, aby nie używać obiektu (skoroszytu) jako nazwy zmiennej – brettdj

Odpowiedz

4

Problemem jest to, że nie dają Excel wystarczająco dużo czasu, aby zakończyć ją za operacje. Zwykle problem rozwiąże DoEvents. Również w celu uniknięcia nieporozumień, warto wymienić swoją zmienną jako `WBK” zamiast «skoroszyt»

Sub hello() 
    Dim obj As Object, wbk As Object 

    Set obj = CreateObject("Excel.Application") 
    Set wbk = obj.Workbooks.Open("C:\Users\gbuday\Desktop\Oktatás\Excel\start.xlsx") 

    wbk.Worksheets("Munka1").Range("B3") = "Hello World!" 

    DoEvents 

    '~~> Change True to False if you do not want to save 
    wbk.Close SaveChanges:=True 

    Set wbk = Nothing: Set obj = Nothing 
End Sub 
+0

Dzięki, Siddharth, zadziałało. Najważniejszą rzeczą była klauzula SaveChanges. – Gergely

+0

+1 (chociaż dokonanie zmiany dziesięć nie zapisanie wygląda dziwnie) – brettdj

+0

@brettdj: Very True :). Jednak w wielu scenariuszach (może nie być to powyższe), otwieramy skoroszyt, aby wykonać pewne obliczenia, wykorzystujemy dane wyjściowe do innych obliczeń, a następnie zamykamy skoroszyt bez zapisywania, więc pomyślałem, że mogę wyjaśnić w jednym liniowcu jako skomentuj i pozostaw to pytającemu, czego dokładnie on/ona chce ... –

1

Powinno być

Workbooks.Close 

Myślę też, że «skoroszyt» jest słowem zarezerwowanym i zamiast tego powinieneś użyć czegoś takiego jak "wb".

Dim wb As Workbook