Массив из 20 000 элементов, содержащий по 4 варианта, займет менее 2 МБ ОЗУ.Я не думаю, что память имеет какое-либо отношение к вашей проблеме - если только вы не используете старый компьютер с 2 МБ ОЗУ или что-то подобное.
Более вероятная причина, по которой ваш код настолько тяжел, состоит в том, что вы перебираете ячейки.Каждый обмен данными между данными листа VBA и Excel требует значительных издержек, и это складывается, когда вы обращаетесь к нескольким ячейкам по одной за раз.В вашем случае ваш цикл делает до 200 000 отдельных ссылок на ячейки.
Вместо этого вы должны загрузить все свои данные сразу в массив Variant
, а затем перебрать этот массив, как показано ниже.Это значительно быстрее (хотя при этом используется больше памяти, а не меньше; но опять же, я не думаю, что память - это ваша проблема).
lblStatus.Caption = "Loading to memory"
Dim ArrAuditData() As AData
Dim varTemp As Variant
Dim TotalLookUpCount As Integer
' Load everything into a Variant array.
varTemp = lookUpRange
ReDim ArrAuditData(1 To UBound(varTemp, 1)) As AData
For J = 1 To UBound(varTemp, 1)
If varTemp(J, cmbChoice.ListIndex) = "Fail" Then
ArrAuditData(TotalLookUpCount).AuditType = varTemp(J, cmdAudit2.ListIndex)
ArrAuditData(TotalLookUpCount).TransTime = varTemp(J, cmbChoice.ListIndex - 1)
ArrAuditData(TotalLookUpCount).AuditValue = varTemp(J, cmbChoice.ListIndex)
ArrAuditData(TotalLookUpCount).Slno = varTemp(J, 0)
TotalLookUpCount = TotalLookUpCount + 1
ElseIf varTemp(J, cmbChoice.ListIndex) = "" And J > 4 Then
Exit For
End If
DoEvents
Next
ReDim Preserve ArrAuditData(TotalLookUpCount) As AData
Для дальнейшего чтения взгляните на эту старую, но все еще актуальную статью: http://www.avdf.com/apr98/art_ot003.html
Если вы все еще считаете, что проблема с оперативной памятью, пожалуйста, покажите нам AData
объявление типа.
РЕДАКТИРОВАТЬ : Кроме того, никогда не ReDim Preserve
внутри такого цикла!ReDim Preserve
- это очень дорогая операция, и ее редко нужно выполнять более одного раза для любого данного массива.Выполнение этого 20 000 раз замедлит ваш код.Здесь я вынимаю его из цикла и просто использую его один раз в конце, чтобы обрезать неиспользуемые элементы.(Обратите внимание, как я изначально ReDim
'отредактировал массив так, чтобы он соответствовал максимально возможному числу элементов.)