VBA宏成功运行3次后出现内存不足错误

时间:2015-06-11 04:19:18

标签: excel vba

我有一个正在运作的宏;从.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来清除。有人能提供一些解决方案或建议吗?

2 个答案:

答案 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的评论。

干杯