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