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

#1 4. 6. 2014 18:35:31

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 520

Filtr KT se zadáním údaje prázdné VYŘEŠENO

Dobrý den, mám makro na filtr v kontigenční tabulce (KT). Funguje bezvadně až na to, že nevím jak zadat že chci aby mi vyfiltrovalo prázdné buňky. V normální filtru KT je možnost zadání - prázdné- nebo - neprázdné -, ale nevím jak to říct tomu makru. Neřešil jste to někdo? Do proměné "projekt" jsem zkoušel načíst 0, "", - prázdný -, (prázdné), nic nefunguje. Zároveň ovšem ta proměná bude někdy obsahovat text. (Samozřejmě to lze vyřešit pomocným sloupcem ve zdrojové tabulce, který bude naplněn nějakým pomocným znakem, takže budu filtrovat tento pomocný znak, ale to není tak elegantní :-)

sub filtr_kontingencni_tabulky

'nastavíme proměné filtru
	Dim FilterFields(1) as New com.sun.star.sheet.TableFilterField
	oController = ThisComponent.CurrentController
	oSheetObj = oController.ActiveSheet
	Tables = oSheetObj.DataPilotTables()   'Tables has all the DataPilot Tables in the Active Sheet

'a začínáme fitrovat KT, sloupce začínají od nuly
	id =  oSheetObj.getCellrangeByName("AA1").Value 'tady mám nějakou proměnou, dle níž fitruji
	FDes = Tables(0).getFilterDescriptor
	FilterFields(0).Field = 1
	FilterFields(0).Operator = com.sun.star.sheet.FilterOperator.EQUAL
	FilterFields(0).IsNumeric = True
	FilterFields(0).NumericValue = id

	projekt =  oSheetObj.getCellrangeByName("X105").String 'a tady je další kriterium s logickym AND
	FilterFields(1).Field = 9
	FilterFields(1).Operator = com.sun.star.sheet.FilterOperator.EQUAL
	FilterFields(1).IsNumeric = False
	FilterFields(1).StringValue = projekt
	FilterFields(1).Connection = com.sun.star.sheet.FilterConnection.AND
	
	FDes.FilterFields = FilterFields
	'konec filtru
	
end sub	

	
	

Editoval ludviktrnka (4. 6. 2014 20:57:45)


LibreOffice 5.2.2.2

Offline

#2 4. 6. 2014 20:55:17

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 520

Re: Filtr KT se zadáním údaje prázdné VYŘEŠENO

... tak jsem to nakonec vygůglil. Operátor se musí změnit na EMPTY, ovšem kombinace se zadáním jiného textového kriteria se musí vyřešit podmínkou

	projekt =  oSheetObj.getCellrangeByName("X105").String 'a tady je další kriterium s logickym AND
	FilterFields(1).Field = 9
	FilterFields(1).Connection = com.sun.star.sheet.FilterConnection.AND
		
	if projekt <> "nic" Then
		FilterFields(1).Operator = com.sun.star.sheet.FilterOperator.EQUAL
		FilterFields(1).IsNumeric = False
		FilterFields(1).StringValue = projekt
	else
		FilterFields(1).Operator = com.sun.star.sheet.FilterOperator.EMPTY
	endif

LibreOffice 5.2.2.2

Offline

#3 5. 6. 2014 08:08:51

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

Re: Filtr KT se zadáním údaje prázdné VYŘEŠENO

Na to je specializovaná funkce ISEMPTY(parametr variant). Dotaz lze psát potom takto :
IF ISEMPTY(výraz deklarované proměnné variant)= true THEN
IF ISEMPTY(výraz deklarované proměnné variant)= false THEN
Vlastní výsledek funkce je Boolean (0,1) takže tam ani to "=true (nebo false)" být nemusí, ale je to lepší. Problém je s tím, že Vám to asi nespolkne (a asi ani nenahláší chybu) jiný typ proměnné. Například to asi nevezme přímo Cell.string, nebo Cell.value, ale budete potřebovat zadeklarování proměnné - například
Dim xy as variant
xy = Cell.string
............................................. nebo :
NOT ISEMPTY(xy). Slůvko NOT je negací a znamená "ve spojení s ISEMPTY není prázdné" a je to shodné (pokud se nemýlím) s výrazem ISEMPTY = false.

