2015-11-20 83 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