Excel VBA-更新find函数以在值为'时循环行并继续;不在那里

Excel VBA-更新find函数以在值为'时循环行并继续;不在那里,excel,vba,loops,if-statement,Excel,Vba,Loops,If Statement,尝试组合一个宏来搜索每一行,查看它是否包含7个搜索词(请参阅下面的“保修:”示例)。如果单元格以其中一个短语开头(如“保修:”),则该单元格将粘贴到另一工作表中的特定单元格(同一行但不同列) 问题: 在我添加select函数之前,宏一直存在问题-我知道这会减慢它们的速度,但如果没有它,我想不出一种方法来实现这一点 不知道如何让它在所有行中循环 如果行中没有单词,则会出现错误-需要它继续浏览吗 Sub FindTest() Worksheets("Macro").Range("1:1").F

尝试组合一个宏来搜索每一行,查看它是否包含7个搜索词(请参阅下面的“保修:”示例)。如果单元格以其中一个短语开头(如“保修:”),则该单元格将粘贴到另一工作表中的特定单元格(同一行但不同列)

问题:

  • 在我添加select函数之前,宏一直存在问题-我知道这会减慢它们的速度,但如果没有它,我想不出一种方法来实现这一点
  • 不知道如何让它在所有行中循环
  • 如果行中没有单词,则会出现错误-需要它继续浏览吗

    Sub FindTest()
    
     Worksheets("Macro").Range("1:1").Find(What:="Warranty: ", LookIn:=xlValues, LookAt:=xlPart, MatchCase:=True).Copy
    'Cell begins with "Warranty:" but text following varies
    
    Sheets("CSV Upload").Select
    Sheets("CSV Upload").Range("J1").Select
    ActiveSheet.Paste
    
    End Sub
    
更新:

Sub FindTest()

Dim Macro As Worksheet: Set Macro = Sheets("Macro")
Dim CSV As Worksheet: Set CSV = Sheets("CSV Upload")

'On Error Resume Next
For R = 1 To Macro.UsedRange.Rows.Count
    Set rng = Macro.Rows(R)

Dim FindRange As Range: Set FindRange = rng.Find(What:="Warranty:", LookIn:=xlValues, LookAt:=xlPart, MatchCase:=True)

'FindRange.Copy CSV.Range("J1")
'CSV.Cells(1, J) = Macro.Cells(FindRange)

Next

'On Error GoTo 0

End Sub

要循环浏览工作表中的每一行,请执行以下操作:

Dim ws As Worksheet: Set ws = Sheets("Macro")
Dim csv_upload As workseet: Set csv_upload = Sheets("CSV Upload")

For r = 1 To ws.UsedRange.Rows.Count
    Set rng = ws.Rows(r)
    rng.Find(What:="Warranty: ", LookIn:=xlValues, LookAt:=xlPart, MatchCase:=True)

    ...
Next
然后根据需要复制的单元格复制值

csv_upload.cells(dest_row, dest_col) = ws.cells(orig_row, orig_col)
如果要在出现错误时继续,可以告诉它继续

On Error Resume Next
' potential for error to be raised
' Don't use this unless you know you are going to get a specific
' error and know there are no unintended consequences of ignoring it.
On Error GoTo 0
使用更新中的代码,以下代码应该适用于您

Sub FindWarranty()

    Dim Macro As Worksheet: Set Macro = Sheets("Macro")
    Dim CSV As Worksheet: Set CSV = Sheets("CSV Upload")
    Dim rng As Range, FindRange As Range
    Dim Phrase As String

    Phrase = "Warranty:"

    For r = 1 To Macro.UsedRange.Rows.Count

        Set rng = Macro.Rows(r)
        Set FindRange = rng.Find(What:=Phrase, LookIn:=xlValues, LookAt:=xlPart, MatchCase:=True)

        If Not FindRange Is Nothing Then
            ' Set destination cell to what you need it to be
            c = 1
            CSV.Cells(r, c) = FindRange
        End If

    Next

