čtvrtek 3. ledna 2008

OpenOffice.org - spojení obsahu buněk

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:

1 komentář:

Anonymní řekl(a)...

Paráda, moc pomohlo!!!