07.09.2021, Vladimír Klaus, navštíveno 1483x

MS Excel
MS Office
Visual Basic

MS Excel v základu bohužel nepodporuje regulární výrazy. Tedy třeba ve vzorečku, kterým byste chtěli složitěji vykousnout nějaká data, tak není toto možné zadat regulárním výrazem. A pokoušet se o to nějakou primitivní vyhledávací funkcí nedává smysl. Takže kudy do toho? Pokud se nebojíte maker, můžete si připravit vlastní funkci, která bude umět pracovat s regulárními výrazy a kterou pak použijete ve vzorečku.

V otevřeném Excel souboru použijte Alt+F11, abyste se dostali do Visual Basicu. Tam si založte nový modul.

MS Excel a regulární výrazy, obr. 1

Do tohoto modulu vložte následující funkci.

Function RegexExtract(ByVal aZdroj As String, ByVal aVyraz As String) As String

Dim allMatches As Object
Dim RegEx As Object
Set RegEx = CreateObject("vbscript.regexp")
Dim i As Long, j As Long
Dim result As String

Rem Podle čeho se bude hledat
RegEx.Pattern = aVyraz
RegEx.Global = True

Rem Získáme všechny části, které vyhovují hledání
Set allMatches = RegEx.Execute(aZdroj)

Rem Nyní části spojíme...
For i = 0 To allMatches.Count - 1
    result = result & allMatches.Item(i).Value
    If allMatches.Count - 1 > i Then result = result + ";"
Next

Rem náhrada m2 a dalších znaků
result = Replace(result, "m2", "")
Rem speciální náhrada m²
result = Replace(result, "m" + ChrW(178), "")
result = Replace(result, " ", "")
result = Replace(result, ",", "")
result = Replace(result, ".", "")

Rem oříznutí mezer
RegexExtract = Trim(result)

End Function

Zcela zásadní je vytvoření objektu na práci s regulárními výrazy:

Set RegEx = CreateObject("vbscript.regexp")

Pak už jen ve vlastním Excelu tuto funkci použijte. Já jsem měl vzorová data, kde bylo třeba získat informace o velikostech pozemků. Bylo tam pochopitelně několik komplikací, jako jsou různé formáty nebo třeba více údajů v jedné buňce.

MS Excel a regulární výrazy, obr. 2

Nakonec jsem připravil tento regulární výraz, který pokrýval různé speciality, včetně mezer, různě zadaných m2 apod.

(\d+)?( |.(\d+))(( ?m2)|( ?m²))

Výsledek byl překvapivě dobrý, stačilo už jen odstranit nevhodné texty pomocí pár náhrad, ale to je již patrné z výše uvedeného scriptu. Chytrý kód pak byl schopen sestavit i více výsledků vyhovující hledanému výrazu.

MS Excel a regulární výrazy, obr. 3

Za zmínku stojí asi také hledání m2, což je v Excelu opravu trochu oříšek, ale nakonec najdete, že je třeba použít kód 178, resp. 0178. Ale v makru není možné zadat tento znak přímo, proto musíte použít funkci ChrW.

Zdroje: