2012-02-23 2 views
1

Я хочу проверить диапазон ячеек для определенной части текста. Этот текст всегда находится в моем документе, за исключением того, что ячейка является переменной (столбец всегда B). Поэтому я проверяю диапазон от 1:75 на наличие каких-либо ячеек текста, но он не работает.Excel VBA - проверьте, содержит ли текст кусок текста

Dim FoundRange As Range 
Set FoundRange = Cells.Find("5/7 binnen 4h") 
Range("I" & EmptyCell + 2).Value = ... (value of cell I on same row as B) 

Cell Я ищу всегда содержит этот текст Onderhoud 5/7 binnen 4h, но его позиция может меняться, поэтому мне просто нужно проверить, содержит ли он какой-либо из него. Когда я нахожу эту ячейку, мне нужно значение I в той же строке.

Любые предложения приветствуются!

+1

Хм, более подробно рассмотрев функцию Instr, он не может равняться 1, это будет выше. У меня сложилось впечатление, что это функция была 1 = true, 0 = false. – CustomX

+0

'Instr' возвращает позицию первого вхождения строки, которую вы ищете, в строку, которую вы ищете – barrowc

ответ

4

Не могли бы вы просто найти подстроку?

Sheet1.Cells.Find("string to find") 

Возвратит диапазон, содержащий строку (или ничего, если строка не может быть найден.

Например

Public Sub Macro1() 
Dim FoundRange As Range 

Set FoundRange = Sheet1.Cells.Find("5/7 binnen 4h") 

' display the cell address to the user 
MsgBox FoundRange.Address 


' put the found value in column i in the same row as the found text in a known location ($C$1 in this case) 
Sheet1.Range("$C$1").Value = Sheet1.Cells(FoundRange.Row, 9).Value 

' put the found value in four columns to the right in the same row as the found text in a known location ($C$1 in this case) 
Sheet1.Range("$C$2").Value = FoundRange.Offset(0, 4).Value 

End Sub 
+0

Так что он будет искать мой весь лист, ищущий' 5/7 binnen 4h'? – CustomX

+0

Да, намного быстрее, чем зацикливание, глядя на ячейки по отдельности. –

+0

Как я мог реализовать это? Я продолжаю получать ошибки: s – CustomX

2

Это слишком много, чтобы вписаться в комментарий, поэтому отправьте его как ответ ...

Вы должны быть осторожны при использовании Find() только с одним аргументом: если вы ранее использовали Find() в своем коде и (например) speci fied аргумент lookat:=xlWhole, тогда вы можете не получить ожидаемые результаты, особенно если вы ищете подстроку значения ячейки. Параметры, переданные в Find(), являются постоянными: если вы не укажете аргумент, он может переноситься из предыдущего использования.

В качестве примера (работа с листом, содержащий текст «привет Томь» в В4:

Sub Tester() 

    Dim f 

    Set f = ActiveSheet.Cells.Find(what:="tom", lookat:=xlPart) 
    Report f 

    Set f = ActiveSheet.Cells.Find(what:="tom", lookat:=xlWhole) 
    Report f 

    Set f = ActiveSheet.Cells.Find("tom") 
    Report f 

End Sub 

Sub Report(f) 
    If Not f Is Nothing Then 
     Debug.Print f.Address 
    Else 
     Debug.Print "not found" 
    End If 
End Sub 

Запуск этого дает:

$B$4 
not found 
not found 

я припоминаю, это также в случае, если вы использовали «Найти» («вручную»), а затем используйте его в коде позже в том же сеансе (не тестировали, хотя).

+0

Интересно! Я этого не знал. Тупой дизайн! –

+0

Это действительно имеет смысл.Он должен по умолчанию найти точное соответствие содержимого ячейки, поэтому, если вы укажете 'lookat: = xlWhole', или если вы оставите этот пробел, он попытается совместить, а« tom »не будет точно соответствовать« hello tom ». Это частичное совпадение, поэтому 'lookat: = xlPart' будет работать. –