[VBA]Regex - czy dany tekst występuje?

0

Cześć,

mam taki kod:

Sub Test()

Dim textString As String
Dim PatternToFind As String
Dim tablename As String

tablename = "T_DATACENTERSSOURCE"

textString = "=INDEX(INDIRECT(""T_DATACENTERSSOURCE[DATACENTER]""),MATCH([@RegionName],T_DATACENTERSSOURCE[LOCATIONID]),0))"
**PatternToFind = "(?!""" & tablename & ")"**

If IsNamePresent(textString, PatternToFind) = True Then
        MsgBox "ok"
End If

End Sub

Function IsNamePresent(ByVal inputString As String, testName As String)
    IsNamePresent = False
    With CreateObject("vbscript.regexp")
        .Global = True
        .IgnoreCase = False
        .Pattern = testName
        If .Test(inputString) Then IsNamePresent = True
    End With
End Function

Jest to tylko przykład na potrzeby tego tematu.

W całościowym makrze robię petlę i w kazdej formule (string), jesli znajde dokładną nazwę tabeli , która nie jest w funkcji "INDIRECT" - dodaje INDIRECT.

Czyli w przykładzie powyżej w ciągu textString dla tabeli T_DATACENTERSSOURCE[LOCATIONID] muszę dodać "INDiRECT".
Ale żeby nie kręcić się wkoło powinien znaleźć czy w danej formule są nazwy tabeli bez cudzysłowy z przodu (to wskazuje czy była użyta funckja INDIRECT czy nie).

Próbuję napisać taki pattern do regex'a, który wskaże czy w danej formula jest dokładna nazwa tabeli bez " z przodu.
Dokładna czyli "T_DATACENTER" juz nie powinno pasować.

Jak to zrobić?

Kod powyżej nie działa (patternToFind jest błędny)
Dzieki za pomoc,
Jacek

1

Jeśli dobrze zrozumiałem

Sub Test()

Dim textString As String
Dim PatternToFind As String
Dim tablename As String

tablename = Replace(Replace("T_DATACENTERSSOURCE[LOCATIONID]", "[", "\["), "]", "\]")

textString = "=INDEX(INDIRECT(""T_DATACENTERSSOURCE[DATACENTER]""),MATCH([@RegionName],T_DATACENTERSSOURCE[LOCATIONID]),0))"

PatternToFind = "(.*)[^""]" & tablename & "[^""](.*)"

If IsNamePresent(textString, PatternToFind) = True Then
        MsgBox "ok"
End If

End Sub

Function IsNamePresent(ByVal inputString As String, testName As String)
    IsNamePresent = False
    With CreateObject("vbscript.regexp")
        .Global = True
        .IgnoreCase = False
        .Pattern = testName
        
        If .Test(inputString) Then IsNamePresent = True
    End With
End Function

0

Cześć,

dziękuję bardzo!

Czyli, aby sprawdzić i wykluczyć tylko cudzysłów z przodu powinien użyć? (bo widzę, że z tyłu też dałes warunek na cudzysłów?):

PatternToFind = "(.)[^""]" & tablename & "(.)"```


Dziekuje,
Jacek

0

I jeszcze pytanie,

czy w regex mogę sprawdzić od którego znaku mam pierwsze wystąpienie danego słowa?
czyli zwrócić long kiedy pattern zostanie znalezniony (coś takiego jak instr)?

Jacek

1 użytkowników online, w tym zalogowanych: 0, gości: 1