Tak se po prosincové dovolené vracím k počítači a první záznam v novém roce se nebude zabývat Javou, ale OpenOffice.org. V konferenci users@cs.openoffice.org se řešilo, jak poskládat dohromady hodnoty buněk ze sloupce Calcu do jednoho stringu s oddělovačem mezi hodnotami.
První nápad, který se objevil bylo využití klasické funkce CONCATENATE
:
=CONCATENATE(A1;"oddelovac";A2;"oddelovac";A3)
Už toto může být dost náročné při více hodnotách ve sloupci. Ale v konferenci přibyl požadavek na ošetření prázdných buněk, které nemají být ve výsledném seznamu. Nový kód byl:
=CONCATENATE(IF(NOT(A1="");CONCATENATE(A1;",");"");IF(NOT(A2="");CONCATENATE(A2;",");"");IF(NOT(A3="");CONCATENATE(A3;",");""))
Tady už se v tom začíná člověk ztrácet navíc nám za poslední hodnotou zůstává oddělovač. Tak vylepšíme:
=LEFT(CONCATENATE(IF(NOT(A1="");CONCATENATE(A1;",");"");IF(NOT(A2="");CONCATENATE(A2;",");"");IF(NOT(A3="");CONCATENATE(A3;",");"")); LEN(CONCATENATE(IF(NOT(A1="");CONCATENATE(A1;",");"");IF(NOT(A2="");CONCATENATE(A2;",");"");IF(NOT(A3="");CONCATENATE(A3;",");""))) - 1 )
Tohle už je nepoužitelné. Takže začneme úplně znovu. Do dokumentu si vložíme makro (Nástroje > Makra > Správce maker > OpenOffice.org Basic...)
Public Function MyConcat(aRange, aSplitter as String)
Dim tmpResult As String
Dim i, j as Integer
tmpResult = ""
For i = LBound(aRange(),2) To UBound(aRange(),2)
For j = LBound(aRange()) To UBound(aRange())
if aRange(j,i) <> "" And aRange(j,i) <> 0 then
if tmpResult <> "" then
tmpResult = tmpResult + aSplitter
end if
tmpResult = tmpResult + aRange(j, i)
end if
Next
Next
MyConcat = tmpResult
End Function
A nyní už můžeme vesele použít konstrukci:
=MyConcat(A1:A3;",")
Více informací o práci s makry můžete najít v OpenOffice.org How-To dokumentech. Doporučuji podívat se hlavně na:
Komentáře