Одно из решений (там, вероятно, является более эффективным способом) будет разбить строку и перебрать возвращенный массив:
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
Tha НКС. Функция работает нормально, но в случае, если в строке есть несколько экземпляров слова, функция не сможет определить соответствующие позиции. – SanilB
Вы можете 'if strcomp (left $ (words (i), len (searchword)), searchword, vbtextcompare) = 0, затем выйти для', который заставил бы '' сломанный '' также соответствовать '" BRoken? "' –
@AlexK , Я не совсем уверен, что вы имеете в виду. Также имейте в виду, что вы можете получить тот же результат, который вы предлагаете, полагаясь на LCase. ОП не говорит, что он ожидает, что «сломанный» будет равен «Брокен», но найдет все существующие «сломанные» в данной строке (которые могут быть более одного); Я предполагаю, что единственный способ доставить это (с помощью этой функции) - хранить все вхождения в массиве и возвращать его (вместо одной позиции), что поставляет код в мой ответ (который является просто обновленной версией этого код). – varocarbas