Tak vzorec makrem je níže, použije se =HODN(adr) přičemž adr je buňka ze které se bude brát text který se má nahradit, tedy např. do buňky B2 dáte =HODN(A2).
Global pole()
Function HODN(optional s$) as string 'vrátí nahrazení data z buňky v proměnné 's' dle toho co je zadáno v prvních dvou sloupcích v listu 'seznam'
on local error goto konec 'při chybě neotravovat
const sList="seznam" 'list s náhradami - bacha ať v něm nejsou prázné řádky, zbytečně by to zpomalovalo nebo možná i blblo
dim oDoc as object, oList2 as object, oCur as object, oRange as object, i&, a$, b$
oDoc=thisComponent
oList2=oDoc.Sheets.GetByName(sList) 'jméno listu odkud se budou čerpat data pro nahrazování
oCur=oList2.createCursor()
oCur.goToEndOfUsedArea(true)
if ubound(pole)=-1 then pole=oCur.getDataArray 'data pro substituční pole, když není pole vytvořeno tak jej načte z listu s náhradami
for i=lbound(pole) to ubound(pole)
a=pole(i)(0) 'co nahradit
b=pole(i)(1) 'čím nahradit
s=join(split(s,a),b) 'nahrazení v řetězci
next i
HODN=s
konec:
End Function
Bacha na to když makro budete mít v jiné knihovně než v daném sešitě, to se vám pak po načtení sešitu neprovede, ale po otevření sešitu budete muset dát aktualizovat vzorce.
Když upravíte data v listu seznam, tak budete muset zavřít Libre a načíst soubor znova, aby se v každém vzroci zbytečně nenačítala ta substituční data. Když tohle nebudete chtít absolvovat, tak si zakomentujte tu podmínku if ubound(pole)… a na další řádek si z ní dejte to pole=oCur…, ale pak se vám to nejspíš celé notně zpomalí. Ale jak jsem zkoušel tak to nemusí to fungovat pořádně, to zavření Libre a načtení sešitu znova je asi nejlepší.
Taky pokud budete mít stovky a víc těch náhrad a ten vzorec v mnoha buňkách, tak to nebude nijak závratně rychlé. Ukázka v souboru zde: uprava2.ods