背景
我不久前构建了这段代码,它可以在一个电子表格中运行。它本质上被调用来查找第一个表列中给定值的表行号。然后,其余代码使用此表行号来更新该行的值。
我最近将同样的方法应用于另一个电子表格,直到昨天它才起作用。现在,在 myArray = tbl.DataBodyRange 行上,我收到运行时错误“6”(溢出)。最近的电子表格中的表有更多的数据,因此 myArray 无法再保存表数据。
我修改了代码以使用 ListRows 搜索表行,然后检查第一列的每个值,直到找到我要查找的内容。
在这两个例程中,如果未找到该值,则返回 0,并且其他代码知道不要尝试更新表行。
问题
我是否可能会遇到修改后的方法的进一步问题和/或是否有更有效的方法来查找我正在寻找的行号。该表目前约有 700 行数据,未来几个月将增长到 4,000 多行。
出现溢出错误的代码
Function getRowNum(ByVal valueToFind As String)
Dim tbl As ListObject
Dim myArray As Variant
Dim x As Long
Dim checkvalueToFind As String
Dim rowFound As Integer
rowFound = 0
Set tbl = Range("table_masterList").ListObject
myArray = tbl.DataBodyRange
For x = LBound(myArray) To UBound(myArray)
checkvalueToFind = myArray(x, 1)
'Debug.Print checkvalueToFind
If checkvalueToFind = valueToFind Then
rowFound = x
GoTo foundIt
End If
Next x
foundIt:
Set tbl = Nothing
getRowNum = rowFound
End Function
Run Code Online (Sandbox Code Playgroud)
修订后的守则
Function getRowNum2(ByVal valueToFind As String)
Dim tbl As ListObject
Dim row As ListRow
Dim checkvalueToFind As String
Dim rowFound As Integer
rowFound = 0
Set tbl = Range("table_masterList").ListObject
For Each row In tbl.ListRows
checkvalueToFind = tbl.DataBodyRange.Cells(row.Index, 1).Value
If checkvalueToFind = valueToFind Then
rowFound = row.Index
GoTo foundIt
End If
Next row
foundIt:
Set tbl = Nothing
getRowNum2 = rowFound
End Function
Run Code Online (Sandbox Code Playgroud)
循环过于复杂。只需使用Match
:
Function getRowNum(ByVal valueToFind As String) As Long
...
Dim matchResult As Variant
matchResult = Application.Match(valueToFind, tbl.ListColumns(1).DataBodyRange, 0)
If IsError(matchResult) Then
getRowNum = 0
Else
getRowNum = matchResult
End If
End Function
Run Code Online (Sandbox Code Playgroud)
或者稍微简单一点:
Function getRowNum(ByVal valueToFind As String) As Long
...
Dim matchResult As Variant
matchResult = Application.Match(valueToFind, tbl.ListColumns(1).DataBodyRange, 0)
If Not IsError(matchResult) Then
getRowNum = matchResult
End If
End Function
Run Code Online (Sandbox Code Playgroud)