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

#1 8. 8. 2018 08:19:53

MilanUhrak
Člen
Registrace: 1. 11. 2005
Příspěvků: 39

vložení vzorce makrem - divné chování VYŘEŠENO

zdravím,

Do sloupce 10 všude tam, kde je v řádku platná hodnota ve sloupci 0 vkládám vzorec.

A zase je něco špatně.  Vizuálně vzorec odpovídá zadání, např na ř. 11 :

=IF(OR(H11="Petr";H11="Pavel");I11*0,24;IF(H11="Havel";I11*0,29;""))

ale v buňce svítí #NAME? ... když na buňku se špatným vzorcem klepnnu, a do vzorce přidám na konec mezeru, pak ji smažu, a odentruju, vzorec náhle funguje a zobrazí výsledek...


stejně tak na buňku se "špatným" vzorcem klepnu, klepnu na ikonu nástroje "Vzorec" a v nástroji se objeví správný výsledek. dám OK, a vzorec v buňnce už taky zobrazuje správný výsledek.

Co je zase špatně ?

FOR row = 2 TO rows
	oCell = oSheet.getCellByPosition( 10, row-1 )
	form = "=IF(OR(H" & row & "=""Petr"";H" & row & "=""Pavel"");I" & row & "*0,24;IF(H" & row & "=""Havel"";I" & row & "*0,29;""""))"
	oCell.setformula(form)
NEXT row

Verze: 6.0.4.2
ID sestavení: 00m0(Build:2)
Vlákna CPU: 2; OS: Linux 4.12; Vykreslování UI: výchozí; VCL: kde4;
Národní prostředí: cs-CZ (cs_CZ.UTF-8); Calc: CL

Editoval MilanUhrak (8. 8. 2018 12:16:39)

Offline

#2 8. 8. 2018 10:51:38

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

Re: vložení vzorce makrem - divné chování VYŘEŠENO

To je složitější :

=IF(
    OR(H11="Petr";H11="Pavel")=1;
    Tady má být co když je true I11*0,
    Tady by mělo být co když Falze 24;
       Tady to už je navíc IF(H11="Havel";I11*0,29;""))

     Vypadá to spíš jako IFS(podmínka;True; podmínka; true; podmínka; true;;;)
Ten druhý připad je také takový, ale jako když je to neúplný přepis z Basicu takže nelze zkontrolovat "uvozovkování".

FOR iCount = 2 TO rows
	oCell = oSheet.getCellByPosition( 10, iCount-1 )
	form = "=IF(OR(H" & iCount & "= Petr";"H" & iCount & "= Pavel");"I" & iCount & "*0,24;IF(H" & iCount & "= Havel";"I" & iCount & "*0,29;""""))"
	oCell.setformula(form)
...schází konec cyklu, ale raději jsem nahradil "row" výrazem iCount.

     Pak je otázkou právě jak vypadá vzorec ve výsledku. Vidím že by to měl být ten horní příklad, ale ten je špatně. Uveďte požadovaný (správný) tvar v sešitě (finální po zápisu makra).

Editoval neutr (8. 8. 2018 11:10:56)


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

#3 8. 8. 2018 12:11:03

MilanUhrak
Člen
Registrace: 1. 11. 2005
Příspěvků: 39

Re: vložení vzorce makrem - divné chování VYŘEŠENO

Dobrý den,
děkuji za snahu, ale problém byl někde jinde

vzorec říká, pokud v H je petr nebo pavel, tak I*0.24, jinak pokud H=havel tak I*0.29, a když ani jedno tak "" . if .. elseif ... end

špatně bylo do vzorce zapisovat "*0,24", správně mělo být "*0.24" a stejně tak druhý koeficient 0,29 ... calc tečku pochopí a převede ji na čárku, ale čárce asi nerozumí smile a vzorec pak nechápe ( asi ty různé národní zvyklosti )