Editoval neutr (5. 6. 2014 08:17:52)


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

#4 5. 6. 2014 10:00:00

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 520

Re: Filtr KT se zadáním údaje prázdné VYŘEŠENO

Díky, funguje to. Jestli to dobře chápu ISEMPTY je pro proměnou string totéž co nula pro proměnou value. Protože ISEMPTY pro proměnou.value = 0 dává false. Takže budu-li pracovat s čísly použiju normálně if xy = 0 then a budu-li pracovat s textem použiju if ISEMPTY(xy) then. Chápu to správně?

Editoval ludviktrnka (5. 6. 2014 10:30:41)


LibreOffice 5.2.2.2

Offline

#5 5. 6. 2014 17:10:06

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

Re: Filtr KT se zadáním údaje prázdné VYŘEŠENO

To není tak úplně jednoduchá odpověď a také to není úplně přesně tak jak se domníváte, ale v podstatě to tak funguje. ISEMPTY je logický dotaz s významem "? Je prázdný ?". Ověří, zda proměnná typu Variant obsahuje hodnotu Empty. Hodnota Empty říká, že tato proměnná není inicializována. To se týká například dotazů v makru na existenci například mřížky a podobně, které tam sice běžně jsou, ale být nemusí.
       Mezi typy variant patří téměř vše. Nepatří tam OLE objekty, a jak si kódem dále uvedeným můžete ověřit nefunguje to ani na obyčejných objektech.
Raději kopíruji nápovědu :
"Proměnná typu Variant (obsahuje všechny typy, určuje se v definici). Pokud není zadáno klíčové slovo, proměnné se automaticky přiřadí typ Variant, pokud se nepoužije příkaz DefBool až DefVar.
V jazyce LibreOffice Basic nemusíte proměnné deklarovat explicitně. Ovšem musíte před použitím deklarovat pole. Proměnnou je možné deklarovat pomocí příkazu Dim a použít čárky na oddělení několika deklarací. Chcete-li deklarovat typ proměnné, použijte znak typové deklarace nebo odpovídající klíčové slovo."
Je - li potřeba zjistit hodnotu nula - tedy opravdu null jako prázdný. Je na to dotaz ISNULL() - ale zase to nesmí být v "objektu". Takže když bude v buňce nula tak Vám pomůže jen dotaz v makru ISNUMERIC. Proto s použitím na obsahu buněk velký pozor.
      Dále uvádím kód který sám někdy používám k testování (pro Vás jsem ho upravil - nafoukl). Běžně také používám tento kód pro dotazy na vše možné - například ISDATE a jiné záležitosti. Snad pochopíte jak to funguje, či spíš nefunguje. Makro se používá zejména k nalezení řešení konkrétního vstupu ze sešitu do makra. Takže aý Vám to bude zřejmé, makro zredukujte. Já si do něj pak připisuji jako poznámku co jak chodí abych pak vždy znovu netestoval totéž.

