2015-11-20 81 views
1

我一直試圖循環使用VBA中的一大串.csv文件。他們每個人都是大約50MB。在每次迭代中,我都會打開一個新的CSV來處理數據,但當.csv打開時,會出現一條下載消息,指出文件正在打開,並且進度條總是在VBA等待它完成時卡住。等待在Excel中打開大文件

其實.csv是打開的,因爲如果我點擊進度條上的「取消」代碼繼續運行良好,但我必須在每次迭代中執行手動操作。

我的猜測是,VBA進入下一步,而文件未打開或類似的東西,所以也許如果我做了睡眠或類似的東西,它可以工作,但我所嘗試的東西現在不工作。 (我已經嘗試過Application.EnableEvents = False)。這裏是我的代碼:

Sub GetOptions() 

Application.DisplayAlerts = False 
Application.EnableEvents = False 

Set Dates = Sheets("Dates") 
Set Res = Sheets("Options") 

Dim dateToday As Date 

ETF = "SPY" 
nrows = Dates.Cells(Rows.Count, 1).End(xlUp).Row 


For i = 708 To nrows 

    If Dates.Cells(i, 2).Value = "B" Then 
     dateToday = Dates.Cells(i, 1).Value 
     dateYear = Year(dateToday) 
     stringOpening = "P:\Options Database\CSV\" & dateYear & "\bb_" & dateYear & "_" & GetMonth(dateToday) & "\bb_options_" & Format(dateToday, "yyyymmdd") & ".csv" 
     Workbooks.Open stringOpening, UpdateLinks:=0, ReadOnly:=True 
     Set Options = Workbooks("bb_options_" & Format(dateToday, "yyyymmdd")).Sheets(1) 

     Do things... 

     Workbooks("bb_options_" & Format(dateToday, "yyyymmdd")).Close SaveChanges:=False 
    End If 
Next i 


End Sub 
+0

我建議你測試並完成您的代碼首先是小文件。讓你的代碼在一組小的(或中等)文件上正確運行,並且適應它,然後才轉移到大文件,這將更容易評估問題。 –

+0

Thx但我已經在較小的文件上嘗試過它,並且它能正常工作,它只在涉及大文件(> 30-40MB)時纔會出現問題 – Clement

+0

您的P驅動器映射到什麼地方?網絡文件夾,還是別的? –

回答

0

一個小竅門是:

  1. 打開它們的讀/寫文件,
  2. 等待這表明它完全打開寫入狀態
  3. 將文件設回只讀

此代碼循環直到文件進入寫入狀態:

Sub myWaitForFileOpen() 
Dim wb As Workbook 
Set wb = Application.Workbooks.Open("C:\File.xls") 

Do Until wb.ReadOnly = False 
    wb.Close 
    Application.Wait Now + TimeValue("00:00:01") 
    Set wb = Application.Workbooks.Open("C:\File.xls") 
Loop 
'Then the code that needs that Workbook open here! 
'Or Call That other macro here! 
End Sub 

下面是完整的代碼,將在讀/寫打開CSV,直到它完全加載,然後把它放回去爲只讀:

Sub GetOptions() 
Dim wB As Workbook 

Application.DisplayAlerts = False 
Application.EnableEvents = False 

Set Dates = Sheets("Dates") 
Set Res = Sheets("Options") 

Dim dateToday As Date 

ETF = "SPY" 
nrows = Dates.Cells(Rows.Count, 1).End(xlUp).Row 


For i = 708 To nrows 
    If Dates.Cells(i, 2).Value = "B" Then 
     dateToday = Dates.Cells(i, 1).Value 
     dateYear = Year(dateToday) 
     stringOpening = "P:\Options Database\CSV\" & dateYear & "\bb_" & dateYear & "_" & GetMonth(dateToday) & "\bb_options_" & Format(dateToday, "yyyymmdd") & ".csv" 

     Set wB = Workbooks.Open(stringOpening, UpdateLinks:=0, ReadOnly:=False) 

     Do Until wB.ReadOnly = False 
      wB.Close 

      Application.Wait Now + TimeValue("00:00:01") 

      Set wB = Application.Workbooks.Open("C:\My Files\AAA.xls") 
     Loop 
     wB.ReadOnly = True 
     Set Options = wB.Sheets(1) 


     Do 
      'things... 
     Loop 

     wB.Close SaveChanges:=False 
    End If 
Next i 

End Sub