Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba Excel宏-在Do循环中使用“查找”_Vba_Excel - Fatal编程技术网

Vba Excel宏-在Do循环中使用“查找”

Vba Excel宏-在Do循环中使用“查找”,vba,excel,Vba,Excel,在我拥有的Do循环中,我想使用“find”函数,但在一次迭代之后,当我尝试这个方法时,它似乎一直把我从循环中挤出来 仅供参考,我不擅长VB,更好地使用web代码,如PHP等 如果我注释掉以sfFamilyCol=wsSFDC.Rows1开头的行。。。。。。然后,循环将尽可能多地运行。有了这一行,它不会抛出一个错误,但只会通过一次 我想知道是否有一些特殊的处理方法。在循环中查找?或者其他我不知道的事?感谢您的帮助 Option Explicit Sub mapTags() Dim wsMP A

在我拥有的Do循环中,我想使用“find”函数,但在一次迭代之后,当我尝试这个方法时,它似乎一直把我从循环中挤出来

仅供参考,我不擅长VB,更好地使用web代码,如PHP等

如果我注释掉以sfFamilyCol=wsSFDC.Rows1开头的行。。。。。。然后,循环将尽可能多地运行。有了这一行,它不会抛出一个错误,但只会通过一次

我想知道是否有一些特殊的处理方法。在循环中查找?或者其他我不知道的事?感谢您的帮助

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效果很好