2014-11-04 2 views
0

Внутри Loop, который у меня есть, я хочу использовать функцию «Найти», но, похоже, она меня ударяет из цикла после одной итерации, когда я пытаюсь это сделать.Excel Macro - использование find в do Loop

FYI, я не силен в VB, лучше с веб-кодом, например: PHP и т.д.

Если я закомментируйте строку, начинающуюся sfFamilyCol = wsSFDC.Rows (1) ...... то цикл будет работать столько раз, сколько должен. С этой строкой там, она не бросает ошибку, но она проходит только один раз.

Мне интересно, есть ли какой-то особый способ обработки. Искать в цикле? Или что-то еще, о чем я не знаю? Любая помощь приветствуется ...

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      
+0

Это [хорошая статья] (http://www.cpearson.com/excel/FindAll.aspx), поэтому начинайте здесь. Я думаю, вам просто нужно очистить последовательность использования метода * Find Method *. Кроме того, попробуйте изолировать, какая часть не работает, добавив точки останова, чтобы мы могли сосредоточиться на этой строке. – L42

+0

Еще [ссылка] (http://www.siddharthrout.com/2011/07/14/find-and-findnext-in-excel-vba/) для вашего удовольствия от чтения –

ответ

0

AFAIK, есть только одна .Find операция запоминается и последующая .FindNext будет использовать параметры последнего .Find. Ваш Set aCell = oRange.FindNext(... использует sfFamilyCol = wsSFDC.Rows(1).Find(... во время второй итерации.

Это sfFamilyCol = wsSFDC.Rows(1).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) 

Это должно быть достаточный контроль ошибок только попытка уайлдкард Match если он выглядит, как он может быть найден. Последующие обращения к Set aCell = oRange.FindNext(... должны оставаться без изменений.

+0

Большое спасибо, я не понял. FindNext будет использовать новый .Find. Использование .Match вместо .Find хорошо работает – Sanfly