【问题标题】:Add single value to a multidimensional array vba and then redim将单个值添加到多维数组 vba 然后 redim
【发布时间】:2014-06-11 21:49:36
【问题描述】:

我在尝试填充多维变量数组时遇到了一些问题。我想要做的是向数组中的第 1 行第 1 列添加一个值。但是下面的代码不起作用。

Dim arr() As Variant
arr(1,1) = 3

在此基础上,我希望在满足某些条件时向数组添加更多值。例如

 For c = 2 To 10001
        Sheets("Data").Select
        If Range("P" & c) = branch And Range("Q" & c) = dept And Range("R" & c) = subdept Then
            arr(UBound(arr) + 1, 1) = Range("A" & c)
        End If
    Next c

在循环完成并且我已经完成提取我希望将其重新调整为可变长度数组之后的值之后。不过,

Redim arr()

也无法正常工作。另外,我应该指出,我并不真正需要数组是多维的,只是大小可变。话虽如此,我不知道在 VBA 中创建一维动态数组的方法。

总结

1) 为什么 arr(1,1) 会抛出错误?

2) 为什么 Redim arr() 会抛出错误? (我不想调整为固定大小)

3) 有没有办法在 VBA 中创建动态一维数组?

注意:我想我可以声明一个 1D 100 长度的数组,然后我可以操作它来计算其中填充值的数量并将其重新调整为(0 到 100),但首先希望探索是否有任何答案回答我的上述问题。

非常感谢。

更新:(我的第二次尝试:仍然在 arr(arrLen, 1) = Range("A" & c)) 上失败

 arrLen = 1

    For c = 2 To 10001
        Sheets("Data").Select
        If Range("P" & c) = branch And Range("Q" & c) = dept And Range("R" & c) = subdept Then
            ReDim Preserve arr(arrLen To 1)
            arr(arrLen, 1) = Range("A" & c)
            arrLen = arrLen + 1
        End If
    Next c

【问题讨论】:

  • VBA 数组不是“动态的”——它们不会随着您添加新元素而增长:您总是需要使用 ReDim [Preserve] 显式调整它们的大小,并且您只能更改多维数组中的最后一个维度使用Preserve 时的维度数组。 patorjk.com/programming/tutorials/vbarrays.htm
  • 感谢蒂姆澄清这一点。希望避免将 Redim Perserve 放入我的循环中,因为它会极大地减慢一切(这个循环又会循环大约 200 次)。哦,好吧,无论如何都要休息一下......

标签: arrays vba dynamic-arrays


【解决方案1】:

下面的工作代码。

Option Base 1

Dim arr() as string
    arrLen = 1

    For c = 2 To 10001
        Sheets("Data").Select
        If Range("P" & c) = branch And Range("Q" & c) = dept And Range("R" & c) = subdept Then
            ReDim Preserve arr(1 To arrLen)
            arr(arrLen) = Range("A" & c)
            arrLen = arrLen + 1
        End If
    Next c

【讨论】:

  • 我以为您想避免将您的ReDim 放入循环中?你可以把它放在循环之外,就像我在之前接受的答案中所做的那样......好奇为什么这是优越的?
【解决方案2】:

两个原因。

  • 您的数组只有一维,而不是二维
  • 你的逻辑应该是1 To arrLen 而不是arrLen to 1

重新剪辑

ReDim Preserve arr(1 To arrLen)
arr(arrLen) = Range("A" & c)
arrLen = arrLen + 1

【讨论】:

  • 谢谢。最初我已经将我的数组声明为一个变体。这不是多维吗? (如果我错了,请原谅我)
  • @Chris 如果你 Dim arr() As Variant可以是单维或多维的,但这在赋值语句之前不会发生。因此,如果您执行arr = Array("1", "2", "3"),它将是一维的,但如果您执行arr = Range("A1:D6").Value,它将是多维的。但它也不是,直到它被分配。
【解决方案3】:

因为您处理的是固定范围(单元格 2 到 10001) - 甚至是动态范围,实际上 - 您可以避免将 ReDim 放入循环中。

ReDim arr(1 to 10001)
For c = 2 To 10001
    Sheets("Data").Select
    If Range("P" & c) = branch And Range("Q" & c) = dept And Range("R" & c) = subdept Then
        arr(arrLen) = Range("A" & c)
        arrLen = arrLen + 1
    End If
Next c
ReDim Preserve arr(1 to arrLen)

这应该会加快你的表现。因此,首先,考虑到For 循环的已知迭代,您要使数组尽可能 需要。然后你处理你的数据,把它放到数组中,在循环结束后,你 ReDim 它返回 down 以摆脱空元素。

【讨论】:

  • 酷。将按照建议进行。
  • 另外两个中的一个可能应该是公认的答案,因为它们首先解决了原始问题。我这里只是尝试优化它以避免不必要的ReDim
  • 虽然,要计算其中使用的元素的值,Ubound(arr) 不会给我 10001 而不是说 35?那么如何回避这个问题呢?
  • 抱歉,忽略之前的评论。错过了最后一行代码。
猜你喜欢
  • 2020-06-06
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
  • 2014-09-25
相关资源
最近更新 更多