2014-01-30 5 views
1

Я по-прежнему новичок в использовании диапазонов/find/findnext в VBA и искал некоторую помощь. Я успешно реализовал одиночный цикл find -> findnext, однако мне было интересно, можно ли использовать findnext с использованием двух находок.Использование findnext с двумя находок

Код, в котором я его использую, следующий. Для простоты я использую инвентарь для пиццы.

Суть в том, что у меня есть электронная таблица, а в столбце I - столбец для каталогов (сыр, мясо, вегетарианец), в то время как колонка H (смещенная часть) является типом - (Mozzarella, Parmesean, Pepperoni и т. Д. И т. Д.). То, что я хочу сделать, - это составить список разных типов одной категории в определенном столбце без дубликатов.

Например, я хочу найти все экземпляры слова «Сыр» в столбце I. Я хочу, чтобы код сначала нашел слово «сыр», затем дайте мне тип (Cheddar Mozzarella и т. Д.). Вторая находка - проверить, существует ли этот тип в моем последнем столбце. Если он уже присутствует в столбце (вторая функция поиска = ничего), то он переходит к следующему «сыру». Если он новый (вторая функция поиска = ничего), я бы хотел, чтобы он поместил тип в столбец и продолжаем.

Как и ошибка, и учитывая, что синтаксис почти идентичен моему предыдущему Find/Findnext, только с добавлением дополнительного FindNext, я понимаю, что он может ссылаться на неправильный. Есть ли способ избежать этого?

Примечание: Я понимаю, что могу легко заполнить все типы в последнем столбце, удалить дубликаты, а затем отсортировать их, но это кажется несколько неэлегантным и трудоемким. Мне было интересно, есть ли более удобный способ по строкам, которые я пытаюсь сделать.

a = 2 
    Set c = Range("I:I").Find("Cheese") 
    firstadd = c.Address 

    If Not c Is Nothing Then 

     Do 
      temp = c.Offset(0, -1) 
      Set d = Range("BA:BA").Find(temp) 

       If d Is Nothing Then 
        Cells(a, 53) = temp 
        a = a + 1 
       End If 

      Set c = Range("I:I").FindNext(c) 
     Loop While Not c Is Nothing And c.Address <> firstadd 
    End If 

End Function 

ответ

1

Попробуйте использовать для каждого цикла, чтобы избежать использования цикла find/findnext.

a = 2 
For Each c in Range("I:I") 
    If InStr(c.Value, "Cheese") Then 
     temp = c.Offset(0, -1).Value 
     If Not Range("BA:BA").Find(temp) Is Nothing Then 
      Cells(a, 53).Value = temp 
      a = a + 1 
     End If 
    End If 
Next c 
+0

я должен бросить в той оговоркой, что я не могу искать взыскивает, так как они довольно длинные номера деталей/описания (т.е. весь столбец может иметь записи, как «000cheese AB» и «0cheese 00045». Будет ли Проверка instr в части c.value приемлема? – Lzkatz

+0

Да, просто используйте 'If InStr (c.Value,« Cheese ») Тогда' вместо 'If c.Value =" Cheese "Then' – 2tsai

+0

Прекрасно работает. Спасибо. – Lzkatz

1

Попробуйте это.

Dim exists As Integer 
a = 2 
Set c = Range("I:I").Find("Cheese") 
firstadd = c.Address 

    Do While Not c Is Nothing And c.Address <> firstadd 
     temp = c.Offset(0, -1) 
     exists = WorksheetFunction.CountIf(Range("BA:BA"), temp) 

      If exists > 0 Then 
       Cells(a, 53) = temp 
       a = a + 1 
      End If 

     Set c = Range("I:I").FindNext(c) 
    Loop 

End Function 
+0

Я не использовал это для основного, но для других моих запросов это очень помогло. Спасибо. – Lzkatz

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