07.09.2021, Vladimír Klaus, navštíveno 1467x
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.
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.
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.
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: