获取数组vba的每个子数组的长度

时间:2014-11-06 02:54:59

标签: arrays vba

我有输入数组{{1,4},{1,3},{1,4,7}}

Dim array1() As Long
ReDim array1(3, 3)
array1(1, 1) = 1
array1(1, 2) = 4
array1(2, 1) = 1
array1(2, 2) = 3
array1(3, 1) = 1
array1(3, 2) = 4
array1(3, 3) = 7

我想要输出数组(每个子数组的长度){2,2,3} 我正在考虑使用for循环

Dim i As Long
i = UBound(array1, 1)

Dim outputarray() As Long
ReDim outputarray(i) As Long
For j = 1 To i
    outputarray(i) = UBound(array1(i), 2)   'ERROR APPEAR
Next j

我添加了Option Base 1

2 个答案:

答案 0 :(得分:3)

每个子阵列的长度保持不变,在你的情况下总是3。您的redim定义了您想要获得的数字。所以试图像你想要的那样检索它是没有意义的。

您不在

中移动任何值
array1(1, 3)
array1(2, 3)

不会影响数组的尺寸。你会在这些你认为空的数组的单元格中找到值,并且它将为0,因为你声明你的数组很长。如果您已将其声明为字符串,则会在其中找到空白字符串,既不为null也不为“无”。

您有输入数组{{1,4,0​​},{1,3,0},{1,4,7}}

如果您的目标是找到数组中的哪些元素为0,因为您没有移动任何内容,那么这是另一个与数组长度无关的故事。

答案 1 :(得分:2)

我同意Thomas'回答上面。

如果您确实发现自己对了解阵列中已填充数组值的数量感兴趣,可以考虑以下事项:

  • 从第一行开始,以及该数组中的最右侧值。所以你的for循环实际上是两个循环 - 一个循环通过第一个维度,一个循环通过第二个维度。
  • 向左移动数组,直到遇到非零值。保持总值为零的计数。当您遇到非零值时,从数组的第二维中减去总零值。这将给你"长度"你以前在寻找。

例如:

Dim i As int
Dim j As int
Dim h As int
Dim w As int
h = UBound(array1, 1)
w = UBound(array1, 2)
Dim rowVals as int
Dim arrVals as int

For i = 0 To h
    rowVals = 0
    For j = w to 0 Step -1

        if array1(i,j) = 0 Then
            exit for
        else
            rowVals = rowVals + 1
        end if
    Next
    arrVals = arrVals + rowVals
Next