Excel VBA范围大小限制?

Excel VBA范围大小限制?,vba,excel,resize,range,Vba,Excel,Resize,Range,我使用VBA计算成对斜率,将它们存储在一个数组中,然后使用Chip Pearson的技术将数组转置到工作表上对它们进行排序。当坡度数超过65K时,我的代码失败,这在Excel 2003中是有意义的,因为行数太多。我原以为它能在Excel 2010中工作,但我似乎也有同样的问题。有人知道Resize属性或Transpose方法是否有限制吗 谢谢 Sub pairwise() Dim endrow As Long, i As Long, j As Long, s As Long Dim num As

我使用VBA计算成对斜率,将它们存储在一个数组中,然后使用Chip Pearson的技术将数组转置到工作表上对它们进行排序。当坡度数超过65K时,我的代码失败,这在Excel 2003中是有意义的,因为行数太多。我原以为它能在Excel 2010中工作,但我似乎也有同样的问题。有人知道Resize属性或Transpose方法是否有限制吗

谢谢

Sub pairwise()
Dim endrow As Long, i As Long, j As Long, s As Long
Dim num As Double, denom As Double, sij As Double
Dim r As Range
Dim slopes()

endrow = Range("A1").End(xlDown).Row
n = endrow - 1
nrd = endrow * n / 2
ReDim slopes(nrd)
Debug.Print LBound(slopes); UBound(slopes)
For i = 1 To n
For j = (i + 1) To endrow
    num = Cells(i, 2).Value - Cells(j, 2).Value
    denom = Cells(i, 1).Value - Cells(j, 1).Value
    If denom <> 0 Then
        sij = num / denom
        slopes(s) = sij
        s = s + 1
    End If
Next j
Next i

Set r = Range("C1").Resize(UBound(slopes) - LBound(slopes) + 1, 1)
    r = Application.Transpose(slopes)

    ' sort the range
    r.Sort key1:=r, order1:=xlAscending, MatchCase:=False
End Sub
Sub-pairwise()
暗尾行一样长,i一样长,j一样长,s一样长
Dim num为双精度,denom为双精度,sij为双精度
调光范围
小斜坡()
endrow=范围(“A1”)。结束(xlDown)。行
n=尾行-1
nrd=endrow*n/2
雷迪姆斜坡(nrd)
调试。打印LBound(斜率);UBound(斜坡)
对于i=1到n
对于j=(i+1)到尾行
num=单元格(i,2).Value-单元格(j,2).Value
denom=单元格(i,1).值-单元格(j,1).值
如果denom为0,则
sij=num/denom
坡度=sij
s=s+1
如果结束
下一个j
接下来我
设置r=范围(“C1”)。调整大小(UBound(坡度)-LBound(坡度)+1,1)
r=应用程序转置(斜率)
“对范围进行排序
r、 排序键1:=r,顺序1:=xlAscending,MatchCase:=False
端接头

这是
转置方法的一个限制

我的建议是从一开始就将数组声明为2D

Redim Slopes(1 To nrd, 1 To 1)

此外,您应该使用变量数组方法,而不是在
For
循环中的单元格上循环

我发现索引函数也存在同样的限制

下面是如何使输出数组成为二维数组,并一次读入所有值,而不是在循环中

Sub pairwise()

    Dim lEndRow As Long
    Dim vaValues As Variant
    Dim aSlopes() As Variant
    Dim lCnt As Long
    Dim rOutput As Range
    Dim i As Long, j As Long

    'A 2d array here can easily be written to a sheet
    lEndRow = Sheet3.Range("a1").End(xlDown).Row
    ReDim aSlopes(1 To lEndRow * (lEndRow - 1), 1 To 1)

    'Create a two-d array of all the values
    vaValues = Sheet3.Range("A1").Resize(lEndRow, 2).Value

    'Loop through the array rather than the cells
    For i = LBound(vaValues, 1) To UBound(vaValues, 1) - 1
        For j = 1 + 1 To UBound(vaValues, 1)
            If vaValues(i, 1) <> vaValues(j, 1) Then
                lCnt = lCnt + 1
                aSlopes(lCnt, 1) = (vaValues(i, 2) - vaValues(j, 2)) / (vaValues(i, 1) - vaValues(j, 1))
            End If
        Next j
    Next i

    'Output the array to a range, and sort
    Set rOutput = Sheet3.Range("C1").Resize(UBound(aSlopes, 1), UBound(aSlopes, 2))
    rOutput.Value = aSlopes
    rOutput.Sort rOutput.Cells(1), xlAscending, , , , , , , , False

End Sub
Sub-pairwise()
我和你一样长
将值作为变量
Dim aSlopes()作为变量
暗lCnt为长
变暗输出范围
我和我一样长,我和我一样长
'此处的2d数组可以轻松写入工作表
lEndRow=Sheet3.范围(“a1”).结束(xlDown).行
重划坡度(1到贷款行*(贷款行-1),1到1)
'创建一个包含所有值的二维数组
vaValues=Sheet3.范围(“A1”).调整大小(lEndRow,2).值
'循环通过数组而不是单元格
对于i=LBound(vaValues,1)到UBound(vaValues,1)-1
对于j=1+1至UBound(vaValues,1)
如果vaValues(i,1)vaValues(j,1),则
lCnt=lCnt+1
aSlopes(lCnt,1)=(vaValues(i,2)-vaValues(j,2))/(vaValues(i,1)-vaValues(j,1))
如果结束
下一个j
接下来我
'将数组输出到一个范围,然后进行排序
设置rOutput=Sheet3.范围(“C1”).调整大小(UBound(aSlopes,1),UBound(aSlopes,2))
rOutput.Value=aSlopes
rOutput.Sort rOutput.Cells(1),升序,,,,假
端接头

谢谢!所以当我使用2D数组时,代码变成
r=slopes
?你能详细介绍一下变异数组方法吗?@dick非常友好地详细介绍了这种方法,非常酷。请注意,ReDim行应该是
ReDim aSlopes(1到lEndRow*(lEndRow-1)/2,1到1)
并且,在数组中循环花费了大约45%的时间,而在单元格中循环(0.60秒对1.33秒),计算和排序65341个斜率:)这就是我最初使用ReDim的方式,但是我在数组中没有空间了。我就知道你会搞清楚细节的。:)