#vba
#vba
Вопрос:
У меня есть приведенный ниже код, который извлекает строку из скобок, и все в порядке, но теперь я обнаружил, что иногда в моей строке может быть больше скобок с текстом позади, и мне нужно их тоже извлечь. Например, список или таблица.
например
hsus(irt)bla dsd (got)(rifk)
Тогда мне нужно: irt, got, rifk в список, как это сделать?
Public Function extract_value(str As String) As String
dim str as string
dim openPos as integer
dim closePos as integer
dim midBit as string
str = "sometinhf(HELLO)sds"
openPos = instr (str, "(")
closePos = instr (str, ")")
midBit = mid (str, openPos 1, closePos - openPos - 1)
End Function
Ответ №1:
Sub Main()
Dim s$
s = "hsus(irt)bla dsd (got)(rifk)"
Debug.Print extract_value(s)
End Sub
Public Function extract_value$(s$)
Dim returnS$
Dim v
v = Split(s, Chr(40))
For Each Item In v
If InStr(Item, Chr(41)) Then
returnS = returnS amp; Chr(32) amp; Split(Item, ")")(0)
End If
Next
extract_value = Trim$(returnS)
End Function
Комментарии:
1.Хорошо, вы были довольно быстры. Вы знаете, насколько быстрее, чем
Mid(params)
Split(params)
разделить строку?2. @smagnan никогда не измерял это. вы считаете, что это плохой подход?
3. Вы имеете в виду использование
Mid
вместоSplit
? Я полагаю, что это действительно не лучший подход, посколькуMid
используется для извлечения подстрок… но поскольку я совсем новичок в VBA, я все еще не знаю многих функций4.
Split()
разбивает всю строку на массив Variant / String на основе разделителя. Таким образом, с помощьюSplit()
вы уже ограничиваете длину строки, к которойMid()
придется перейти, чтобы извлечь подстроку. Посколькуv
в памяти всего несколько слов, теперь вы проверяете, есть ли в каждом из слов)
. Если это не так, вы пропускаете это слово, и если это так, вы снова используете разделение с другим разделителем, как отредактированный код, вместо Mid, который в этом случае был бы медленнее5. @ me как, это было быстро! :)… @smagnan, я считаю,
Split
что операция со строками должна быть немного быстрее, поскольку выделение отдельных строк непосредственно в VBA является медленным процессом.
Ответ №2:
Вы можете использовать Regexp
для извлечения соответствующих строк напрямую
Sub Main()
Dim strTest as string
strTest = "hsus(irt)bla dsd (got)(rifk)"
MsgBox GrabIt(strTest)
End Sub
Function GrabIt(strIn As String) As String
Dim objRegex As Object
Dim objRegMC As Object
Dim objRegM As Object
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
.Pattern = "((.*?))"
.Global = True
If .test(strIn) Then
Set objRegMC = .Execute(strIn)
For Each objRegM In objRegMC
GrabIt = GrabIt amp; Chr(32) amp; objRegM.submatches(0)
Next
End If
End With
End Function