Sub CoJe_IsEmpty_Null_Numeric
Dim Doc As Object
Dim Sheet As Object
Dim Cell, Cell1 As Object
Dim Var as Variant
Dim Cis as integer
Doc = ThisComponent
Sheet = Doc. Sheets ( 0 )
Cis = MsgBox("Chci do testovaných buněk A2:A6 zadat vlastní hodnoty - stisknu ANO",4,"OBSAH TESTOVACÍ BUŇKY")
IF Cis = 6 Then
GoTo hop
End If
Cell = Sheet. getCellByPosition ( 0 , 2 )
Cell.Value = 1
Cell = Sheet. getCellByPosition ( 0 , 3 )
Cell.Value = 0
Cell = Sheet. getCellByPosition ( 0 , 4 )
Cell.Formula = "=IF(1=1;""zde = vzorec"";""zde = vzorec"")"
Cell = Sheet. getCellByPosition ( 0 , 5 )
Cell.String = "text"
hop:
Cell = Sheet. getCellByPosition ( 1 , 0 )
Cell.String = "ISNULL"
Cell = Sheet. getCellByPosition ( 2 , 0 )
Cell.String = "ISEMPTY"
Cell = Sheet. getCellByPosition ( 3 , 0 )
Cell.String = "ISNUMERIC"
For h = 1 To 2
For i = 1 To 3
For j = 1 To 5
Select Case i
Case 1
Cell1 = Sheet. getCellByPosition ( 0 , j )
Cell = Sheet. getCellByPosition ( i , j )
Cell.Value = ISNULL(Cell1)
IF h = 2 then
Var = Cell.Value
Cell.String = ISNULL(Var)
End If
Case 2
Cell1 = Sheet. getCellByPosition ( 0 , j )
Cell = Sheet. getCellByPosition ( i , j )
Cell.Value = ISEMPTY(Cell1.String)
IF h = 2 then
Var = Cell.Value
Cell.String = ISEMPTY(Var)
End If
Case 3
Cell1 = Sheet. getCellByPosition ( 0 , j )
Cell = Sheet. getCellByPosition ( i , j )
Cell.Value = ISNUMERIC(Cell1.String)
IF h = 2 then
Var = Cell.Value
Cell.String = ISNUMERIC(Var)
End If
End Select
Next j
Next i
IF h = 2 then
MsgBox "Takhle to vrací dotaz na CELL.Value - přes proměnnou Var - typ deklarace Variant"
Else
MsgBox "Takhle to vrací dotaz na CELL.Value - přímo na buňku"
End IF
For i = 1 To 3
For j = 1 To 5
Select Case i
Case 1
Cell1 = Sheet. getCellByPosition ( 0 , j )
Cell = Sheet. getCellByPosition ( i , j )
Cell.String = ISNULL(Cell1.String)
Case 2
Cell1 = Sheet. getCellByPosition ( 0 , j )
Cell = Sheet. getCellByPosition ( i , j )
Cell.String = ISEMPTY(Cell1.String)
Case 3
Cell1 = Sheet. getCellByPosition ( 0 , j )
Cell = Sheet. getCellByPosition ( i , j )
Cell.String = ISNUMERIC(Cell1.String)
End Select
Next j
Next i
IF h = 2 then
MsgBox "Takhle to vrací dotaz na CELL.String - přes proměnnou Var - typ deklarace Variant"
Else
MsgBox "Takhle to vrací dotaz na CELL.String - přímo na buňku"
End IF
For i = 1 To 3
For j = 1 To 5
Select Case i
Case 1
Cell1 = Sheet. getCellByPosition ( 0 , j )
Cell = Sheet. getCellByPosition ( i , j )
Cell.Formula = ISNULL(Cell1.String)
Case 2
Cell1 = Sheet. getCellByPosition ( 0 , j )
Cell = Sheet. getCellByPosition ( i , j )
Cell.Formula = ISEMPTY(Cell1.String)
Case 3
Cell1 = Sheet. getCellByPosition ( 0 , j )
Cell = Sheet. getCellByPosition ( i , j )
Cell.Formula = ISNUMERIC(Cell1.String)
End Select
Next j
Next i
Next h
IF h = 2 then
MsgBox "Takhle to vrací dotaz na CELL.Formula - přes proměnnou Var - typ deklarace Variant"
Else
MsgBox "Takhle to vrací dotaz na CELL.Formula - přímo na buňku"
End IF
End Sub

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

#6 5. 6. 2014 17:21:37

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

Re: Filtr KT se zadáním údaje prázdné VYŘEŠENO

Ještě abych Vás nasměroval jeden kus kódu - ten jsem převzal a funguje. Používá ISNULL a ISEMPTY s negací NOT. Takže pro ilustraci :

