Arrays 多维数组redim

Arrays 多维数组redim,arrays,excel,vba,multidimensional-array,Arrays,Excel,Vba,Multidimensional Array,我再次需要一些帮助:) 我有一个值列表,对于每一行,它应该检查是否有另一行,其中D列和E列的值与当前行的值相同。 因此,D列和E列相同的所有值都需要分组在一起 他的角色似乎工作得很好,但我想将这些对/组存储在多维数组中,这就是需要技巧的地方 MultiArrPaerchen(m, n) = VarBasisZeile m = m + 1 ReDim Preserve MultiArrPaerchen(0 To m, 0 To n) 这应该是代码的重要部分。应添加一个新值,然后放大并重新分配

我再次需要一些帮助:)

我有一个值列表,对于每一行,它应该检查是否有另一行,其中D列和E列的值与当前行的值相同。 因此,D列和E列相同的所有值都需要分组在一起

他的角色似乎工作得很好,但我想将这些对/组存储在多维数组中,这就是需要技巧的地方

MultiArrPaerchen(m, n) = VarBasisZeile 
m = m + 1 
ReDim Preserve MultiArrPaerchen(0 To m, 0 To n)
这应该是代码的重要部分。应添加一个新值,然后放大并重新分配数组。错误本身发生在最后一行。 有什么想法吗?这是我第一次使用多维数组,所以很可能是我在这里犯了一个错误

事先多谢


为了确保我正确理解@user10779473所说的话:

ReDim MultiArrPaerchen(0 To 1000, 0 To 1000)

'The arrays gets filled and with every new value m or n increases when necessary

ReDim Preserve MultiArrPaerchen(0 To m, 0 To n)
Application.Transpose (MultiArrPaerchen)
ReDim Preserve MultiArrPaerchen(0 To n, 0 To m)
Application.Transpose (MultiArrPaerchen)

End Sub
最后,我的数组正好达到了我需要的大小。唯一的问题是我的排列不能超过1000


在尝试了上面的版本之后,我仍然在第一个版本中得到相同的错误(9)

ReDim Preserve MultiArrPaerchen(0 To m, 0 To n)
线路。在这一点上,m是120,n是18,所以我假设是正则的,拟合的数字

非常感谢,到目前为止,这对我来说是一个伟大的新知识:)


有效:D或至少一半^^ 可能是转置错误

这是当前代码:

ReDim Preserve MultiArrPaerchen(LBound(MultiArrPaerchen, 1) To UBound(MultiArrPaerchen, 1), LBound(MultiArrPaerchen, 2) To n)
Application.Transpose (MultiArrPaerchen)
ReDim Preserve MultiArrPaerchen(LBound(MultiArrPaerchen, 1) To UBound(MultiArrPaerchen, 1), LBound(MultiArrPaerchen, 2) To m)
Application.Transpose (MultiArrPaerchen)
VBA本地窗口显示变量(0到1000和0到120)。 120是拟合值,oher的值应该是18,但m值似乎没有变短


在代码中使用F8时,我注意到它是第一个变量(0到1000和0到18),然后是(0到1000和0到120)。因此,问题似乎真的是介于两者之间的转置。

您可以随时重拨数组的任一列或两个列,但如果使用保留参数(保留先前设置的值),则只能更改最后一个列(第二维)

但是,您可以对数组进行转置,以翻转二维数组的秩,修改新的最后一个秩,然后进行转置,以将二维数组返回其原始形式。这将扩展或截断二维数组的“行”(第一列)

MultiArrPaerchen(m, n) = VarBasisZeile 
m = m + 1 
application.transpose(MultiArrPaerchen)
ReDim Preserve MultiArrPaerchen(0 To n, 0 To m)
application.transpose(MultiArrPaerchen)
这需要时间和计算,尤其是在大循环中重复执行时。如评论中所述(谢谢),最好先预测每个等级的上限(UBound),或使初始限制足够大,足以处理任何情况,并在循环完成后使用单个转置/重拨/转置减少数组

