excel - 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
修订代码
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
解决方案
循环过于复杂。只需使用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
或者稍微简单一点:
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
推荐阅读
- visual-studio - Visual Studio 2019:EditorConfig 不适用于某些项目
- java - 使用 mapbox 搜索时如何获取起点和终点
- python - 如何以整数值作为列名对熊猫数据框进行切片
- android - 如何在 Android Studio 的 RecyclerView 中更改图像?
- javascript - 如何在 Reactjs 的列表中调用按钮单击
- clickhouse - 在 clickhouse 中枢轴
- java - 如何在android studio中使用液体滑动?
- javascript - 在 Spark AR Studio 中有延迟的人脸跟踪器的父对象?
- html - html 两个相邻且高度相等的 span 元素
- autodesk - Model Derivative API:桶的范围是什么?