首页 > 解决方案 > 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

谢谢

标签: excelvba

解决方案


在对 的初始调用中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)

推荐阅读