多维数组重做

时间:2018-12-12 08:22:20

标签: arrays excel vba excel-vba multidimensional-array

再次,我需要一些帮助:)

我有一个值列表,并且对于每一行,它应该检查是否还有另一行,其中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

最后,我的数组的大小恰好是我需要的大小。唯一的问题是我的arraysize不能超过1000?


尝试上述版本后,我仍然在第一个

上遇到相同的错误(9)

ReDim保留MultiArrPaerchen(0到m,0到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是合适的值,其他应为18,但看起来m值并没有缩短。

通过代码通知的所有内容是,它首先是Variant(0到1000和0到18),然后是(0到1000和0到120)。因此,问题实际上似乎是两者之间的转置。

3 个答案:

答案 0 :(得分:1)

您可以随时重新定义数组的一个或两个秩,但是如果使用 Preserve 参数(保留先前设置的值),则只能更改最后一个秩(第二维)。

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

MultiArrPaerchen(m, n) = VarBasisZeile 
m = m + 1 
application.transpose(MultiArrPaerchen)
ReDim Preserve MultiArrPaerchen(0 To n, 0 To m)
application.transpose(MultiArrPaerchen)

这需要时间和计算,尤其是在大循环中重复执行时。如评论中所述(感谢K.Dᴀᴠɪs),最好先预测每个等级的上限(UBound),或者使初始限制足够大以应对任何情况,并通过单个转置/循环完成后,请重新调整/转置。

Addendum

这将解决您最近添加的问题。

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

¹ Transpose的有符号短整数的上限; 1.e. 32,767。如果需要更大的换位,则必须自己编写或从此站点上的几个示例中获得一个。

答案 1 :(得分:0)

在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)

答案 2 :(得分:0)

您可以获取数组 upfront 的尺寸。

因此,计算行中重复项发生的次数,然后设置尺寸。

由于尚不清楚如何使用多维数组,因此可以在分配值之前在1-D数组上设置尺寸(因此,无需使用Preserve全部)使用工作表功能:COUNTIF()

Dim dupeCount As Long
dupeCount = WorksheetFunction.CountIf([D:D], [E1])
ReDim MultiArrPaerchen(dupeCount - 1)

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