Excel VBA – 分配数组更改LBound和UBound

我在Excel中有一些非常大的数据集,我需要parsing – 在数组中执行比在工作表中循环数据更快。 将所有数据加载到数组中导致内存问题(数据集ARE很大),所以我打算将数据的子集加载到数组中,处理该数据,然后加载另一个子集。 我希望使用定义LBound和UBound的数组“function”来帮助我跟踪工作表中的位置。 但是我发现将工作表值分配给数组会改变界限。 下面的代码演示了这个问题…

Sub myTest3() Dim myRange As Range Dim myArray As Variant Dim myOffset As Long myOffset = 10 Set myRange = Worksheets("RawData").Range("A1").CurrentRegion ReDim myArray(myOffset To myRange.Rows.Count, myRange.Columns.Count) MsgBox LBound(myArray, 1) & " to " & UBound(myArray) Set myRange = myRange.Offset(myOffset, 0).Resize(myRange.Rows.Count - myOffset, myRange.Columns.Count) myArray = myRange.Value2 MsgBox LBound(myArray, 1) & " to " & UBound(myArray) End Sub 

第一个MsgBox给我“10到10931”。 第二个MsgBox给我“1到10921”。

任何想法维护数组的界限,因为我最初定义他们? 我知道在工作表中循环来完成这项任务,但这样做会很慢。

提前致谢。

在这种情况下,Excel VBA无法按照您希望的方式工作。 当你执行myArray = myRange.Value2myArray的原始内容被replace了。 Redim medarrays被扔掉了。 Excel / VBA不会查看目标,而是replace目标,或者更准确地说,它会创build一个新数组,并使myaArrayvariables指向该目标。

所以你需要更多的代码来让你到达你想要的位置。 我会考虑把代码抓住下一个块到一个单独的function,并在那里做簿记:

 Function ChunkAtOffset(rng As Range, rowsInChunk As Long, colsInChunk As Long, offsetRows As Long) As Variant ' Note: doesn't cater for the case where there are fewer than 'offsetRows' in the target Dim arr As Variant, result As Variant Dim r As Long, c As Long arr = rng.offset(offsetRows).Resize(rowsInChunk, colsInChunk).Value2 ReDim result(offsetRows To offsetRows + rowsInChunk - 1, 1 To colsInChunk) For r = 1 To rowsInChunk For c = 1 To colsInChunk result(offsetRows - 1 + r, c) = arr(r, c) Next Next ChunkAtOffset = result End Function 

如果我运行这个:

 Sub myTest4() Dim curReg As Range, ary As Variant, offset As Long With Range("A1") Set curReg = .CurrentRegion Do ary = ChunkAtOffset(.CurrentRegion, 10, .CurrentRegion.Columns.Count, offset) Debug.Print LBound(ary, 1) & " to " & UBound(ary) offset = offset + 10 Loop Until offset >= .CurrentRegion.Rows.Count End With End Sub 

…我现在得到这个:

 0 to 9 10 to 19 20 to 29