2013-11-09 4 views
0

Все. Я новичок в VBA и MS EXCEl 2010. Я только начал играть с макромодулем в EXCEL вчера, почти нулевой опыт.Excel VBA Найти функцию побочного эффекта?

То, что я пытаюсь сделать, описано ниже. Сначала найдите записи значений в диапазоне в sheet1, затем для каждой найденной ячейки я найду эту строку и вытащил другое значение ячейки в этой строке. Используя это значение, выполните другой поиск в диапазоне в sheet2. Я укажу на проблему, которая возникает после моего кода. Вот pesudcode.

Dim Found As Range 
With RangeInSheet1 
     Set Found = .Find(value1) 
     If Not Found Is Nothing Then 
      firstAddress = Found.Address 
      Do 
       With RangeInSheet2 
        ColumnIndex = .Find(value2).Column 
       End With 
       Set Found = .FindNext(Found) 
      Loop While Not Found Is Nothing And Found.Address <> firstAddress 
     End If 
End With 

value1 ключ я использовал для поиска в RangeSheet1 и значение2 в RangeSheet2. Вышеприведенный код проходит через каждую запись, которую я нашел для value1 в листе 1, и выполняет другой поиск в Sheet2.

Теперь давайте скажем value1 = 1, value2 = 2007 и есть 5 записей, содержащих значение 1 в листе 1. Проблема возникает из этой строки кода «ColumnIndex = .Find (value2) .Column».

Предположительно, для всех пяти найденных записей значение Найденного всегда должно быть 1 после выполнения «Set Found = .FindNext (Найдено)». Но после того, как я добавил этот код ColumnIndex, значение Found установлено в 2007, что для меня так странно. Кто-нибудь знает, в чем проблема? Любая помощь будет оценена. Мне действительно нужно, чтобы «Найдены» ведут себя «нормально», как я хочу.

Если что-то неясно, пожалуйста, дайте мне знать

ответ

3

.Find/.Findnext запоминает последние настройки. И поэтому всегда желательно полностью указать параметры. особенно After:= параметр. Он также будет помнить, что был ваш последний термин поиска т.е. What:=

Вот демонстрация того, как работать с .Find/.Findnext

Также не используйте Value2 в качестве переменной. Это зарезервированное слово. Вместо того чтобы использовать Value1 и Value2, я использую sSearch1 и sSearch2 в коде ниже

Допустим, ваши листы выглядят как этот

enter image description here

Попробовать этот код

Sub Sample() 
    Dim ws1 As Worksheet, ws2 As Worksheet 
    Dim rngWs1 As Range, rngWs2 As Range 
    Dim aCell As Range, bCell As Range, cCell As Range, dCell As Range, eCell As Range, cl As Range 
    Dim sSearch1, sSearch2 

    Set ws1 = ThisWorkbook.Sheets("Sheet1") 
    Set rngWs1 = ws1.Range("A1:A10") 

    Set ws2 = ThisWorkbook.Sheets("Sheet2") 
    Set rngWs2 = ws2.Cells 

    With ws1 
     For i = 1 To 10 
      sSearch1 = .Range("A" & i).Value 
      Set aCell = .Range("A" & i) 

      If Len(Trim(sSearch1)) <> 0 Then 
       Set aCell = rngWs1.Find(What:=sSearch1, After:=aCell, LookIn:=xlValues, _ 
       LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
       MatchCase:=False, SearchFormat:=False) 

       If Not aCell Is Nothing Then 
        sSearch2 = aCell.Offset(, 1).Value 

        With ws2 
         Set bCell = rngWs2.Find(What:=sSearch2, After:=.Range("A1"), LookIn:=xlValues, _ 
           LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
           MatchCase:=False, SearchFormat:=False) 

         If Not bCell Is Nothing Then 
          Debug.Print "For " & sSearch1 & ", " & sSearch2 & " Found in " & bCell.Address 

          Set cCell = bCell 

          Do 
           Set bCell = rngWs2.FindNext(After:=bCell) 

           If Not bCell Is Nothing Then 
            If bCell.Address = cCell.Address Then Exit Do 
            Debug.Print "For " & sSearch1 & ", " & sSearch2 & " Found in " & bCell.Address 
           Else 
            Exit Do 
           End If 
          Loop 
         End If 
        End With 
       End If 
      End If 
     Next 
    End With 
End Sub 

Это результат, который мы получаем.

enter image description here

Смежные вопросы