Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 27. 3. 2013 11:19:34

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Spouštění SUB pomocí FUNCTION

Zdravím. Mám problém s tím, že bych chtěl makro (Sub) spouštět pomocí funkce, která makru předá parametr a "spustí ho".
Problém je v tom, že v SUB (subroutine spouštěné z function) ani ve Function nemůže být obsluhovaná "cellRange". Tedy specificky ani jednotlivé buňky, ani pole buněk. Function dokonce nevypíše ani běžnou array. Vždy vypíše jen první hodnotu z array.
   Makra chodí jak mají, ale jakmile je spustím z function, vyhazují chybu na ".set". Neobešel jsem to ani pomocí kopírování schránkou. Function prostě běží na všech následných sub a Func. Při tom blokuje právě adresné odkazy. Samozřejmě nepomáhá ani změna předávání proměnných odkaz/ByVal, mastartování "mezimakra", které by se mohlo spustit a Func. by se měla ukončit - neukončí se ani na Exit, a dokonce ani na stop. (makro spuštěné z makra bez funkce funguje).
   

   Dotaz: Existuje nějaký způsob jak takovéhle chování function obejít? Tedy spustit buď nějakou procedůru přímo jako Function, nebo makro spuštěné z Func, a sice tak aby šly obsloužit RangeByName, nebo RangeByPosition, a nebo jen array() - celá - ne jen první hodnota. 


   Googlil jsem 3 poslední dny a nic. Předem děkuji za nápady.

Editoval neutr (27. 3. 2013 11:21:19)


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#2 27. 3. 2013 20:13:09

sedlacekdan
Moderátor
Místo Nehvizdy
Registrace: 21. 6. 2010
Příspěvků: 617

Re: Spouštění SUB pomocí FUNCTION

Není mi moc jasné zadání, potřeboval bych nějaký konkrétní příklad.


Takto předpokládám, že je chyba při deklaraci proměnných. Pokud chcete předávat funkcí proměnné do makra, nemůžete použít funkci jako takovou (funkce vždy vrací výsledek). Výsledek který potřebujete musíte předat do jiné proměnné, která není výsledkem funkce. Tato proměnná ovšem musí být deklarována mimo funkci (na začátku modulu) aby byla dostupná pro všechny makra a funkce. Ovšem pak už to nemusí být funkce ale makro, které definuje proměnné.


Pokud je funkce spuštěna např. tlačítkem je vše OK, ale pokud ji volám přímo ze sešitu, nic se nestane (protože se nenačtou deklarované proměnné).

REM deklarace proměnných
dim testovaci_text
dim bunka1 as object
dim bunka2 as object

REM přiřazení hodnot / adres

function pokus_function
bunka1 = thisComponent.sheets(0).getCellRangeByName("A1")
bunka2 = thisComponent.sheets(0).getCellRangeByName("A2:A10")
testovaci_text = "Zelená "
REM zavoláme makro
pokus_sub
end function


REM provedení makra

Sub pokus_sub
bunka1.string = testovaci_text
bunka1.CellBackColor = RGB(0,55,55)
bunka2.CellBackColor = RGB(150,150,150)
print "Hotovo "
End Sub

;o)


Linux Mint 16 Petra - Apache OpenOffice 4.0.1
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#3 27. 3. 2013 20:22:44

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Spouštění SUB pomocí FUNCTION

To je v podstatě ono. Opravdu mi jde o to, abych funkcí zadanou z buňky "=FunctionX() zadal úsek více buněk. Proto jsem se pokusil volat funkcí makro a po spuštění makra funkci uzavřít. Ale zatím mi to nejde. Nyní testuji "Cursor". Funkce má implicitně nastaven cursor do "domovské buňky". Pokouším se to rozšířit z jediné buňky na pole buněk.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#4 27. 3. 2013 23:56:31

lp.
Člen
Registrace: 24. 9. 2009
Příspěvků: 842

Re: Spouštění SUB pomocí FUNCTION

Myslíte něco takového:

function test(a,b,c) as variant
dim pole(1 to 3) as variant
    pole(1) = a
    pole(2) = b
    pole(3) = c
    test = pole
end function

Vložit matici (ctrl-shift-enter):

=test(a1;a2;a3)


nebo 

function test1(par as variant) as variant
    test1=par
end function

=test(a1:a3)

??

Editoval lp. (27. 3. 2013 23:59:05)

Offline

#5 28. 3. 2013 07:38:22

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Spouštění SUB pomocí FUNCTION

Děkuji za nápady, ale není to moje potřeba. Abych vysvětlil problém - neodkazuji na nějakou array v sešitě. Generuji array generátory různého typu. Abych zbytečně nepopisoval - například takto:

