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

Odpowiedz Nowy wątek
2019-05-02 13:54
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

edytowany 4x, ostatnio: jaryszek, 2019-05-02 13:57

Pozostało 580 znaków

2019-05-02 15:42
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
A jak znaleźć exact match tutaj ? jesli bede miał tabele T_DATACENTERS to tez bede mial TRUE a powinien miec FALSE - jaryszek 2019-05-03 07:36
Skoro szukasz w textString ciagu T_DATACENTERS i on występuje to poprawnie działa wyszukiwanie. - dbuser 2019-05-06 09:15

Pozostało 580 znaków

2019-05-02 17:00
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

Co oznacza wykluczyć tylko cudzysłów z przodu? Napisz konkretnie czego szukasz i w czym. - dbuser 2019-05-06 09:17

Pozostało 580 znaków

2019-05-03 07:08
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

Nie lepiej użyć właśnie INSTR? - dbuser 2019-05-06 09:16

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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