2015-01-15 4 views
0

Я хочу, чтобы создать либо макрос или UDF, который может найти ячейки в листе первенствовать, который содержит следующее: POxxx PO ххххххх PO # ххххх PO # хххх (С x - числа) Строка может быть в начале или в середине ячеек. Кроме того, функция/macro не должна находить ячейки, содержащие записи типа CORPORATE, где PO является частью слова.VBA - Найти определенные строки в листе

Все ячейки, содержащие соответствующие данные, должны быть выделены.

+0

Что мешает вам делать что именно? –

+0

Tim, У меня есть проблема, чтобы найти синтаксис, который найдет подстроку в любом месте содержимого ячейки, особенно в начале ячейки. – Francois

+0

@TimWilliams, у меня возникают проблемы с поиском синтаксиса, который найдет его подстроки в любом месте содержимого ячейки. Кажется, я не нашел синтаксиса, который найдет подстроки, если они находятся в начале ячеек. Это также похоже на UDF, который предоставил Студент Гэри. – Francois

ответ

0

Этот небольшой UDF вернется является матч присутствует, в противном случае

Public Function IsItThere(r As Range) As Long 
    Dim st As String 
    st = "0,1,2,3,4,5,6,7,8,9" 
    ary = Split(st, ",") 
    st = r.Text 
    IsItThere = 1 
    For Each a In ary 
    If InStr(1, st, "PO" & a) > 1 Then Exit Function 
    If InStr(1, st, "PO " & a) > 1 Then Exit Function 
    If InStr(1, st, "PO#" & a) > 1 Then Exit Function 
    If InStr(1, st, "PO# " & a) > 1 Then Exit Function 
    Next a 
    IsItThere = 0 
End Function 

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

+0

Спасибо за ответ. Тим, чтобы ответить на ваш вопрос, мне трудно получить синтаксис для поиска подстроки, когда она находится в начале ячейки. У него также, похоже, та же проблема – Francois

0

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

Sub Tester() 
    Dim c As Range 
    For Each c In Selection.Cells 
     c.Interior.Color = IIf(RegexpTest(c.Value), vbRed, vbGreen) 
    Next c 
End Sub 


Function RegexpTest(v As String) 
    Static re As Object 'note static: you must reset the VB environment 
         ' (press the "stop" button) if you edit the 
         ' Pattern below 
    If re Is Nothing Then 
     Set re = CreateObject("VBScript.RegExp") 
     '"PO" then optional #, optional space, then 2-5 digits 
     re.Pattern = "PO#?\s?\d{2,5}" 
     re.ignorecase = True 
    End If 
    RegexpTest = re.test(v) 
End Function 
+0

Тим, отлично. Это то, что я искал. Спасибо за разъяснение синтаксиса. – Francois

+0

Тим, извините, как добавить дополнительное пространство #? (Чтобы захватить PO # 555 или PO # 7888) – Francois

+0

Попробуйте 'PO \ s? #? \ S? \ D {2,5}' –

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