这将修复您最近添加的问题

dim m as long, n as long
ReDim MultiArrPaerchen(0 To 1000, 0 To 1000)
m = 0
n = 0

for each something in something else
    if some condition then 
        MultiArrPaerchen(m, n) = something
        m = m + 1
        n = n + 1
    end if
next something

'm is now 199, n is now 255

ReDim Preserve MultiArrPaerchen(lbound(MultiArrPaerchen, 1) To ubound(MultiArrPaerchen, 1), lbound(MultiArrPaerchen, 2) To n)
Application.Transpose (MultiArrPaerchen)
ReDim Preserve MultiArrPaerchen(lbound(MultiArrPaerchen, 1) To ubound(MultiArrPaerchen, 1), lbound(MultiArrPaerchen, 2) To m)
Application.Transpose (MultiArrPaerchen)

debug.print lbound(MultiArrPaerchen, 1) & ":" & ubound(MultiArrPaerchen, 1)
debug.print lbound(MultiArrPaerchen, 2)& ":" & ubound(MultiArrPaerchen, 2)

'result in Immediate window
0:199
0:255


1转置的上限为有符号短整数;1.e。32,767. 如果您需要更大的换位,您必须编写自己的换位或从本网站的几个示例中获取换位。

在VBA中,您只能更改数组中最后一个维度的大小

由于
MultiArrPaerchen(m,n)
是二维数组,因此
m
的大小无法更改

使用
transpose
功能将第一个维度移动到第二个维度,然后使用
redim
更改大小

dim MultiArrPaerchen as variant

MultiArrPaerchen = Application.Transpose(VarBasisZeile) 
ReDim Preserve MultiArrPaerchen(lbound(MultiArrPaerchen, 1) to ubound(MultiArrPaerchen, 1), lbound(MultiArrPaerchen,2) to ubound(MultiArrPaerchen, 2) + 1)

您可以预先获取阵列的尺寸

因此,计算行中重复出现的次数,然后设置尺寸

由于不清楚您是如何使用多维数组的,下面介绍如何使用工作表函数:
COUNTIF()
,在为一维数组赋值之前设置其维度(因此,根本不需要使用
Preserve
):


然后,您可以使用相同的方法获得第二维度的上边界-但我不确定您的标准,因此无法提供示例。

您只能
ReDim保留上一维度。你最好先得到尺寸。嗨,谢谢你的回复。我总是按这个顺序做,有更好的吗?你能给我一个简单的例子吗?你的数组可以达到arr(0到32766,0到32766)。在任何一个维度上,任何更大的东西,你都必须建立你自己的转置函数。(0到32766是一个列组中的32767个数组元素的总和)我是否混淆了您(@user10779473和@K.D)的解决方案ᴀᴠɪs)由exident?提供:o@G.M由于尝试更改第一个维度的大小,因此出现错误(9)。是否尝试了此操作?它看起来好像不起作用。嘿,非常感谢,尤其是第二部分对我来说似乎很有趣(也很聪明),所以我首先将数组设置为静态的(大的),然后在最后将其缩短。所以这不是真的“流体阵列,但同时具有最小尺寸。听起来很棒,比我做的快多了。是否选择常规大小作为大小?这取决于填充数组的内容。您没有提供足够的信息来冒险猜测任何初始大小。作为一名受过教育的来宾,我想说大约1小时是可以的,但选择下一个更大的数据类型大小(如整数或类似的大小为32.767)可能是有意义的,但这当然不是必需的^^^谢谢,它似乎工作正常。(至少没有错误)。:D没有任何快速的方法显示整个数组以查看它是否在那里工作?您可以将二维数组转储回工作表,如
单元格(1,“A”)。调整大小(ubound(arr,1),ubound(arr,2))=arr
,或者在使用F8单步执行代码时查看VBE的“局部变量”窗口。
Dim dupeCount As Long
dupeCount = WorksheetFunction.CountIf([D:D], [E1])
ReDim MultiArrPaerchen(dupeCount - 1)