Arrays 使用范围VBA填充数组

Arrays 使用范围VBA填充数组,arrays,excel,range,vba,Arrays,Excel,Range,Vba,我的工作是在工作中修复假日电子表格,该文档的问题是有直接引用、间接引用其他工作表和一些未引用的部分,因此如果你想让人们按不同的顺序排列,它会把整个事情搞砸。所以,我一直在尝试用人名填充一个数组,对数组进行排序,然后与原始数组交叉引用,找到一个新的顺序,这样新的顺序就可以在整个工作表中实现,而不会把事情搞砸 问题是我似乎无法填充数组,我已经在这里查看了其他答案,但我确信我正确使用了redim,这往往是问题所在 所以Previous是原始列表,Current是排序列表,Position是将Previ

我的工作是在工作中修复假日电子表格,该文档的问题是有直接引用、间接引用其他工作表和一些未引用的部分,因此如果你想让人们按不同的顺序排列,它会把整个事情搞砸。所以,我一直在尝试用人名填充一个数组,对数组进行排序,然后与原始数组交叉引用,找到一个新的顺序,这样新的顺序就可以在整个工作表中实现,而不会把事情搞砸

问题是我似乎无法填充数组,我已经在这里查看了其他答案,但我确信我正确使用了redim,这往往是问题所在

所以Previous是原始列表,Current是排序列表,Position是将Previous与Current关联起来的数字

Sub Sorting()

Dim Previous() As Variant
Dim Current() As Variant
Dim maxrow As Long
Dim i As Long
Dim j As Long
Dim k As Long
Dim Position() As Long
Dim rng As Range
Dim strTemp As String

k = 0
i = 3
maxrow = 3

Do While Worksheets(1).Cells(i, 1).Value <> "STAT.HOL'S (ST)"
maxrow = maxrow + 1
i = i + 1
Loop
maxrow = maxrow - 1

ReDim Previous(0 To maxrow)
ReDim Position(0 To maxrow)
ReDim Current(0 To maxrow)
Previous = Range("a4", Range("a" & maxrow))
Current = Previous
For i = 0 To maxrow
For j = 0 To maxrow
If Current(i) > Current(j) Then
strTemp = Current(i)
Current(i) = Current(j)
Current(j) = strTemp
End If
Next j
Next i

For i = 0 To maxrow
For j = 0 To maxrow

If Previous(i) = Current(j).Value Then
Position(k) = j
k = k + 1
End If

Next j
Next i

End Sub
子排序()
Dim Previous()作为变量
Dim Current()作为变量
Dim maxrow尽可能长
我想我会坚持多久
Dim j尽可能长
暗k一样长
变暗位置()的长度相同
变暗rng As范围
将strTemp设置为字符串
k=0
i=3
maxrow=3
Do While工作表(1)。单元格(i,1)。值“STAT.HOL'S(ST)”
maxrow=maxrow+1
i=i+1
环
maxrow=maxrow-1
上一次重拨(0到maxrow)
重拨位置(0至最大行)
重拨当前(0至最大行)
上一个=范围(“a4”,范围(“a”和maxrow))
当前=以前
对于i=0到maxrow
对于j=0到maxrow
如果电流(i)>电流(j),则
strTemp=电流(i)
电流(i)=电流(j)
电流(j)=strTemp
如果结束
下一个j
接下来我
对于i=0到maxrow
对于j=0到maxrow
如果前一个(i)=当前(j).值,则
位置(k)=j
k=k+1
如果结束
下一个j
接下来我
端接头
谢谢你的帮助。
Amy

Excel范围始终被视为具有两个维度,即使它们是单个列。 此外,您不需要重新定义变量数组-只需将范围分配给普通变量,它将创建一个包含二维数组的变量:

Dim Previous as variant
Previous = Range("a4:a" & maxrow)

您确实填充了数组,但处理它们的方式不对

将范围指定给阵列时,阵列将自动重新定尺寸为二维阵列,一个用于行,一个用于列

由于范围仅为一列,因此第二维度始终为1。因此,在运行行
Previous=Range(“a4”,Range(“a”&maxrow))
之后,就有了一个数组,其尺寸如下:

Previous(1 to 10, 1 To 1)
此外,您的For循环可以更改为以下内容:

For i = LBound(Current, 1) To UBound(Current, 1)

Next i

你的分拣工作顺利吗?如果没有,请参阅此了解其他方法。此外,考虑缩进代码,它将更容易阅读。当您将数组分配给以前的尝试时,添加<代码>值>代码>结束。同样,在
范围(“a4”)内,
不需要将第二部分声明为单独的范围<代码>范围(“a4”、“a”和maxrow)。值。不,我的排序不起作用,我想让第一部分先工作。我确实缩进了我的工作,但这只是一些初步的代码。谢谢你的提示,我设法让它工作了。