【问题标题】:How do I use Find and FindNext within another If Then statement?如何在另一个 If Then 语句中使用 Find 和 FindNext?
【发布时间】:2020-08-31 18:42:25
【问题描述】:

我正在尝试:

  1. 根据字符串“Foot Strike”查找名为 LeftTD 的变量(这部分代码有效,感谢上一个问题的帮助!)
  2. 在列表中找到下一个 LeftTD 并将其命名为 LeftTDx
  3. 读取/消息框 LeftTD 和 LeftTDx 值
  4. 再次执行此操作,直到 H 列为空

输入数据如下所示: Excel Data

所以我希望第一个消息框告诉我,“步骤从第 9 行开始,在第 29 行结束”。我想告诉我的第二个消息框,“步骤从第 29 行开始,在第 34 行结束”。

代码按原样运行,因为它只执行第 1 步和第 4 步(见上文),并且我将其他所有内容都注释掉了:

Private Sub CommandButton1_Click()

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
Dim LeftStrike As Range, FrameLTD As Range, LeftStrike2 As Range 
Dim lrL As Long

lrL = ws.Range("H" & ws.Rows.Count).End(xlUp).Row
'COMMENT: set LeftTD= to something?
Set LeftStrike = ws.Range("H2:H" & lrL) 'COMMENT: .Find(LeftTD)


For Each FrameLTD In LeftStrike
   If InStr(FrameLTD, "Foot Strike") Then
           LeftTD = FrameLTD.Offset(0, 1)
           'COMMENT: LeftTDx = LeftTD.FindNext or is it too easy to ask VBA for : LeftTDx = LeftTD +1
           'COMMENT:StepEnd = LeftTDx.value 
     
    MsgBox "Step starts in row " & LeftTD & " and ends before row " 'COMMENT:& StepEnd
    
    End If
Next FrameLTD
 
End Sub

所以我想我的问题是,如何在我已经建立的查找字符串的 If Then 语句中设置 Find 和 Find Next 代码?

【问题讨论】:

    标签: vba if-statement find next


    【解决方案1】:

    不确定这是否是您想要的,但我认为它看起来很像。请试一试。

    Private Sub CommandButton1_Click()
    
        Dim Ws          As Worksheet
        Dim TdStart     As Long             ' start of range
        Dim Rl          As Long             ' last row
        Dim R           As Long             ' row counter
    
        Set Ws = ThisWorkbook.Sheets("Sheet1")
        With Ws
            Rl = .Range("H" & .Rows.Count).End(xlUp).Row
    
            TdStart = 2                          ' start searching in row 2
            For R = (TdStart + 1) To Rl
                ' "Foot Strike" can be anywhere in the cell's text
                '   this test is case sensitive
                If InStr(.Cells(R, "H").Value, "Foot Strike") Or R = Rl Then
                    MsgBox "Step starts in row " & TdStart & _
                           " and ends in row " & (R - IIf(R = Rl, 0, 1))
                    TdStart = R
                End If
            Next R
        End With
    End Sub
    

    顺便说一句,除非您以后想再次使用Ws,否则您无需声明它。相反,您可以直接使用With ThisWorkbook.Sheets("Sheet1")

    【讨论】:

    • 您设置的这段代码确实可以运行,但不能满足我的要求。不过,我确实知道您要做什么,所以谢谢您的尝试!这会找到字符串 "foot stroke" 并告诉我值的行号,然后是下一次 "foot strike" 之前的值的行。在该列表中,有 "Footstrikes" 和 "footoffs" 。对于这个程序,我想忽略列表中可能出现的“脚离”和任何其他脚事件,只看第一次踩脚值,然后看下一次踩脚值减 1。
    • 我想修正我的问题:我刚刚意识到我总是可以稍后在代码中删除最后一行。现在,我只想让这段代码告诉我第一个“踩踏”值和下一个“踩踏”值。所以第一个和第二个值,然后是第二个值和第三个值,然后是第三个和第四个值,依此类推。这可能吗??
    • 为了保持问答之间的直接关系,请不要在cmets中“修改问题”。您可以随时编辑问题本身。我认为我的代码正确识别了“Foot Strike”和下一个之前的行。我只是不知道在哪里可以找到“脚踩值”。使用Cells([Row], [Column]) 读取任何单元格。一旦您知道行号为R,您就可以读取Cell(R, "K").Value,如果这是值所在的位置,如果您想知道接下来两行中的内容,则可以读取Cells(R + 1, "H").ValueCells(R + 2, "H").Value
    • 谢谢你,Variatus!下次我会更加努力地使语言正确,并且将来不必进行修改。我之前评论中的“脚踩值”是指“Excel 数据”第一列中的数字。我想从消息框中报告的值如下:9 和 29,然后是 29 和 34,然后是 34 和 40。您的代码报告的值都是高于 9 和 29 的 excel 行的所有数字。这是我的错,我最初的问题问得不好。你还能帮我吗?
    • 如果代码返回所有正确的数字但偏移 1,那么简单的答案应该是修改答案:MsgBox "Step starts in row " & TdStart - 1 & _ " and ends in row " & (R - 1 - IIf(R = Rl, 0, 1))。我担心这个解决方案可能会在工作表的开头和/或结尾给出错误的答案,但更复杂的解决方案需要一张工作表的图片,如果你把它贴在这里,这个线程将不再被识别。最好用图片、现在的代码和现在的要求再问一个问题。
    猜你喜欢
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2022-01-06
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多