Добрый день. Нужно вытащить из формулы: =ИНДЕКС([1.xlsm]лист1!A1:D8;2;3)/МАКС([звезда.xlsm]свод1!K11:K22) отдельно [1.xlsm] и [звезда.xlsm]
Код:
Код
Sub jjj()
Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Pattern = "\[.+\]"
objRegExp.Global = False
Set objMatches = objRegExp.Execute("=ИНДЕКС([1.xlsm]лист1!A1:D8;2;3)/МАКС([звезда.xlsm]свод1!K11:K22)")
For i = 0 To objMatches.Count - 1
MsgBox objMatches.Item(i).Value
Next
End Sub
вытаскивает не то. objRegExp.Global = False не помогает
Sub jjj()
Dim objRegExp As Object, objMatches As Object, i&
Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Pattern = "\[.+?\]"
objRegExp.Global = True
Set objMatches = objRegExp.Execute("=ИНДЕКС([1.xlsm]лист1!A1:D8;2;3)/МАКС([звезда.xlsm]свод1!K11:K22)")
For i = 0 To objMatches.Count - 1
MsgBox objMatches.Item(i).Value
Next
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Бахтиёр: я могу и по другому вытащить … интересует решение на регулярках
к сожалению, не вышло — дал решение с помощью крутой строковой функции на основе варианта от Андрея VG (универсальнее, проще в использовании и, обычно, быстрее) и оставил нерабочий вариант с регулярными и подключенной библой (для тренировки остальным)
Option Base 1
Option Explicit
Option Private Module
'====================================================================================================
' Need to Add to Reference library Microsoft VBScript Regular Expressions 5.5
' File "vbscript.dll\3" in Folder "C:\Windows\System32\"
'====================================================================================================
Sub Test()
Dim RE As New RegExp
Dim x, tx$
tx = "=ИНДЕКС([1.xlsm]лист1!A1:D8;2;3)/МАКС([звезда.xlsm]свод1!K11:K22)"
RE.Global = True
RE.Pattern = "\[.+?\]" ' The_Prist
For Each x In RE.Execute(tx)
Debug.Print "The_Prist", x
Next x
RE.Pattern = "\[[^[]+\]" ' Igor Goncharenko
For Each x In RE.Execute(tx)
Debug.Print "IgGonch", x
Next x
RE.Pattern = "\w*.xlsm" ' bigorq
For Each x In RE.Execute(tx)
Debug.Print "bigorq", x
Next x
x = tx: If TextBetweenSeps(x, "[", "]", True) Then MsgBox Join(x, vbLf)
End Sub
'====================================================================================================
' https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=78513&TITLE_SEO=78513-izvlecheniya-dannykh-iz-skobok
Function TextBetweenSeps(tmp, delL$, delR$, MsgFalse As Boolean) As Boolean ' получаем массив элементов из разделителей
Dim arrOut(), i&
Dim lPos&, rPos&, lLen&, rLen&
lLen = Len(delL): rLen = Len(delR): rPos = -rLen + 1
ReDim arrOut(Len(tmp) \ 2)
Do
lPos = InStr(rPos + rLen, tmp, delL)
If lPos = 0 Then Exit Do
rPos = InStr(lPos + lLen, tmp, delR)
If rPos = 0 Then Exit Do
i = i + 1: arrOut(i) = Mid$(tmp, lPos + lLen, rPos - lPos - lLen)
Loop
If i = 0 Then
If MsgFalse Then MsgBox "В строке «" & tmp & "» значения между разделителями «" & delL & "» и «" & delR & "» — НЕ НАЙДЕНЫ!", vbCritical, "Text_Betweenseps"
Exit Function
End If
ReDim Preserve arrOut(i): tmp = arrOut: TextBetweenSeps = True
End Function
'====================================================================================================
Бахтиёр: почему objRegExp.Global = False не помогает?
насколько я понимаю, глобал отвечает за продолжения поиска после первого совпадения и его отключение не позволит найти больше одного SubMatches → Объект RegExp (справка)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Все 3 предложенных шаблона RegExp работают Добавил скрин, обновил код и файл в #6
Изменено: Jack Famous - 25.01.2022 10:33:06(Модеры сообщения удаляют/объединяют, а ссылки на пункты (которые съехали) не правят)))))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