2015-10-05 2 views
0

Мне интересно, можно ли использовать VBA для определения определенных шаблонов в целых связках из 5char строк? Я исследовал функцию «instr», но я не уверен, выполнит ли она требуемую задачу, которая в основном заключается в поиске шаблонов в строке, например:Excel VBA String Оценка

ABABA 
BCBCB 
..... 
EFEFE 

Или любой такой шаблон, где первый символ является таким же, как 3 символов & 5, а второй символ является таким же, как полукокса 4.

Любая помощь или направление будет благодарностью.

Сердечные приветы

Джим

+0

Пожалуйста, добавьте пример исходного текста и пример ожидаемого результата. – zedfoxus

+0

Будет ли шаблон всегда быть 1,3,5 и 2,4, как указано выше, или вы просто ищете какой-либо узор? –

+0

Hi @zedfoxus Извинения, если вопрос был неопределенным. Исходный текст будет списком случайных 5 символов символов, состоящих только из букв. Мне просто нужен какой-то флаг, чтобы определить, существует ли шаблон, который я ищу, в каждой строке. – jimiclapton

ответ

1

Вы можете сделать это без VBA и он все равно будет достаточно быстро:

=IF(AND(MID("ABABA",1,1)=MID("ABABA",3,1),MID("ABABA",2,1)=MID("ABABA",4,1),MID("ABABA",3,1)=MID("ABABA",5,1)),1,0) 

просто заменить «-Абеба» с соответствующим адресом ячейки, и это его

1

Оператор: Like Оператор:

Const testString = "ABABA" 
Dim myChar1 As String, myChar2 As String 

'// test 1/3/5 
myChar1 = Mid(testString, 1, 1) 
'// test2/4 
myChar2 = Mid(testString, 2, 1) 

If testString Like myChar1 & "[A-Z]" & myChar1 & "[A-Z]" & myChar1 Then 
    MsgBox "Matches 1, 3 and 5" 
ElseIf testString Like "[A-Z]" & myChar2 & "[A-Z]" & myChar 2 & "[A-Z]" Then 
    Msgbox "Matches 2 and 4" 
End If 

Или использовать Mid() функцию:

If Mid(testString, 1, 1) = Mid(testString, 3, 1) And _ 
    Mid(testString, 3, 1) = Mid(testString, 5, 1) And _ 
    Mid(testString, 1, 1) = Mid(testString, 5, 1) Then 

    MsgBox "Matches 1, 3 and 5" 

ElseIf Mid(testString, 2, 1) = Mid(testString, 4, 1) Then 

    MsgBox "Matches 2 and 4" 

End If 

ИЛИ для проверки обоих условий:

Dim match1 As String, match2 As String 
Const testString As String = "ABABA" 

match1 = Left(testString, 1) & "[A-Z]" & Left(testString, 1) & "[A-Z]" & Left(testString, 1) 

match2 = "[A-Z]" & Left(testString, 1) & "[A-Z]" & Left(testString, 1) & "[A-Z]" 

If testString Like match1 Or testString Like match2 Then 
    MsgBox "findwindow likes it when anything matches" 
End If 
+0

Нет обоих? downvoted flagged = P – findwindow

+2

Вы говорили ... –

+0

Ничего себе даже не вызывал в msgbox. Я особенный. – findwindow

1

Меня возбуждает:

Function findPattern(inputStr As String) As Variant() 
Dim arr() As String 
Dim i As Integer 
arr = Split(inputStr) 
ReDim arr2(UBound(arr)) As Variant 
For i = LBound(arr) To UBound(arr) 
    If Left(arr(i), 1) = Mid(arr(i), 3, 1) And _ 
     Left(arr(i), 1) = Mid(arr(i), 5, 1) And _ 
     Mid(arr(i), 2, 1) = Mid(arr(i), 4, 1) Then 

     arr2(i) = "True" 
    Else 
     arr2(i) = "False" 
    End If 
    findPattern = arr2 
Next 
End Function 

Sub trying() 

    Dim t As String 
    t = "ABABA BCBCB IOITU" 
    arr = findPattern(t) 'returns an array {True,True,False} 

    For x = 0 To 2 
    Debug.Print arr(x) 
    Next 
End Sub 

Это предполагает, что у вас есть несколько слов в каждой строке. Он возвращает массив true false.

Редактировать

Чтобы найти его есть какой-либо шаблоны используют этот UDF:

Function findPattern(inputStr As String) As String 
Dim i As Integer 
For i = 5 To 1 Step -1 
If Asc(Mid(inputStr, i, 1)) > 5 Then 
    inputStr = Replace(inputStr, Mid(inputStr, i, 1), i) 
End If 
findPattern = inputStr 
Next 

End Function 

Он вернется 12121 на «-Абебе»

Вы можете вставить это в модуле в книге затем используйте его как формулу: =findPattern("A1") Скопируйте его. Затем сортируйте по столбцу, он поместит все похожие шаблоны вместе с наиболее узором (11111) по меньшей мере (12345).

Тогда вы также можете фильтровать этот столбец для любого шаблона, который вы желаете.

0

Хорошо, поэтому я на самом деле пошел на это в конце ...string pattern excel

Сложно просто, буквально не могу поверить, что я не рассматривал это как вариант в первую очередь, а вместо этого предполагал, что это должно быть сделано в VBA. Ценный урок!

Пришлось модифицировать формулы так или иначе, потому что мой первоначальный шаблон флага (1,3,5 & 2,4) оценивался до большого жира FALSE по всей доске, поэтому я решил посмотреть 1,3 & 2,4 с 5 быть чем угодно. Как я упоминал в своем комментарии к @zedfoxus, это приводит меня к тому, где мне нужно быть прямо сейчас, но было бы здорово использовать VBA для производства этого. Я собираюсь пересмотреть все ваши ответы, так что спасибо за то, что нашли время, чтобы ответить, я фричину люблю это место!

МИР!

+0

См. Мое редактирование для чего-то, что может помочь выполнить процесс. –

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