2013-08-02 2 views
2

Предположим, что у меня есть строка, разделенная пробелами/дефисом.Как найти позицию слова (не позицию символа) в строке

Например. Возьми эти сломанные крылья и научись летать.

Какая функция vba может найти положение сломанного слова, которое должно быть возвращено как 3, а не 11, которое является позицией символа.

ответ

1

Одно из решений (там, вероятно, является более эффективным способом) будет разбить строку и перебрать возвращенный массив:

Function wordPosition(sentence As String, searchWord As String) As Long 

    Dim words As Variant 
    Dim i As Long 

    words = Split(sentence, " ") 
    For i = LBound(words, 1) To UBound(words, 1) 
     If words(i) = searchWord Then Exit For 
    Next i 

    'return -1 if not found 
    wordPosition = IIf(i > UBound(words, 1), -1, i + 1) 

End Function 

Вы можете назвать это Илкой это:

Sub AnExample() 

    Dim s As String 
    Dim sought As String 

    s = "Take these broken wings and learn to fly" 
    sought = "broken" 

    MsgBox sought & " is in position " & wordPosition(s, sought) 

End Sub 
+0

Tha НКС. Функция работает нормально, но в случае, если в строке есть несколько экземпляров слова, функция не сможет определить соответствующие позиции. – SanilB

+0

Вы можете 'if strcomp (left $ (words (i), len (searchword)), searchword, vbtextcompare) = 0, затем выйти для', который заставил бы '' сломанный '' также соответствовать '" BRoken? "' –

+0

@AlexK , Я не совсем уверен, что вы имеете в виду. Также имейте в виду, что вы можете получить тот же результат, который вы предлагаете, полагаясь на LCase. ОП не говорит, что он ожидает, что «сломанный» будет равен «Брокен», но найдет все существующие «сломанные» в данной строке (которые могут быть более одного); Я предполагаю, что единственный способ доставить это (с помощью этой функции) - хранить все вхождения в массиве и возвращать его (вместо одной позиции), что поставляет код в мой ответ (который является просто обновленной версией этого код). – varocarbas

1

решение, предлагаемое assylias, довольно хорошо и просто нуждается в небольшой адаптации для учета нескольких случаев:

Function wordPosition(sentence As String, searchWord As String) As Long() 

    Dim words As Variant 
    Dim i As Long 

    words = Split(sentence, " ") 
    Dim matchesCount As Long: matchesCount = 0 
    ReDim matchesArray(UBound(words) + 1) As Long 
    For i = LBound(words, 1) To UBound(words, 1) 
     If words(i) = searchWord Then 
      matchesCount = matchesCount + 1 
      matchesArray(matchesCount) = IIf(i > UBound(words, 1), -1, i + 1) 
     End If 
    Next i 

    If (matchesCount > 0) Then 
     matchesArray(0) = matchesCount 
    End If 

    wordPosition = matchesArray 

End Function 


Sub AnExample() 

    Dim s As String 
    Dim sought As String 

    s = "Take these broken wings and learn to fly and broken again" 
    sought = "broken" 

    Dim matches() As Long: matches = wordPosition(s, sought) 

    If (matches(0) > 0) Then 
     Dim count As Integer: count = 0 
     Do 
      count = count + 1 
      MsgBox "Match No. " & count & " for " & sought & " is in position " & matches(count) 
     Loop While (count < matches(0)) 

    End If 

End Sub