Vba Excel宏-在Do循环中使用“查找”
在我拥有的Do循环中,我想使用“find”函数,但在一次迭代之后,当我尝试这个方法时,它似乎一直把我从循环中挤出来 仅供参考,我不擅长VB,更好地使用web代码,如PHP等 如果我注释掉以sfFamilyCol=wsSFDC.Rows1开头的行。。。。。。然后,循环将尽可能多地运行。有了这一行,它不会抛出一个错误,但只会通过一次 我想知道是否有一些特殊的处理方法。在循环中查找?或者其他我不知道的事?感谢您的帮助Vba Excel宏-在Do循环中使用“查找”,vba,excel,Vba,Excel,在我拥有的Do循环中,我想使用“find”函数,但在一次迭代之后,当我尝试这个方法时,它似乎一直把我从循环中挤出来 仅供参考,我不擅长VB,更好地使用web代码,如PHP等 如果我注释掉以sfFamilyCol=wsSFDC.Rows1开头的行。。。。。。然后,循环将尽可能多地运行。有了这一行,它不会抛出一个错误,但只会通过一次 我想知道是否有一些特殊的处理方法。在循环中查找?或者其他我不知道的事?感谢您的帮助 Option Explicit Sub mapTags() Dim wsMP A
Option Explicit
Sub mapTags()
Dim wsMP As Worksheet: Set wsMP = ActiveWorkbook.Sheets("MP")
Dim wsSFDC As Worksheet: Set wsSFDC = ActiveWorkbook.Sheets("SFDC")
Dim wsMap As Worksheet: Set wsMap = ActiveWorkbook.Sheets("Mapping")
Dim wsUp As Worksheet: Set wsUp = ActiveWorkbook.Sheets("Upload")
Dim wsCol As Worksheet: Set wsCol = ActiveWorkbook.Sheets("MP_Columns")
Dim wsFmt As Worksheet: Set wsFmt = ActiveWorkbook.Sheets("Tag Name Formats")
Dim i As Long, j As Long, k As Long
Dim SFDCrow As Long, SFDCID As String, sfCol As Long
Dim MPID As String, mpTagGroup As String, mpTagName As String, mpTagCol As Long, mapTagName As String
Dim sfTagFamily As String, sfTagGroup As String, sfTagName As String, sfFamilyCol As Long, sfGroupCol As Long
Dim oRange As Range, aCell As Range, bCell As Range
Application.ScreenUpdating = False
''Get Contact Record
For i = 2 To 2 Step -1 'Change i to 25000 later...
MPID = wsMP.Cells(i, 1).Value
sfCol = wsSFDC.Columns(2).Find(What:=MPID, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Row
'MsgBox sfCol
''Go Through each MP Contact Tag Colum
For k = 10 To 1 Step -1
mpTagGroup = wsCol.Cells(k, 1).Value
If Not mpTagGroup = "" Then
mpTagCol = wsMP.Rows(1).Find(What:=mpTagGroup, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Column
'' Get the Tag Name
mpTagName = wsMP.Cells(i, mpTagCol).Value
If Not mpTagName = "" Then
''Get the Mapped SFDC Tags
Set oRange = wsMap.Columns(1)
Set aCell = oRange.Find(What:=mpTagGroup, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
'MsgBox mapTagGroup
If Not aCell Is Nothing Then
Set bCell = aCell
'FoundAt = aCell.Row
Do
Set aCell = oRange.FindNext(After:=aCell)
If Not aCell Is Nothing Then
If aCell.Row = bCell.Row Then Exit Do
'FoundAt = FoundAt & ", " & aCell.Row
mapTagName = wsMap.Cells(aCell.Row, 2).Value
If mapTagName = mpTagName Then
sfTagFamily = wsMap.Cells(aCell.Row, 4).Value
sfTagGroup = wsMap.Cells(aCell.Row, 5).Value
sfTagName = wsMap.Cells(aCell.Row, 6).Value
'MsgBox aCell & " " & mapTagName & ": " & sfTagFamily & " " & sfTagGroup & " " & sfTagName
MsgBox sfTagFamily
''Set the SDDC TAG FAMILY to TRUE
sfFamilyCol = wsSFDC.Rows(1).Find(What:=sfTagGroup, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Column
MsgBox sfFamilyCol
End If
Else
Exit Do
End If
Loop
End If
'MsgBox "The Search String has been found in these rows: " & FoundAt
End If
End If
Next k
Next i
End Sub
好的,只有一个.Find操作被记住,任何后续的.FindNext都将使用最后一个.Find的参数。您的集合aCell=oRange.FindNext。。。正在使用sfFamilyCol=wsSFDC.Rows1.Find。。。在第二次迭代中
该sfFamilyCol=wsSFDC.Rows1.Find。。。正在使用lookat:=xlPart,但也许可以将其更改为
if application.countif(wsSFDC.Rows(1), chr(42) & sfTagGroup & chr(42)) then _
sfFamilyCol = application.match(chr(42) & sfTagGroup & chr(42), wsSFDC.Rows(1), 0)
这应该是足够的错误控制,只有在看起来可以找到的情况下才尝试通配符匹配。设置aCell=oRange.FindNext的后续调用。。。应保持不受影响。这是一个如此开始。我认为您只需要清理使用Find方法的顺序。另外,试着通过添加断点来区分哪个部分不起作用,这样我们就可以把注意力集中在那一行上。另一个供您阅读的部分非常感谢您,我不知道.FindNext会使用新的.Find。使用.Match代替.Find效果很好