为什么我的内存不足会使这个阵列变暗?

时间:2016-08-31 09:50:11

标签: excel vba excel-vba

以下是这种情况:

  • Excel 2013(32)
  • 已安装4Gb RAM
  • Excel使用~250Mb RAM打开我的项目工作簿
  • 无法对20,000 * 700字符串数组进行调暗(错误7,'内存不足')

我不明白为什么会这样,我在实验管理器中尝试调暗较小的阵列并观察资源使用情况,观察Excel使用每10,000行<28Mb 行(相同)列数)。

如果我(保守地)考虑Excel只能使用另一个1000Mb,按此逻辑它应该能够处理350,000行(相同的列数)。

我错过了什么?我能做些什么不同的事情?

由于

编辑:这是代码处理的前提,这个简单的代码重新创建了问题。

Public arrTest() As String

Sub test()

ReDim arrTest(20000, 700)

End Sub

1 个答案:

答案 0 :(得分:0)

您可以利用以下一种或多种技术:

  1. 在需要时分配内存

    您确实需要arrTest()数组为Public吗?

    Public数组变量只要它们的大小和#34;就会被分配。并留在那里直到它结束

    这意味着其他子变量声明带来的每个后续内存分配都会添加到Public

    如果arrTest()中只需要Sub test(),那么只需将其声明移到后一个

    Sub test()
    
        Dim arrTest(20000, 700)
    
    End Sub
    

    一旦退出,arrTest()内存分配就会被释放

    否则,出于同样的原因,您需要arrTest()跨多个潜水艇:

  2. 在使用它的第一个Sub中声明它

  3. 将其作为参数传递给需要使用/处理它的其他Subs

         Sub main()
    
             sub1 '<--| call 'Sub1(): at this stage no memory allocation has taken place for any 'arrTest()' array
             'once out of 'sub1' any memory allocation for any 'arrTest()' array has been released
         End Sub
    
         Sub sub1()
             Dim arrTest(20000, 700) As String '<--| here memory allocation takes place for 'arrTest()' array
    
             sub2 arrTest '<--| pass 'arrTest()' array to Sub2
    
             'at exiting this sub, the 'arrTest()' memory allocation gets released
         End Sub
    
         Sub sub2(stringArray() As String)
             'here 'arrTest()' array memory allocation stays the same
    
             'code to exploit passed array
         End Sub
    
  4. 分配 内存

    站在前面的第1点,根据实际所需的数量调整数组的大小,这也是您使用动态数组而不是 static <的原因/ em>一些

    Sub sub1()
        Dim arrTest() As String
        Dim nRows As Long, ncols As Long
    
        With Worksheets("Data")
            nRows = .Cells(.Rows.Count, 1).End(xlUp).row
            ncols = .Cells(1, .Columns.Count).End(xlToLeft).Column
        End With
    
        ReDim arrTest(1 To nRows, 1 To ncols) As String '<--| here memory allocation takes place for 'arrTest()' array
    
        sub2 arrTest '<--| pass 'arrTest()' array to Sub2
    
        'at exiting this sub, the 'arrTest()' memory allocation gets released
    End Sub
    
  5. 使用工作表范围

    如果之前的所有努力都在风向标中,那么您只需使用Excel范围和尽可能多的内置函数来利用已经存储在那里的数据

    这很可能会引发性能问题,但至少它会运行......

  6. 希望这一切可以帮助你