Excel VBA列的递归循环

Excel VBA列的递归循环,excel,vba,recursion,Excel,Vba,Recursion,有谁能解释一下,如果我可以递归地遍历For循环中的排序列表 我在一个列中循环,一旦我找到了一个精确的匹配项(比如EALOLESstring),我就想继续循环,直到没有匹配项为止。 对于内部循环来说,这一切都很好,但我只是想知道是否也可以通过递归函数来实现这一点,以及它会是什么样子?从我学习的递归示例中,我可以想象从工作簿的末尾到开头循环 注意,我并不是说这是一个更好的解决方案,也不是一个内部循环,但我只是很好奇 这不是返回排序列表中字符串的开始和停止位置的有效方法,但作为一种智力练习,应该这样

有谁能解释一下,如果我可以递归地遍历For循环中的排序列表

我在一个列中循环,一旦我找到了一个精确的匹配项(比如EALOLESstring),我就想继续循环,直到没有匹配项为止。

对于内部循环来说,这一切都很好,但我只是想知道是否也可以通过递归函数来实现这一点,以及它会是什么样子?从我学习的递归示例中,我可以想象从工作簿的末尾到开头循环


注意,我并不是说这是一个更好的解决方案,也不是一个内部循环,但我只是很好奇

这不是返回排序列表中字符串的开始和停止位置的有效方法,但作为一种智力练习,应该这样做

dim i as long, j as long

For i = 2 to UsedRange.Rows.Count
  If (Cells(i, 12).Value = "EALOLES") Then
    for j=i to UsedRange.Rows.Count
      If (Cells(j+1, 12).Value <> "EALOLES") Then
        exit for
      end if
    next j
    Exit For
  End If
next i

debug.print "start: " & i
debug.print "end: " & j
尺寸i等于长,j等于长
对于i=2,使用drange.Rows.Count
如果(单元格(i,12).Value=“EALOLES”),则
对于j=i,使用drange.Rows.Count
如果(单元格(j+1,12)。值为“EALOLES”),则
退出
如果结束
下一个j
退出
如果结束
接下来我
debug.print“开始:”&i
debug.print“结束:”&j

这不是返回排序列表中字符串的开始和停止位置的有效方法,但作为一种智力练习,应该这样做

dim i as long, j as long

For i = 2 to UsedRange.Rows.Count
  If (Cells(i, 12).Value = "EALOLES") Then
    for j=i to UsedRange.Rows.Count
      If (Cells(j+1, 12).Value <> "EALOLES") Then
        exit for
      end if
    next j
    Exit For
  End If
next i

debug.print "start: " & i
debug.print "end: " & j
尺寸i等于长,j等于长
对于i=2,使用drange.Rows.Count
如果(单元格(i,12).Value=“EALOLES”),则
对于j=i,使用drange.Rows.Count
如果(单元格(j+1,12)。值为“EALOLES”),则
退出
如果结束
下一个j
退出
如果结束
接下来我
debug.print“开始:”&i
debug.print“结束:”&j

您的问题基本上是,这是否是递归的候选者,答案是否定的。在这种情况下,使用内部循环进行迭代是更好的解决方案


阅读文章:了解何时使用每种方法。

你的问题基本上是这是递归的候选者,答案是否。在这种情况下,使用内部循环进行迭代是更好的解决方案


阅读这篇文章:学习何时使用每一个。我在思考同一主题时,有一个稍微不同的想法

定义要循环的范围。查看该值是否存在于该范围内。如果是,则从第一个匹配开始,并继续循环循环范围,直到单元格值与指定的目标字符串不同

Option Explicit

Sub StopAtEnd()

    Dim wb As Workbook
    Dim ws As Worksheet
    Dim endRow As Long

    Set wb = ThisWorkbook
    Set ws = wb.Worksheets("Sheet5")             'change as needed

    endRow = ws.Cells(ws.Rows.Count, "L").End(xlUp).Row

    Dim loopRange As Range

    Set loopRange = ws.Range("L1:L" & endRow) 'Change start row as required

    Dim currentCell As Range
    Dim targetString As String
    Dim startRow As Long

    targetString = "EALOLES"

    On Error GoTo Errhand

    startRow = Application.Match(targetString, loopRange, 0)

    Do Until ws.Range("L" & startRow) <> targetString
        Debug.Print ws.Range("L" & startRow).Address
        startRow = startRow + 1
    Loop

    Exit Sub

Errhand:

    MsgBox "Target string not found"

End Sub
选项显式
子StopAtEnd()
将wb设置为工作簿
将ws设置为工作表
暗尾行与长尾行相同
设置wb=ThisWorkbook
设置ws=wb。工作表(“Sheet5”)根据需要进行更改
endRow=ws.Cells(ws.Rows.Count,“L”).End(xlUp).Row
变暗范围作为范围
设置loopRange=ws.Range(“L1:L”和endRow)”根据需要更改起始行
小电流单元作为量程
将targetString设置为字符串
黯淡的星空如长
targetString=“EALOLES”
在错误上走错
startRow=Application.Match(targetString,loopRange,0)
直到ws.Range(“L”和startRow)targetString
Debug.Print ws.Range(“L”和startRow).Address
startRow=startRow+1
环
出口接头
错误:
MsgBox“未找到目标字符串”
端接头
向@DisplayName大声呼喊,他指出这可以写成:

Option Explicit

