excel - FindNext 在使用“Do Loop while”循环时不更新 Range.Address
问题描述
我要做的是在一系列单元格中查找“DESC”,从 A1 到我工作簿的“摘要”工作表中最后使用的列。一旦代码找到搜索到的值,它将检查它是 DESC 还是 TERMDESC。
'Gets Column Letter from Column Index
Dim vArr
Dim ColLetter As String
vArr = Split(Cells(1, Lastcolumn).Address(True, False), "$")
ColLetter = vArr(0) ' -->Column NA
'Loop begins
Dim cell As Range
Dim firstCellAddress as string
Dim DescMaxNumber As Integer
Dim TermDescMaxNumber As Integer
Dim ModString as string
Dim ModNumber as integer
DescMaxNumber = 0
TermDescMaxNumber = 0
Set cell = ThisWorkbook.Worksheets("Summary").Range("A1:" & ColLetter & "1").Find("DESC", LookIn:=xlValues)
If cell Is Nothing Then
MsgBox "Not Found"
Exit Sub
End If
然后代码将检查最后两个字母是否有整数(例如 DESCA01,字符串 01 是整数),如果将其存储在 DescMaxNumber 或 TermDescMaxNumber 上。
firstCellAddress = cell.Address
'Find all cells containing DESC including TERMDESC and max numeric value
Do
SearchString = cell.Value
'Determines if SearchString is DESC or TermDESC *BEGINNING*
If InStr(1, SearchString, "DESC") = 1 Then
ModString = Right(SearchString, 2)
If IsNumeric(ModString) = True Then
ModNumber = CInt(ModString)
If DescMaxNumber < ModNumber Then
DescMaxNumber = ModNumber
End If
End If
ElseIf InStr(1, SearchString, "TERMDESC") = 1 Then
ModString = Right(SearchString, 2)
If IsNumeric(ModString) = True Then
ModNumber = CInt(ModString)
If TermDescMaxNumber < ModNumber Then
TermDescMaxNumber = ModNumber
End If
End If
End If
Set cell = Range("A1:" & ColLetter & "1").FindNext(cell)
Loop While firstCellAddress <> cell.Address
MsgBox "DESC Max Number = " & DescMaxNumber
MsgBox "TERMDESC Max Number = " & TermDescMaxNumber
之后,它应该移动到值为 DESC 的下一个单元格。这就是我的问题所在:我第一次运行代码时,它循环遍历所有包含 DESC(D1、E1、F1 等)的单元格,它告诉我 DescMaxNumber 等于 34,而 TermDescMaxNumber 等于 36。
如果我再次运行代码 DexcMaxNumber = 0 和 TermDescMaxNumber = 0,进入代码我注意到 cell.address 不会从 D1 更改为 E1,它只是停留在 D1
谢谢
解决方案
在对 的初始调用中Find
,指定我们正在搜索的范围在Summary
存储此代码的工作簿中调用的工作表上:
Set cell = ThisWorkbook.Worksheets("Summary").Range("A1:" & ColLetter & "1").Find("DESC", LookIn:=xlValues)
在对 的调用中FindNext
,没有指定工作表,因此我们要搜索的范围位于活动工作簿(可能是也可能不是此工作簿所在的工作簿)中的活动工作表(可能是也可能不是名为“摘要”的工作表)上代码存储):
Set cell = Range("A1:" & ColLetter & "1").FindNext(cell)
要解决此问题,您只需在调用中指定工作表即可FindNext
:
Set cell = ThisWorkbook.Worksheets("Summary").Range("A1:" & ColLetter & "1").FindNext(cell)
但如果您使用变量来存储要搜索的范围,然后只引用该变量,它可以使您的代码不易出错:
Dim rngToSearch As Range
Set rngToSearch = ThisWorkbook.Worksheets("Summary").Range("A1:" & ColLetter & "1")
Set cell = rngToSearch.Find("DESC", LookIn:=xlValues)
' do stuff with cell
Set cell = rngToSearch.FindNext(cell)
推荐阅读
- groovy - groovy 从 csv 转换为 json
- testng - 随机化类TestNG xml
- scipy - Scipy laplace scaling
- javascript - Javascript element.scrollleft 不能处理小数
- javascript - this.$pop 的含义
- php - 由于“结论:删除学说/变形器 2.0.3”,无法安装“laravel-apidoc-generator”
- javascript - 在反应中操作和保存本地Json文件
- c# - Unity 随机游戏对象从键中生成
- javascript - 节点`https.get`返回403,`axios.get`和`curl`返回200
- python - 在 Django 中服务多个 Web 请求