Excel VBA - 查找表列中给定值的行号

ACC*_*Man 3 excel vba

背景

我不久前构建了这段代码,它可以在一个电子表格中运行。它本质上被调用来查找第一个表列中给定值的表行号。然后,其余代码使用此表行号来更新该行的值。

我最近将同样的方法应用于另一个电子表格,直到昨天它才起作用。现在,在 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)

Big*_*Ben 5

循环过于复杂。只需使用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)