Sub StopAtEnd()

    Dim wb As Workbook
    Dim ws As Worksheet
    Dim endRow As Long

    Set wb = ThisWorkbook
    Set ws = wb.Worksheets("Sheet1")             'change as needed

    endRow = ws.Cells(ws.Rows.Count, "L").End(xlUp).Row

    Dim loopRange As Range

    Set loopRange = ws.Range("L1:L" & endRow) 'Change start row as required

    Dim currentCell As Range
    Dim targetString As String
    Dim startRow As Variant

    targetString = "EALOLES"

    startRow = Application.Match(targetString, loopRange, 0)

    If IsError(startRow) Then

        MsgBox "Target string not found"

    Else

        Do Until ws.Range("L" & startRow) <> targetString

            Debug.Print ws.Range("L" & startRow).Address
            startRow = startRow + 1

        Loop

   End If

End Sub
选项显式
子StopAtEnd()
将wb设置为工作簿
将ws设置为工作表
暗尾行与长尾行相同
设置wb=ThisWorkbook
设置ws=wb。工作表(“Sheet1”)根据需要进行更改
endRow=ws.Cells(ws.Rows.Count,“L”).End(xlUp).Row
变暗范围作为范围
设置loopRange=ws.Range(“L1:L”和endRow)”根据需要更改起始行
小电流单元作为量程
将targetString设置为字符串
Dim startRow作为变体
targetString=“EALOLES”
startRow=Application.Match(targetString,loopRange,0)
如果是IsError(startRow),那么
MsgBox“未找到目标字符串”
其他的
直到ws.Range(“L”和startRow)targetString
Debug.Print ws.Range(“L”和startRow).Address
startRow=startRow+1
环
如果结束
端接头

对于同一主题,我的思考方式略有不同

定义要循环的范围。查看该值是否存在于该范围内。如果是,则从第一个匹配开始,并继续循环循环范围,直到单元格值与指定的目标字符串不同

Option Explicit

Sub StopAtEnd()

    Dim wb As Workbook
    Dim ws As Worksheet
    Dim endRow As Long

    Set wb = ThisWorkbook
    Set ws = wb.Worksheets("Sheet5")             'change as needed

    endRow = ws.Cells(ws.Rows.Count, "L").End(xlUp).Row

    Dim loopRange As Range

    Set loopRange = ws.Range("L1:L" & endRow) 'Change start row as required

    Dim currentCell As Range
    Dim targetString As String
    Dim startRow As Long

    targetString = "EALOLES"

    On Error GoTo Errhand

    startRow = Application.Match(targetString, loopRange, 0)

    Do Until ws.Range("L" & startRow) <> targetString
        Debug.Print ws.Range("L" & startRow).Address
        startRow = startRow + 1
    Loop

    Exit Sub

Errhand:

    MsgBox "Target string not found"

End Sub
选项显式
子StopAtEnd()
将wb设置为工作簿
将ws设置为工作表
暗尾行与长尾行相同
设置wb=ThisWorkbook
设置ws=wb。工作表(“Sheet5”)根据需要进行更改
endRow=ws.Cells(ws.Rows.Count,“L”).End(xlUp).Row
变暗范围作为范围
设置loopRange=ws.Range(“L1:L”和endRow)”根据需要更改起始行
小电流单元作为量程
将targetString设置为字符串
黯淡的星空如长
targetString=“EALOLES”
在错误上走错
startRow=Application.Match(targetString,loopRange,0)
直到ws.Range(“L”和startRow)targetString
Debug.Print ws.Range(“L”和startRow).Address
startRow=startRow+1
环
出口接头
错误:
MsgBox“未找到目标字符串”
端接头
向@DisplayName大声呼喊,他指出这可以写成:

Option Explicit

Sub StopAtEnd()

    Dim wb As Workbook
    Dim ws As Worksheet
    Dim endRow As Long

    Set wb = ThisWorkbook
    Set ws = wb.Worksheets("Sheet1")             'change as needed

    endRow = ws.Cells(ws.Rows.Count, "L").End(xlUp).Row

    Dim loopRange As Range

    Set loopRange = ws.Range("L1:L" & endRow) 'Change start row as required

    Dim currentCell As Range
    Dim targetString As String
    Dim startRow As Variant

    targetString = "EALOLES"

    startRow = Application.Match(targetString, loopRange, 0)

    If IsError(startRow) Then

        MsgBox "Target string not found"

    Else

        Do Until ws.Range("L" & startRow) <> targetString

            Debug.Print ws.Range("L" & startRow).Address
            startRow = startRow + 1

        Loop

   End If

End Sub
选项显式
子StopAtEnd()
将wb设置为工作簿
将ws设置为工作表
暗尾行与长尾行相同
设置wb=ThisWorkbook
设置ws=wb。工作表(“Sheet1”)根据需要进行更改
endRow=ws.Cells(ws.Rows.Count,“L”).End(xlUp).Row
变暗范围作为范围
设置loopRange=ws.Range(“L1:L”和endRow)”根据需要更改起始行
小电流单元作为量程
将targetString设置为字符串
Dim startRow作为变体
targetString=“EALOLES”
startRow=Application.Match(targetString,loopRange,0)
如果是IsError(startRow),那么
MsgBox“未找到目标字符串”
其他的
直到ws.Range(“L”和startRow)targetString
Debug.Print ws.Range(“L”和startRow).Address
startRow=startRow+1
环
如果结束
端接头

假设您的数据已排序,您可以选择ad