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

#1 7. 8. 2018 12:55:59

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

makro - podivné chování VYŘEŠENO

Zdravím,

jsem trochu zaskočen podivným chováním makra :

Sub Main
	dim oSesit as Object
	dim oSheet as Object
	dim oCell  as Object
	dim oDataSheet as object

	oSesit = ThisComponent
	if oSesit.getSheets.hasByName( "Data" ) Then
		oSheet = oSesit.getSheets.getByName( "Data" )
	else
		MsgBox " List 'Data' nenalezen", 0
	EndIf
	
	oColumn = oSheet.Columns(0)
	last_row = num_rows( oSheet )
	oCell = oSheet.getCellByPosition( 15, 0 )
	oCell.setValue( num_rows )
End Sub

Function num_rows( oCurSheet ) as variant
	dim oColumn as Object
	dim oColumns as Object
	oColumns = oCurSheet.getColumns()
	oColumn = oColumns.getByIndex(0)
	oFinder = oColumn.createSearchDescriptor
	oFinder.searchRegularExpression = true
	oFinder.SearchString = "."
	oResult = oColumn.FindAll(oFinder)
	If Not IsNull(oResult) then
		ResultName$ = oResult.AbsoluteName
		PartsOfTheName = Split(ResultName,"$")
		num_rows = Val(PartsOfTheName(ubound(PartsOfTheName))) - 1
	Else
		num_rows = - 1
	End If
End Function

Takže smysl byl najít poslední řádek na listu "Data", který má nějakou hodnotu v sloupci A (0).


Po zadefinování oDoc, oSheet jsem volal funkci, která mi měla vrátit číslo posledního platného řádku.


skript stále končí hláškou "argument není volitelný" na druhém řádku ve funkci num_rows ( oColumns = oCurSheet.getColumns() )


Nechápu, kde je problém, objekty normálně do funkcí předávám ( v jiných sešitech ) .. proto jsem vložil do procedury Main  v podstatě stejný kód před voláním funkce num_rows .. a tam to nevyhnije !!


Díval jsem se přes kukátko, a oCurSheet JE objektem listu, má i sorávný atribut "name"...  a přesto se chová jinak než původní předaná proměnná.



Už jsem asi překoukaný, protože nikde chybu nevidím, ale přece tam někde musí vězet ...


díky za nakopnutí

Milan

Editoval MilanUhrak (8. 8. 2018 07:11:12)

Offline

#2 7. 8. 2018 16:10:14

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

Re: makro - podivné chování VYŘEŠENO

Sub Main
	dim oDoc, oSheet, Sesit as Object
	dim oCell  as Object
	dim oDataSheet as object
	oDoc = ThisComponent
	if oDoc.getSheets.hasByName( "Data" ) Then
		oSheet = oDoc.getSheets.getByName( "Data" )
	else
		MsgBox " List 'Data' nenalezen", 0
	EndIf
	
	oColumn = oSheet.Columns(0)
	last_row = num_rows( "Data" , "." )
	Sesit = thisComponent.currentController.activeSheet
	oCell = Sesit.getCellByPosition( 15, 0 )
	oCell.Value = last_row
End Sub

Function num_rows(ByVal sVal as string, ByVal sVar as string)
Dim oDoc, oSheet
oDoc = ThisComponent
    oSheet = oDoc.Sheets.getByName(sVal)
    ColA = oSheet.getCellrangeByName("A1:AMJ1048574")
    Search_Desc = ColA.createSearchDescriptor()
    Search_Desc.SearchString = sVar
    Search_Result = ColA.findAll(Search_Desc)
    Num_Found = Search_Result.Count
    Last_Occur = Search_Result.getByIndex( Num_Found - 1) 
    CellAddr = Last_Occur.CellAddress
    oRow = CellAddr.Row
    oCol = CellAddr.Column
    ' Alternativa 
    'NewCell = oSheet.getCellByPosition(oCol, oRow)
    'NewCell.Value = 5
    'CurrentController = ThisComponent.CurrentController
    'CurrentController.select(NewCell) 
num_rows = oRow
end Function

Editoval neutr (7. 8. 2018 16:12:27)


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 07:09:29

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

Re: makro - podivné chování VYŘEŠENO

Hm ...  tak toto je velmi zajímavé...
Předně děkuji za to nakopnutí, chtěl jsem se obejít bez deklarací a vyhledávání sešitu ve funkcích a procedurách.


Mám sešit už asi 8 let starý, kde se vyplňuje lst píchačky podle zadaného roku / měsice ( rozezná se počet dní, obarví se so+ne, zašednou pole pro neplatné dny ( 31 den např). Tam mi předávání objektu sešitu funguje.


Když jsem ale zkopíroval kód do nově vytvořeného sešitu, hned nastaly problémy. Pídil jsem se, co to má na svědomí a patrně je to problém deklarací ( starý kód se zastavil i na místech kde byla použita nedeklarovaná proměnná )


Takže nakonec jsem původní kód rozhýbal změnou deklarace funkce :


Function num_rows( oCurSheet as Object ) as variant


Neutronovi děkuji za snahu a popostrčení správným směrem smile

Offline

Zápatí