jinak vzorec je kompletní, myslím že mu nic nechybí , o ano, u smyčky mi vypadlo next, ale jinak je celá ...

nic víc se tam ve smyčce již neděje ....


Taky u vás musí haprovat ty uvozovky ... vzorec je v uvozovkách a stringy taky, musí tam být dvojité, jinak to vyhnije

Ještě jednou děkuji za odpověď.

Milan

Editoval MilanUhrak (8. 8. 2018 12:16:13)

Offline

#4 8. 8. 2018 18:36:45

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

Re: vložení vzorce makrem - divné chování VYŘEŠENO

Tak podle přepsaného vzorce z Editoval MilanUhrak (Dnes 12:16:39)
na tvar to chodí právě s čárkami a nikoliv s tečkami.

=IF(OR(I11="Petr";I11="Pavel")=1;J11 * 0,24;IF(I11="Havel";J11 * 0,29;""))

     Původní vzorec vypadal jinak :

=IF(OR(H11="Petr";H11="Pavel");I11*0,24;IF(H11="Havel";I11*0,29;""))

1. =IF(OR(H11="Petr";H11="Pavel"); = chybně anotace schází = 1, ale to by asi u IFS(;;;;;) nevadilo
2. CHYBNĚ celý vzorec =IF(Podmínka - chybně;True správně;Falze správně;nesmysl 3.parametr;nesmysl 4.parametr))
2. SPRÁVNĚ mělo být =IF(Podmínka OR(;)=1;True správně;Falze mělo být IF(podmínka;True;False))
3. SPRÁVNĚ IFS mohlo být =IFS(H11="Petr";I11*0,24;H11="Pavel";I11*0,24;H11="Havel";I11*0,29;H11="";"")
     Takže dík nejistotě jak má vzorec ve výsledku vypadat jsem vypisoval do cyklu vzorec bez "uvozovkování", ale pak jsem to vzdal a napsal že potřebuji originál který má být v buňce. Varianta vzorce mohla být ještě jiná například místo zanořených IF součin =IF(podmínka;true;1)*IF(podmínka;true;1)*IF(podmínka;true;1) - tedy součin jednoduchých dotazů IF a poslední vzorec mohl být testem na chybu *IF(ISERROR(buňka);0;1). Také šlo postavit vzorec opačně dotazem na Havla a do true dotaz na Havla :
=IF(OR(H11="Petr";H11="Pavel";H11="Havel")=1;IF(H11="Havel";I11*0,29;I11*0,24;);"")
     Variant by se našlo mnoho. Například pro zápis do cyklu makra by se hodilo deklarovat proměnné s uvozovkami jako string proměnné a ty pak načítat už s uvozovkami. Například :
Dim Petr, Pavel, Havel as string
Petr = "H11=""Petr"";" : Pavel = "H11=""Petr"";" : Petr = "H11=""Havel"";"
Tím se vyhneme problému s vícenásobnými uvozovkami uvozovkami ve složitějších formulacích. Také je tam ještě oprava toho "row", nebo "rows" - to jsou výrazy, které mají význam v při deklaracích řádků
například :

Sub Vyska_Sirka_2_UpravitVse
oDoc = ThisComponent 
oSheet = oDoc.getSheets().getByIndex(0) 
oRows = oSheet.Rows 
oColumns = oSheet.Columns 
oRows.Height=1000'1cm 
oColumns.Width=5000'5cm  
End Sub

     Proto může dojít ke kolizi oRows = oSheet.Rows Právě v cyklu kde je něco takového se stane chyba raz dva. To jsem pokládal za důležitější nežli to co je uvnitř cyklu.


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

#5 10. 8. 2018 11:19:30

MilanUhrak
Člen
Registrace: 1. 11. 2005
Příspěvků: 39

Re: vložení vzorce makrem - divné chování VYŘEŠENO

Teď fakt nechápu, co řešíte ...
Vícenásobné uvozovky jsou problém? pro koho ?