Sub UnregisterKeyHandler
If Not IsNull(oDocController) AND NOT IsEmpty(oDocController) Then
oDocController.removeKeyHandler(oKeyHandler)
oDocController = NULL
EndIf
End Sub

      Jak Vás asi napadne, jedná se o zrušení hendleru, který se týká pozměněné funkce definovaných kláves.


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

#7 5. 6. 2014 20:06:28

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 520

Re: Filtr KT se zadáním údaje prázdné VYŘEŠENO

Abych se přiznal moc to nechápu. Z vašeho makra to vypadá že výrazy ISNULL a ISEMPTY dávají pořád stejné hodnoty ať je v kontrolovaných buňkách obsaženo cokoli a záleží pouze na vnějších okolnostech a ne na obsahu buněk. Jediný použitelný se jeví výraz ISNUMERIC. Většina mých maker pracuje hodně provázaně s buňkami sešitu, takže mi záleží právě na obsahu, formu spíše zanedbávám, což asi není úplně správně.

Jak je možné že dotaz na cell.string = ISEMPTY(cell1.string) přičemž cell1 je prokazatelně prázdná buňka nevrátí true - to by mělo.

Editoval ludviktrnka (5. 6. 2014 20:15:50)


LibreOffice 5.2.2.2

Offline

#8 5. 6. 2014 21:52:57

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

Re: Filtr KT se zadáním údaje prázdné VYŘEŠENO

Pro práci s buňkami - přímé čtení existuje podobná struktura. Jedno speciální makro Vám posílám:

Sub FindEmptyCell 'Najde poslední řádek sloupce (nyní "A")
Sheet = ThisComponent.Sheets.getByName("List1")
ColA = Sheet.Columns.getByName("A") 'načte sl A
EmptyCellRanges = ColA.queryEmptyCells() 'najde prázdnou Cell Ranges
FirstEmptyRange = EmptyCellRanges.getByIndex(0)  'načte první prázdnou - respektive poslední plnou buňku
EmptyRangeAddress = FirstEmptyRange.RangeAddress  'vytvoří rangeAdress podle nalezené prátdné
Print EmptyRangeAddress.StartRow  'vypíše hlášku 
end Sub


     Makro jednoduše najde poslední řádek. Hledání probíhá od prvního řádku, takže už tam musí být něco v buňce. První prázdnou buňku označí jako poslední. Existuje mnoho variant. Makro může začít od konce a najde první neprázdnou buňku - tím zjistí kde je první prázdná a jestli jsou mezery mezi prvním a tímto posledním řádkem to ignoruje. Podobně se upravují makra pro smazání prázdných řádků, nebo (a) sloupců včetně mezer ve sloupci kde se testuje, nebo také testuje jestli "prázdno"  v celém řádku atd.
     Jde o to, že ISEMPTY nefunguje přímo na buňce, ale na "array", tedy i na Cell.array. Takhle musíte definovat i jednotlivě buňky. Například buňka A1 se deklaruje jako (0,0,0,0), A2 (0,1,0,1), B3 (1,2,1,2). Mám makro, které maže například jen vzorce, nebo formáty, objekty kresby ap.


     Takže ISEMPTY funguje na filtru za tečkou - tam kde máte například ISNUMERIC. Předchozí příspěvky byly spíš upozornění, na buňku jako Objekt funguje jen ISNUMERIC - ale i s tím raději opatrně. Aby to fungovalo obecně musí to být jako CellArray.

Editoval neutr (6. 6. 2014 04:31:13)


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

#9 6. 6. 2014 13:34:31

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 520

Re: Filtr KT se zadáním údaje prázdné VYŘEŠENO

Mám pocit že te v praxi celkem fachčí. Mám třeba v buňce W1 if(1=1;"";"něco"), když tuhle buňku pak načtu do proměnné projekt=oSheetObj.getCellrangeByName("W2").String a snažím se zjistit zda je zaplněna if ISEMPTY(projekt)=false Then tak se správně vyhodnotí jako prádná. Přičem dim projekt as string nikoli variant


LibreOffice 5.2.2.2

Offline

Zápatí