End Sub
Quicksilver提到的更优雅的方式是:

Sub FindWarrantys()

    Dim Macro As Worksheet: Set Macro = Sheets("Macro")
    Dim CSV As Worksheet: Set CSV = Sheets("CSV Upload")
    Dim FoundCell As Range, FirstAddr As String
    Dim Phrase As String, c As Integer

    Phrase = "Warranty:"

    ' Find the first occurrence. The after variable is set to the
    ' last cell so that it will start searching from the beginning.
    Set FoundCell = Macro.UsedRange.Find(what:=Phrase, _
        after:=Macro.UsedRange.Cells(Macro.UsedRange.Cells.Count))

    ' Save the address of the first occurrence to prevent an infinite loop
    If Not FoundCell Is Nothing Then
        FirstAddr = FoundCell.Address
    End If

    ' Loop through all finds
    Do Until FoundCell Is Nothing

        c = 1 ' Adjust for logic to determine which column
        CSV.Cells(FoundCell.Row, c) = FoundCell

        ' Find the next occurrence
        Set FoundCell = Macro.UsedRange.FindNext(after:=FoundCell)

        ' Break if we're back at the first address
        If FoundCell.Address = FirstAddr Then
            Exit Do
        End If

    Loop

End Sub

您是在查看特定列,还是带有“保修”的单元格可以在任何列中?您尝试了什么?搜索“vba行循环”返回的页面太多,无法计数。还有,谢谢。它现在也许可以解决这个问题,但以后可能会导致更多的麻烦。第三,我将
…Find()
放在一个范围变量中。然后在继续之前检查这是否为
。例如,
Dim fndRng as Range//Set fndRng=Worksheets().Range().Find(…)//如果没有,fndRng什么都不是,那么…
到目前为止,我只编辑了现有的宏或记录了它们,所以@BrianCohan感谢您对一切的解释!我想我在告诉宏在哪里粘贴找到的值时遇到了语法问题。目标行将与原始行相同,但目标/原始列将不同且不同。在我使用粘贴功能之前,一切似乎都很正常。我试过-FindRange.Copy CSV.Range(“J1”)-和-CSV.Cells(1,J)=Macro.Cells(FindRange)-另外,你对如何继续使用粘贴功能有什么建议吗?@brucewayn Yea,我对VBA比较陌生,所以一定要注意外面的一般建议,避免选择和激活。谢谢你的帮助。将更新发布到代码。粘贴和获取要粘贴到所有行的函数时遇到问题。@MWalker当我试图找出在下面多行重复的某个产品id时,我遇到了类似的问题。我遇到的问题是,当找到第一个匹配项时,代码不会恢复相同的条件并再次搜索,直到找到另一个匹配项或列表完成。我已经找到了解决这个问题的方法,但我记不得了。我会浏览一下我的项目,然后再与您联系,不过请看一下这个例子<代码>设置FindMatch=Rng.Find(内容:=“保修:”,之后:=Rng.Cells(1,1),LookIn:=xlValues,LookAt:=xlPart,MatchCase:=True)我建议不要在错误恢复下一步时使用广泛的
,除非OP预期会出现特定错误。否则,它可能会隐藏OP应该修复的错误,并返回不正确/错误的数据等。我同意,它应该只用于预期会出现特定错误的区域。@BrianCohan这实际上与我过去所做的非常接近,但有一种方法可以让它继续搜索我现在不在计算机上的所有数据,但在“查找”中可以设置一个名为After的选项,它将继续搜索,直到完成整个列表完成了。不知道是否有一个循环点。只需声明要搜索和放置的范围,并使用带有标签的if语句在代码中前后跳转,即可搜索整个列表。当我进入电脑时,我会按照我的方式发布。@BrianCohan不错是的,更优雅这一个我猜没有必要发布与上面你给出的答案相同的东西。做得好。@BrianCohan非常感谢你的帮助!这两个宏都工作得很好。