makro, tak jak jsem ho popsal FUNGUJE nejen u mne na Linuxu, ale -a to je hlavní - u kolegyně na Win.

Nebudu se hádat, jestli čárka nebo tečka ... s čárkou mi to házelo chybu, s tečkou to funguje a počítá přesně to, co chci.

	rows = num_rows( oSheet )
	
	If rows > 1 Then 
		mySetCellString( oSheet, 10, 0, "Provize" )
		FOR row = 2 TO rows+1
			oCell = oSheet.getCellByPosition( 10, row-1 )
			form = 
"=IF( 'pokud
    OR(
       H" & row & "=""Petr""; 'H = Petr  nebo
       H" & row & "=""Pavel"" 'H = Pavel
    );
    I" & row & "*0.029;         'zde bude I*0.029
    IF(H" & row & "=""Havel""; 'jinak pokud H = Havel 
      I" & row & "*0.024;      ' bude zde I*0.024
      """"                      ' jinak zde nebude nic
    ) ' prostě vnořená podmínka .. 
      ' formátování upraveno pro lepší porozumění, 
      ' přímo takto zkopírované do 
      ' editoru maker asi vyhodí při spuštění error
  )"
		'	oCell.setformula("=I"& row &"*0.024") toto je 
                '  zakomentovaný řádek,na kterém jsem zjistil, že 
                '  čárku nelze použít 
			oCell.setformula(form)
		NEXT row
	Else 
		msgbox "List 'Data' žádná data neobsahuje "
		Exit Sub
	End If

To je snad pochopitelné a nevím, kde v tom vidíte chybu, když to u mně funguje
Ještě jsem pozorněji  projel váš koment, no popravdě IFS ani neznám ( bohužel, je to tak sad ), tak jsem vnořoval ... jen detail.


Dále ... sloupec B obsahuje údaj, podle ḱterého seskupuji (místo prodeje ) a chtěl bych vytvořit sumy ze sloupců 8 (hodnota nákupu ) a 10 (vypočítaná v předchozím kroku provize ). Kdyby někdo nevěděl jak na to v makru ( vytvořit mezisoučty ) tak jsem našel toto zajímavé řešení :

   dim oSTColumns(1) as new com.sun.star.sheet.SubTotalColumn
   myRange = oSheet.getCellRangeByName( "A1:K"&rows+1 )
   oSTDesc = myRange.createSubTotalDescriptor(true) 
	
   oSTColumns(0).Column = 8 ' počítáme sloupec 8 
   oSTColumns(0).Function = com.sun.star.sheet.GeneralFunction.SUM ' funkce SUM
   oSTColumns(1).Column = 10 ' počítáme sloupec 10 
   oSTColumns(1).Function = com.sun.star.sheet.GeneralFunction.SUM ' funkce SUM
	
   oSTDesc.addNew( oSTColumns(), 2) 'seskupit podle sloupce 2
	
   myRange.applySubTotals( oSTDesc, True )

Fakt zajímavé ...

z toho množství dat, co tam mám, nakonec chci vidět jen seskupovací položku( sloupec 2 ) , sloupec 8 a 10. Ostatní skryju

	hide_col( osheet, 0 )
	hide_col( osheet, 1 )
	hide_col( osheet, 3 )
	hide_col( osheet, 4 )
	hide_col( osheet, 5 )
	hide_col( osheet, 6 )


sub hide_col( oTarSheet as Object, number as integer )
	Dim	oColumn as Object
	oColumn = oTarSheet.Columns.getByIndex( number )
	oColumn.IsVisible=False
end SUB

šikovné .. smile

jo a pak se ještě přepnu na list s mezisoučtama ( tlačítko, kterým se toto makro spouští je na samostatném listu, sekretářka si zaslaná data zkopíruje do listu "data" přepne se na list s tlačítkem a zmáčkne ...

toto je krapet kostrbaté, zachycené makro, ale jiné řešení, jak se přepnout na daný list jsem nenašel ..

	dim argsj(0) as new com.sun.star.beans.PropertyValue
	argsj(0).Name = "Nr"
	argsj(0).Value = 2
	document   = ThisComponent.CurrentController.Frame
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
	dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, argsj())

Andrew Pitonyak by to možná udělal hezčí, no ale funguje i toto, tak to nechám tak ...

Editoval MilanUhrak (10. 8. 2018 11:25:48)

Offline

#6 10. 8. 2018 12:08:58

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

Re: vložení vzorce makrem - divné chování VYŘEŠENO

MilanUhrak napsal(a)

Dále ... sloupec B obsahuje údaj, podle ḱterého seskupuji (místo prodeje ) a chtěl bych vytvořit sumy ze sloupců 8 (hodnota nákupu ) a 10 (vypočítaná v předchozím kroku provize ). Kdyby někdo nevěděl jak na to v makru ( vytvořit mezisoučty ) tak jsem našel toto zajímavé řešení :

   dim oSTColumns(1) as new com.sun.star.sheet.SubTotalColumn
   myRange = oSheet.getCellRangeByName( "A1:K"&rows+1 )
   oSTDesc = myRange.createSubTotalDescriptor(true)
   
   oSTColumns(0).Column = 8 ' počítáme sloupec 8
   oSTColumns(0).Function = com.sun.star.sheet.GeneralFunction.SUM ' funkce SUM
   oSTColumns(1).Column = 10 ' počítáme sloupec 10
   oSTColumns(1).Function = com.sun.star.sheet.GeneralFunction.SUM ' funkce SUM
   
   oSTDesc.addNew( oSTColumns(), 2) 'seskupit podle sloupce 2
   
   myRange.applySubTotals( oSTDesc, True )

Fakt zajímavé ...

     Nevím kde jste ten kód vzal, ale má chybný popis a já jsem se setkal s podobnou funkcí kvůli které jsem přepisoval mnoho knihoven a rozšíření. Jde o Tohle :
   oSTColumns(0).Column = 8 ' počítáme sloupec 8 Sloupce se počítají od nuly - v sešitě je to 9. sloupec - konkrétně sloupec "I"
   oSTColumns(1).Column = 10 ' počítáme sloupec 10 Sloupce se počítají od nuly - v sešitě je to 11. sloupec - konkrétně sloupec "K"
   oSTColumns(0).Function = com.sun.star.sheet.GeneralFunction.SUM ' funkce SUM
     Existuje funkce podobná COUNT podobná se SUM od té doby se to sice opravilo, ale já se těmto funkcím vyhýbám. Dělal jsem to několik týdnů. Za půl roku to opravili, ale už GeneralFunction.NĚCO nevěřím.


     Počítání s tečkou funguje buď v rámci Basicu - při výpočtech, nebo v sešitě pokud tento má výchozí nastavení angličtinu. Otestujte si v buňce nějaké číslo například do A1 5.2 a A2 5,2. Následně do B1 dejte =A1+1 a totéž do B2 = A2+1 a uvidíte že je to nemožné. Ve výsledku B1 se objeví #VALUE! - V B2 je to OK. Takže s tečkou ani náhodou - pokud nemáte anglickou lokaci jako výchozí, o čemž pochybuji, ale je to možné pro výstupy z eshopů, nebo podobně z technologických zařízení.


     Já vím, že bývá problém s nahráváním vzorců pomocí makra, nebo podobně úprava psaných maker. K tomu není solidní popis stejně jako k emulaci vzorců pro Basic. basic nemá tolik funkcí jako sešit, ale dají se napsat, nebo emulovat pro Basic. Takže nevědět není nic dehonestujícího. Technik (programátor, ale i každý odborník) nemusí vše vědět z hlavy, ale musí vědět jak to najít. A o tomhle je tohle fórum. Konec dobrý - všechno dobré.


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í