2013-07-26 3 views
0

Можно ли поместить и ИЛИ в пределах диапазона.find? У меня есть эта функция, но я бы хотел, чтобы искать любого из 2-х значенийИспользование функции Or в пределах диапазона.Find VBA

With Worksheets("Term").Range("A:A") 

     Set rng = .Find(What:=Worksheets("Term and Discipline").Range("K7"), _ 
         After:=.Cells(.Cells.Count), _ 
         LookIn:=xlValues, _ 
         LookAt:=xlPart, _ 
         SearchOrder:=xlByRows, _ 
         SearchDirection:=xlNext, _ 
         MatchCase:=False) 
     Application.Goto rng, True 
End With 

В строке, где вы предоставляете то, что он ищет, я пытался поставить в операторе ИЛИ но Excel злится на меня когда я пытаюсь запустить его

+1

[См.] (Http://stackoverflow.com/questions/8042744/excel-vba-instr-condition-doesnt-work-with-2-or-more-conditions/8047021#8047021) для = ИЛИ и коротких замыканий, замыкание. – pnuts

ответ

1

Метод Range.Find эмулирует то же окно, что и при нажатии CTRL + F в Excel. Поскольку вы не можете одновременно искать 2+ значения в этом окне, я не считаю, что вы можете одновременно искать значения 2+ через VBA. Я думаю, вам придется сделать этот метод дважды, к сожалению.

Если я ошибаюсь, я хотел бы знать, как это сделать; это было бы так полезно. Поэтому, пожалуйста, не стесняйтесь доказать, что я ошибаюсь :)

Из моего тестирования метод Range.Find не поддерживает массивы или диапазон более 1 ячейки. Так что это не так.

Кроме того, попытка использования OR не будет работать правильно, потому что OR проверяет TRUE/FALSE и возвращает TRUE/FALSE.

2

Предполагаю, что ближайший эквивалент должен выполнять поиск параллельно (эффективно) и использовать MIN() для выбора первой найденной ячейки.

Sub FindingNemor() 
    Dim rngFoo As Range 
    Dim rngBar As Range 

    Set rngFoo = Cells.Find(What:="foo", After:=Range("A1"), LookIn:=xlFormulas, LookAt:= _ 
     xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _ 
     , SearchFormat:=False) 
    Set rngBar = Cells.Find(What:="bar", After:=Range("A1"), LookIn:=xlFormulas, LookAt:= _ 
     xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _ 
     , SearchFormat:=False) 

    If Not rngFoo Is Nothing And Not rngBar Is Nothing Then 
     Range("A1").Cells(Application.Min(rngFoo.Row, rngBar.Row)).Select 
    End If 
End Sub 

Это требует дополнительных проверок в случае, если только один из rngFoo или rngBar - ничто.

Добавлено Проверка Nothing -ness делает его немного хаотичным:

Sub FindingNemor() 
    Dim rngFoo As Range 
    Dim rngBar As Range 

    Set rngFoo = Cells.Find(What:="foo", After:=Range("A1"), LookIn:=xlFormulas, LookAt:= _ 
     xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _ 
     , SearchFormat:=False) 
    Set rngBar = Cells.Find(What:="bar", After:=Range("A1"), LookIn:=xlFormulas, LookAt:= _ 
     xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _ 
     , SearchFormat:=False) 

    If Not rngFoo Is Nothing And Not rngBar Is Nothing Then 
     Range("A1").Cells(Application.Min(rngFoo.Row, rngBar.Row)).Select 
    ElseIf rngFoo Is Nothing Then 
     If rngBar Is Nothing Then 
      MsgBox "Neither found." 
     Else 
      Range("A1").Cells(rngBar.Row).Select 
     End If 
    Else 
     Range("A1").Cells(rngFoo.Row).Select 
    End If 
End Sub 
0

Вам нужно перебрать все ячейки в вашем диапазоне и использовать Like функцию или InStr в If заявлении с Or.

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