下面的函数查找第一个结果。
可能存在重复的行,这些行的匹配值符合我的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
答案 0 :(得分:2)
值得注意的是,您甚至还没有初始化行,而只是让vba为您隐式地将其声明为变量类型。为避免拼写错误引起的常见问题,请在代码顶部添加Option Explicit,并在每个Dim
变量旁边加上类型。例如:Dim i as long
。 Dim 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
,然后再次将其设置为自身的转置。只是不必要的混乱。如果您要将其粘贴到图纸上并且需要将其放在一列中,则可以将其放在末尾。