2017-02-13 8 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を使ってループを間接的にすることです。 Application.Ontimeを使用してルーチンを再スケジューリング、代わりに(Excelがブロックされ続けて)あなたのVBAルーチン内のループの、

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にある程度の時間(例えば、上記のコードでは3秒)のコントロールを渡し、何らかのアクティビティを実行できるようにします。つまり、あなたが待っているファイルを開きます。

+0

ありがとうございます!これはうまくいった! – EliasWick

+0

@EliasWickようこそ、嬉しいです:) –

関連する問題