Function Combo51 '(nn as integer, kk as integer) ' = předávání parametrů
   DIm  oDoc, oSheets, oSheet As Object
   Dim No, comb as double
   Dim nn, kk as integer 'Při předávání parametrů vyřadit
   Dim sText, sTex as string
   nn = 7 'Proměnná "n" - počet všech možných - Při předávání parametrů vyřadit
   kk = 5 'Proměnná "k" - počet všech možných - Při předávání parametrů vyřadit
   comb = 1                    'Výpočet kombinací
For c = 0 To kk-1            'Výpočet kombinací
comb = comb*((nn-c)/(c+1))    'Výpočet kombinací
Next c                        'Výpočet kombinací
'print comb  'Kontrola počtu kombinací "n" nad "k" - porovnáme v sešitě s =COMBIN(7;5)
   Dim data(0 to comb-1) as variant
   Dim Rowarray() 'as string 'as variant ' stejně potvora nechodí
'sText = "={"     'Verze 1 - 1 vytváří string buď ={a,b,c,d,e|..a,b,c,d,e}, nebo ={a;b;c;d;e|..a;b;c;d;e}
for n = 0 to nn -   5
for e = n+1 to nn - 4 
  for u = e+1 to nn - 3
   for t = u+1 to nn - 2
    for r = t+1 to nn - 1
      IF No < Comb - 1 Then 'Podmínka průběžné řádky mimo posledního
      sTex = n+1 & ";" & e+1 & ";"& u+1 & ";"& t+1 & ";"& r+1 & "|" 'takhle se středníkem by to mělo udělat 5 sloupců, s čárkou jen jeden
      'sText = sText & sTex      'Verze 1
      'data(No) = sTex           'Verze 2
      data(No) = Rowarray(sTex)  'Verze 3
      No = No + 1
      ElseIF No = Comb - 1 Then 'Podmínka pro poslení řádek bez "|", nebo ";"
      sTex = n+1 & ";" & e+1 & ";"& u+1 & ";"& t+1 & ";"& r+1 'takhle se středníkem by to mělo udělat 5 sloupců, s čárkou jen jeden
      'sText = sText & sTex      'Verze 1
      'data(No) = sTex           'Verze 2
      data(No) = Rowarray(sTex)  'Verze 3
      No = No + 1           
      End If     
    next r
   next t
  next u
next e
next n
'sText = SText & "}" 'Verze 1  Verze 1 je asi dost nadějmá, jenže ji limituje kapacita 1 buňky
'Combo51 = sText     'Verze 1  Verze 1 odzkoušena na různé způsoby například místo složených závorek, jen obyčejné, hranaté ap
Combo51 = data()     'Verze 2 a 3 - verze 3 by byla žádoucí, ale nerozchodil jsem ji, verze 2 načte "pole" ale bez hodnot
End Function

Je to v podstatě jen iterátor s vnořenými cykly For. Problémů s takovým aparátem je hodně. Například to, že se špatně (spíš vůbec) nedá přerušit a nebo zalomit do nového sloupce, nebo listu. Není to příliš vhodné pro maticové provedení (v jedné buňce). A tak dál
   Abych popsal co by to mělo udělat dávám makro (je jen pracovní, není vyšperkované..) Toto makro píše do jedné buňky string (s podobou .CSV), ale mám také provedení do 5-ti sloupců jen s čísly, nebo s jinými iterátory - variací bez opakování i s opakováním, jak omezené třídou, tak úplně na třídě nezávislé ap.

Sub Combo5 '(ByVal nnn as integer)
sTimer0 = Timer()
   DIm  oDoc, oSheets, oSheet As Object
   Dim No, comb as double
   Dim nn, kkk, kk as integer
   Dim sText as string
   nnn = 20
   kkk = 5
   nn = nnn
   kk = kkk
   comb = 1                    'Výpočet kombinací jako limita počtu "i"
For c = 0 To kkk-1            'Výpočet kombinací jako limita počtu "i"
comb = comb*((nn-c)/(c+1))    'Výpočet kombinací jako limita počtu "i"
Next c                        'Výpočet kombinací jako limita počtu "i"
Dim  data (1 to comb) 'Nutno nastavit
oDoc = ThisComponent
oSheets = oDoc.Sheets 
Dim oCell As Object
oCell = ThisComponent.CurrentController.getSelection()
With oCell.RangeAddress
SH = .Sheet
SC = .StartColumn
SR = .StartRow
End With
IF SR + comb > 1048575 Then
print "Překročena kapacita sešitu - makro nebude spuštěno"
Stop
end if

No = 1
for n = 0 to nn -   5
for e = n+1 to nn - 4 
  for u = e+1 to nn - 3
   for t = u+1 to nn - 2
    for r = t+1 to nn - 1
      sText = n+1 & "," & e+1 & ","& u+1 & ","& t+1 & ","& r+1
      data(No) = Array( sText ) 'Také je možné vložit obsah sTextu do Array
      No = No + 1
    next r
   next t
  next u
next e
next n

