2016-08-31 2 views
0

Вот ситуация:Почему я бегу из памяти Уменьшая этот массив?

  • Excel 2013 (32)
  • 4Gb RAM установлен
  • Excel с использованием ~ 250MB RAM с моим проектом книги открытым
  • Не можете Dim массив строк с 20 000 * 700 (Ошибка 7, «Недостаточно памяти»)

Я не понимаю, почему это так, я экспериментировал с затемнением меньшего массива и просмотра ресурсов использование в диспетчере задач, соблюдение Excel для использования ~ 28Mb за 10 000 строк (одинаковое количество столбцов).

Если я рассматриваю (консервативно), что Excel может использовать только 1000Mb, по этой логике он должен иметь возможность обрабатывать 350 000 строк (одинаковое количество столбцов).

Что мне не хватает? Что я могу сделать по-другому?

Благодаря

EDIT: Это помещение код работает на этот простой код воссоздает проблему.

Public arrTest() As String 

Sub test() 

ReDim arrTest(20000, 700) 

End Sub 
+0

Так что же на самом деле ваш код выглядит? 'Dim arr (0 до 20000) As String'? –

+0

У меня такая же проблема при установке массива 37500 * 24 во второй раз в цикле, я просто расследую себя, поэтому я дам вам знать. Мины, использующие тип варианта для обработки установки как range.value –

+0

Спасибо, я добавил пример кода – KnowledgeQuest

ответ

0

Вы можете воспользоваться одним или несколькими из следующих методов:

  1. выделить память когда необходимо

    сделать действительно вам нужно arrTest() массив быть Public?

    Public массивы переменных выделяются как только они «размер» и оставаться там до тех пор, пока не закончится

    это означает, что каждые последующие выделения памяти принесенные вместе другими подводными лодками переменные декларации добавляются к 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, размер вашего массива для чего фактически необходимо, что также является причиной того, почему вы должны использовать динамические массивы вместо статические те

    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, и как много его встроенной функции, как вы можете использовать данные уже хранятся там

    это, скорее всего, поднять проблемы с производительностью, но при крайней мере, это работает ...

надежда все это может помочь вам

+0

@SimonMoss, вы прошли через него? – user3598756

+0

Будет ли отображаться _brave_ downvoter и дать какое-либо объяснение, чтобы оба знали, почему они не должны следовать ответу и научить меня, как его улучшить? – user3598756

Смежные вопросы