多维数组redim
Posted
技术标签:
【中文标题】多维数组redim【英文标题】:Multidimensional Array redim 【发布时间】:2018-12-12 08:22:20 【问题描述】:我再次需要一些帮助:)
我有一个值列表,对于每一行,它应该检查是否有另一行 D 和 E 列的值与当前行相同。 所以 D 列和 E 列相同的所有值都需要组合在一起。
他的部分似乎工作正常,但我想将 Pairs/groups 存储在一个多维数组中,这就是它变得棘手的地方。
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
最后,我的 Array 具有我需要的大小。唯一的问题是我的数组大小不能超过 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 Local 窗口显示 Variant(0 到 1000 和 0 到 120)。 120是拟合值,其他的应该是18,但是貌似m值没有变短。
我在 F8 中通过代码注意到的一点是它首先是 Variant(0 到 1000 和 0 到 18),然后是(0 到 1000 和 0 到 120)。所以问题似乎真的是两者之间的转置。
【问题讨论】:
你只能ReDim Preserve
最后一个维度。你最好先得到尺寸。
您好,感谢您的回复。我一直都是按这个顺序做的,有更好的吗?你能给我一个简短的例子吗?
你的数组可以达到 arr(0 to 32766, 0 to 32766)。任何一个维度都更大,您必须构建自己的转置函数。 (0 到 32,766 是一个秩中总共 32,767 个数组元素)
我是不是把你的解决方案(@user10779473 和@K.Dᴀᴠɪs)弄混了? :o
@G.M 由于您尝试更改第一个维度的大小,您会收到错误(9)。
【参考方案1】:
您可以随时重新调整数组的一个或两个等级,但如果您使用 Preserve 参数(保留先前设置的值),则只能更改最后一个等级(第二维)。
但是,您可以转置¹数组以翻转二维数组的等级,修改新的最后一个等级,然后转置以将二维数组返回到其原始形式。这将扩展或截断二维数组的“行”(第一行)。
MultiArrPaerchen(m, n) = VarBasisZeile
m = m + 1
application.transpose(MultiArrPaerchen)
ReDim Preserve MultiArrPaerchen(0 To n, 0 To m)
application.transpose(MultiArrPaerchen)
这需要时间和计算,尤其是在大循环中重复执行时。如 cmets 中所述(感谢K.Dᴀᴠɪs),最好先预测每个等级的上限(UBound)或使初始限制足够大以处理任何情况并使用单个转置/redim/减少数组循环完成后转置。
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
¹ 转置有一个有符号短整数的上限; 1.e. 32,767。如果您需要更大的换位,则必须自己编写或从本网站上的几个示例中获取一个。
【讨论】:
嘿,非常感谢,尤其是第二部分对我来说似乎很有趣(而且很聪明),所以我首先将数组设为静态(并且很大),然后在最后缩短它。所以它不是真正的“流体数组,但在 ned 中具有最小尺寸。听起来很棒,而且比我做的更快。你选择常规尺寸作为尺寸吗? 这取决于填充数组的内容。您没有提供足够的信息来冒险猜测任何初始大小。 作为一个受过教育的人,我会说 onethousand 很好,但也许选择下一个更大的数据类型大小(比如 32.767 表示整数或类似的大小)是有意义的,但它当然不是必需的 ^^ 非常感谢,它似乎工作正常。(至少没有错误)。 :D 没有任何快速的方法可以显示整个数组以查看它是否有效? 您可以像cells(1, "A").resize(ubound(arr, 1), ubound(arr, 2)) = arr
一样将二维数组转储到工作表中,或者在您使用 F8 单步执行代码时查看 VBE 的 Locals 窗口。【参考方案2】:
您可以提前获取数组的尺寸。
因此,计算行中重复出现的次数,然后设置维度。
由于不清楚您是如何使用多维数组的,因此您可以在为一维数组赋值之前设置维度(因此,根本不需要使用Preserve
)使用工作表函数:COUNTIF()
:
Dim dupeCount As Long
dupeCount = WorksheetFunction.CountIf([D:D], [E1])
ReDim MultiArrPaerchen(dupeCount - 1)
然后您可以继续使用相同的方法来获取第二维的上限 - 但我不确定您的标准,因此我无法提供示例。
【讨论】:
【参考方案3】:在 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)
【讨论】:
你试过了吗?看起来不行。以上是关于多维数组redim的主要内容,如果未能解决你的问题,请参考以下文章
C 语言数组 ( 多维数组本质 | 步长角度 理解 多维数组本质 )