oSheet = oSheets.getByIndex(SH)
Range = oSheet.getCellRangeByposition(SC,SR,SC,SR + comb -1)
Range.setDataArray( data())

sTotal = Timer() - sTimer0
Print "Doba " + sTotal + " sec za kterou bylo vytvořeno " & comb & " Kombinací 5. třídy z celku " & nnn
End Sub

Takovéhe makro jsem se pokoušel spustit funkcí, která mu předávala "n" ("k" je pevně dané). Jde jen o to, aby se kombinace vysypaly zadáním ze sešitu například =COMBODY5("n"), ale ve výsledku jako neomezená funkce =COMBODY("n";"k"). Ještě jednou dík za nápady


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#6 28. 3. 2013 09:13:02

lp.
Člen
Registrace: 24. 9. 2009
Příspěvků: 842

Re: Spouštění SUB pomocí FUNCTION

Viz první příklad, tam máte všechno, funkce na základě zadaných parametrů generuje a vypisuje pole. Funkce musí být as variant a zadává se jako matice (ctrl-shift-enter)). Pokud výsledek má vyplnit sloupce, bude třeba deklarovat pole dvourozměrně.

To aby funkce měnila "zevnitř" jiné buňky je dost špatný nápad. Může ale vrátit pole jako výsledek a to je jednoduché.

Editoval lp. (28. 3. 2013 09:15:26)

Offline

#7 28. 3. 2013 10:38:58

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Spouštění SUB pomocí FUNCTION

Vyzkouším to. Bylo by to určité řešení, ale měl jsem představu, že do sešitu napíšu funkci bez toho trojhmatu, na to lidi nejsou zvyklí. Zatím se mi nedaří. Možná to bude jediné řešení. Děkuju za nasměrování. Písnu až to otestuju.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#8 28. 3. 2013 18:32:35

lp.
Člen
Registrace: 24. 9. 2009
Příspěvků: 842

Re: Spouštění SUB pomocí FUNCTION

neutr napsal(a)

Vyzkouším to. Bylo by to určité řešení, ale měl jsem představu, že do sešitu napíšu funkci bez toho trojhmatu, na to lidi nejsou zvyklí.

Tak vyrobte doplněk.

Offline

#9 28. 3. 2013 20:17:53

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Spouštění SUB pomocí FUNCTION

Máte pravdu - tedy jako většinou vždy. Paradoxní je, že by to měla být součást (příloha - šablona) pro připravované rozšíření. To obsahuje vzorce. V hlavní nabídce generované z maker, v přílohách jsou verze bez maker, která by měla fungovat také například v Gnumeric, Excel a tak dál.


   Součástí příloh je také list s čistou teorií, list "manipulací" se vzorci, list algoritmus a list příklady. Každý pojem má svou přílohu a navíc by tam měla být příloha jak co udělat - nahrávání například vzorců, nějaké běžně používané makra a tak dál.
   Tahle funkce, kterou řeším by byla integrována mezi vzorce, ale měla by se dát kopírovat i samostatně. Představa je taková, že uživatel si osahá vzorce z hlavní nabídky, soubor šablon přejmenuje podle sebe a rozšíření odinstaluje. Funkce COMBODY, VARBODY ap. by měly běhat i bez rozšíření a specializovaných XML souborů. Níže uvedená verze je jen skutečný polotovar a přílohy tam jakoby jsou, ale jsou prázdné. Budou tagované ze záložky "more".
Rozšíření ve výstavbě


   Původně jsem s tím nechtěl otravovat, protože v minulosti na žádost o posouzení odpověděl jen a pouze uživatel lp. Ale potřeboval bych aby to někdo otestoval na Linuxech. A jsou tu další problémy, se kterými se v dohledné době nemohu utkat. Nemám Excel, ale vyexportoval jsem vzorce do XLS - v OOo máme nejnovější verzi 97/2000. No a novější berze Excelu mi přepisuje vzorce. Tam, kde je nepřepíše, udělá chybový růžek. Faktem je, že jsem přepisování vzorců našel jen u variací bez opakování 4. třídy. 3. a 5. třída snad chodila dobře. Ale v AOO i Lo mi to chodí normálně. Takže cestou je asi přímé kopírování schránkou, ale nemám na to čas, ani Excel.


   Takže bych potřeboval dost pomoct s testováním. Nic podobného neexistuje mimo světlé vyjímky. Zpracoval to Ing. Petr Pecháček
oficír.cz kde je link na zazipované sešity : Excel čísla Po stažení se rozpakuje foldr ve kterém jsou dva sešity. Ten správný je vybaven maticovými vzorci, které sice v OOo nefungují, ale jsou čitelné. Stránky jsou poměrně zajímavé je tam například stránka Officír o Calcu. Dost jiných.


   Takže ještě jednou chtěl bych Vás poprosit o to aby jste to otestovali, nežli to pustím so světa. Předem děkuji :-)


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

Zápatí