【问题标题】:VBA Redim PreserveVBA Redim 保留
【发布时间】:2017-02-15 18:50:56
【问题描述】:

我不知道如何填充多维数组。这是我刚开始理解的代码,但我不知道出了什么问题,除了一个循环之外它不起作用。

Sub test()
    Dim Arr1 As Variant
    Dim Row As Long
    For Row = 0 To 3            
        ReDim Arr1(9, Row)
        Arr1(0, Row) = "Zero"
        Arr1(1, Row) = "One"
        Arr1(2, Row) = "Two"
        Arr1(3, Row) = "Three"
        Arr1(4, Row) = "Four"
        Arr1(5, Row) = "Five"
        Arr1(6, Row) = "Six"
        Arr1(7, Row) = "Seven"
        Arr1(8, Row) = "Eight"
        Arr1(9, Row) = "Nine"    
        Row = Row + 1
        ReDim Preserve Arr1(9, Row)        
    Next Row
    MsgBox Arr1(0, 0)
End Sub

谢谢

【问题讨论】:

  • 第一个redim在for里面???
  • 这些将是您放入数组中的硬编码值(即问题中的代码只是一个 MCVE,还是实际上是您想要使用的数据)?或者您要设置工作表中某个范围内的值?还是它们是计算值?

标签: arrays vba excel multidimensional-array


【解决方案1】:

范围可用于重复它们而无需循环:

Dim r As Range, Arr1
Set r = Cells.Resize(10, 4)

r = [{"Zero";"One";"Two";"Three";"Four";"Five";"Six";"Seven";"Eight";"Nine"}]     
Arr1 = r           ' Arr1 is now (1 To 10, 1 To 4) As Variant
r.ClearContents

【讨论】:

  • 巫术!.. 不错的答案
  • 巫术?几乎不。精美优雅 - 是的:)
【解决方案2】:

试试这个:

Sub test()
    Dim limit As Integer
    limit = 3 'get limit from somewhere

    Dim Arr1 as Variant        
    Redim Arr1(0 To 9, 0 To limit) As Variant

    Dim Row As Long
    For Row = 0 To 3            
        Arr1(0, Row) = "Zero"
        Arr1(1, Row) = "One"
        Arr1(2, Row) = "Two"
        Arr1(3, Row) = "Three"
        Arr1(4, Row) = "Four"
        Arr1(5, Row) = "Five"
        Arr1(6, Row) = "Six"
        Arr1(7, Row) = "Seven"
        Arr1(8, Row) = "Eight"
        Arr1(9, Row) = "Nine"        
    Next Row
    MsgBox Arr1(0, 0)
End Sub

您已经知道您希望阵列具有的限制,因此只需在开始时定义限制。您无需再重新定义这些。

另外,Next RowRow=Row+1 做同样的事情,所以你不想要两者

更新

如果你喜欢你也可以把你的字符串放在一个数组中

Sub test()
    Dim limit As Integer
    limit = 3 'get limit from somewhere

    Dim Arr1 as Variant        
    Redim Arr1(0 To 9, 0 To limit) As Variant

    Dim numbers As Variant
    numbers = Array("Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine")

    Dim Row As Integer, Col As Integer
    For Row = 0 To 3
        For Col = 0 To 9
            Arr1(Col, Row) = numbers(Col)
        Next Col
    Next Row
    MsgBox Arr1(0, 0)
End Sub

更新 2

真的有很多方法可以给猫剥皮......使用集合怎么样:

Sub test()
    Dim numbers As Variant
    numbers = Array("Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine")

    Dim col As Collection
    Set col = New Collection

    Dim i As Integer
    For i = 0 To 3 'get limit from somewhere
        col.Add numbers
    Next i

    MsgBox col(1)(0)  'col(1 to 4)(0 to 9)
End Sub

【讨论】:

  • 实际上第 +1 行会使迭代缩短 2 步
  • 谢谢 - 我没有解释清楚!
  • 您好,谢谢,但是第二维 0 到 3 不是固定的,它是动态的,我该如何更改它?
  • 没问题,我更新了代码。获取代码开头的限制,这将更新数组的大小
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多