2017-02-13 83 views
0

問題:直到代碼運行完畢,工作簿纔會打開。直到VBA代碼運行完畢,Excel工作簿纔會打開

詳情:我有一個循環,需要用戶有另一個文件打開,爲了使代碼以繼續。該文件必須從互聯網上下載並打開。如果文件未打開,則會出現一個msgbox,要求用戶打開該文件。即使我下載文件並打開它,它也不會打開,直到所有其他代碼都被執行完畢。

我的想法:也許有像「刷新」,就是更新當前狀態。我應該添加一些東西到現有的代碼中,刷新excel工作簿,看看是否有其他事情發生。

代碼如下:(代碼是好的,並適用於我所需要的,問題是,該工作簿不會打開,直到所有的其他代碼完成):

Private Function WorkbookActive() As Boolean 

' Loop until the correct workbook is open 
Do Until WorkbookActive = True 
    On Error Resume Next 
    If Workbooks("Rapport.csv") Is Nothing Then 
     If MsgBox("[Rapport.csv] - Workbook is currently not open." & vbNewLine & "Please download and open [Rapports.csv] and press OK", vbOKCancel, "Workbook not open") = vbCancel Then Exit Do 
     WorkbookActive = False 
    ElseIf Not Workbooks("Rapport.csv") Is Nothing Then 
     WorkbookActive = True 
    End If 
Loop 

End Function 
+0

FWIK,VBA使用單線程,您的循環將阻止其他操作(包括從Excel打開的工作簿)。要做你想做的事,你可能需要改變你的方法,詢問用戶_Rapport.csv_的位置,然後在你的代碼中打開它,並繼續你的程序。 – Prisoner

+0

感謝您的回答,問題是我已經嘗試了很多方法來解決這個問題。主要的問題是,當代碼運行時,我無法打開任何其他文件。 – EliasWick

+0

你有沒有嘗試在你的代碼中打開文件? FYR:http://stackoverflow.com/a/26417509/1050927 – Prisoner

回答

0

所有你需要的是使你的循環「間接」,使用Application.Ontime。重寫你循環是這樣的:

Sub IndirectLoop() 
    On Error Resume Next 
    Workbooks("Rapport.csv").Activate 
    If Err.Number = 0 Then Exit Sub ' Done! 
    If MsgBox("[Rapport.csv] - Workbook is currently not open." & vbNewLine & _ 
     "Please download and open [Rapports.csv] and press OK", _ 
     vbOKCancel, "Workbook not open") = vbCancel Then _ 
      Exit Sub ' loop cancelled by user 

    ' Pause VBA and reschedule the routine for 3 seconds later 
    ' Control passes here from VBA to excel to open the file by the user' 
    Application.OnTime Now + TimeSerial(0, 0, 3), "IndirectLoop" 
End Sub 

的想法是,而不是你的VBA程序中循環(這使Excel的阻塞),使用Application.Ontime重新安排的程序。這種技術會將控件從VBA傳遞給Excel一段時間(比如上面代碼中的3秒),允許它執行一些活動,即打開您正在等待的文件。

+0

非常感謝!這工作! – EliasWick

+0

@EliasWick歡迎您,很高興幫助:) –

相關問題