我有一个正在运作的宏;从.txt文件(超过2个月的数据点)读取大量数据,进行一些过滤和计算,然后输出到电子表格。 但是,在运行宏3次后,VBA会产生运行时错误' 7'内存不足。
我的临时解决方案是保存,关闭并重新打开excel(2010),这使我能够再运行该程序几次 - 但在将程序交给客户端时,这不是一个可行的选择。
这是代码,过滤从中间取出。 cellsArray是一个变体数组;输入字符串和整数。
For w = 0 To Listbox2count - 1
Worksheets.Add(, ActiveSheet).Name = bookname
' open input text file
myFile = ActiveWorkbook.path & "\" & SelectedTxtFileNames(w)
Open myFile For Input As #1
ReDim cellsArray(1048570, 12)
Do While Not EOF(1)
For i = 0 To 11
' some calculations here
a = (i * ints) + counter + AMPMset * (ints * 11)
cellsArray(a, 0) = bookname
cellsArray(a, 1) = road
cellsArray(a, 2) = approach
cellsArray(a, 3) = detectorString
cellsArray(a, 4) = dateString(0)
cellsArray(a, 5) = IDate
cellsArray(a, 8) = hours(i + 1)
cellsArray(a, 9) = cars(0)
If cellsArray(a, 9) = ":60" Then
cellsArray(a, 9) = ":00"
cellsArray(a, 8) = hours(i + 1) + 1
If cellsArray(a, 8) = 24 Then
cellsArray(a, 8) = 0
End If
End If
cellsArray(a, 10) = cars(i + 1)
cellsArray(a, 11) = projectCode
Next i
Loop
Range("A5:L" & a + 5) = cellsArray
Close #1
ReDim cellsArray(0)
Next w
此行生成错误:
Range("A5:L" & a + 5) = cellsArray
在将数据输出到新电子表格之前,cellsArray的尺寸由最大行数决定。
当宏运行时,我一直在使用任务管理器观察计算机的内存使用情况;当数组被填充和清空时,内存使用量达到峰值和下降。发生运行时错误的时候通常是在有可用内存时,所以我真的不知道为什么会发生这种错误。
如果我一遍又一遍地写同一个电子表格,仍然会生成运行时错误;所以电子表格本身不再使用内存。
似乎每次运行宏都会使用一大块内存;我只能通过关闭和重新开启excel来清除。有人能提供一些解决方案或建议吗?
答案 0 :(得分:0)
我不赞成手动数据处理。为每个工作表编写SQL并在一个查询中进行过滤/排序不是更容易吗?即使文件不是典型的CSV(逗号分隔),您也可以始终指定分隔符,或者使用Mid
函数拆分行,如下所示。我想这比在VBA中写出来更有效:
Sub CreateQuery()
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array(Array( _
"ODBC;DefaultDir=C:\[YOUR_PATH_TO_FILE];Driver={Microsoft Text-Treiber (*.txt; *.csv)};DriverId=27;FIL=text;MaxBufferSize"), Array( "=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;")), Destination:=Range("$A$1")).QueryTable
.CommandType = 0
.CommandText = Array( _
'************Your SELECT QUERY BELOW****************
"SELECT Mid(Test.`Col1;Col2`,1,InStr(Test.`Col1;Col2`,';')-1) AS 'T' FROM Test.txt Test" _
)
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "Table_Query_from_Text_file"
.Refresh BackgroundQuery:=False
End With
End Sub
答案 1 :(得分:-1)
GD Lin,
您是否尝试过使用
Erase cellsArray
这将完全消除阵列并释放它使用的任何资源? 您可以在开始时在循环中重新创建它。
根据Axel Richter的评论。
干杯