创建动态大小的数组以存储行计数器

时间:2018-11-06 18:59:18

标签: arrays excel vba

下面的函数查找第一个结果。

可能存在重复的行,这些行的匹配值符合我的if语句。我将如何创建一个数组来存储搜索功能找到的行号,以便以后可以处理数据。

如何基于for循环中找到的结果数来创建数组大小?

我假设for循环计数器将在其中发挥某种作用。假设for循环在行号56和98中找到2个匹配项,它们与我的if语句匹配:

  

array_example(counter,0)= 56
  array_example(counter,0)= 98

存储的值将是:

  

array_example(1,0)= 56
  array_example(2,0)= 98

.dolumns

1 个答案:

答案 0 :(得分:2)

值得注意的是,您甚至还没有初始化行,而只是让vba为您隐式地将其声明为变量类型。为避免拼写错误引起的常见问题,请在代码顶部添加Option Explicit,并在每个Dim变量旁边加上类型。例如:Dim i as longDim i可以使用,但是会声明为变体类型

要在VBA中初始化数组,请使用Dim row() as variant。您可以在此处使用Redim row(LboundX to UboundX)重新设置其大小,但这会将所有存储的值重置为零。要解决此问题,请使用Redim Preserve row(LBoundX to UBound X)

如果要使用2D数组,请添加逗号,然后为下一个维度Redim Preserve row(LBoundX to UBound X, LboundY to UBoundY)

加上边界

在代码的顶部,我将包括

 Dim row() as Variant
 Redim Preserve row(1 to 1)

然后在循环中,我将row = i更改为

row(Ubound(row)) = i 
Redim Preserve row(1 to Ubound(row) +1)

虽然现在有了数组,但是您在下面执行的检查将不再起作用,并且可能会因为您没有指定的索引而引发错误。相反,我建议将其从If row = "" Then更改为If Counter = 0 Then

我不确定GetRowData(row)的用途是什么,但是您可以仅通过row(i)访问每个行号。但是,值得注意的是,该行数组将具有Counter +1项,但最后一个将为空白。您可以通过在已经存在的if语句中添加一个if语句来解决此问题:

If Counter = 0 Then
    row(1) = i
Else
    ReDim Preserve row(1 To UBound(row) + 1)
    row(UBound(row)) = i
End If

Counter = Counter + 1

通过实施此更改,行应完全具有Counter个具有非空值的项目

我并不是真的建议制作一个列数组,因为更改数组大小变得更加麻烦。 Redim保留或不仅允许您更改数组的最后一个维度,因此要更改行数,您必须将数组设置为其自身的转置,然后执行redim,然后再次将其设置为自身的转置。只是不必要的混乱。如果您要将其粘贴到图纸上并且需要将其放在一列中,则可以将其放在末尾。