[Risolto]Righe da ripetere in area di stampa

Creare una macro - Scrivere uno script - Usare le API
Rispondi
geovign
Messaggi: 214
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

[Risolto]Righe da ripetere in area di stampa

Messaggio da geovign »

Un saluto al forum.
Nel file allegato ho impostato delle aree con nome che identificano la tabella, l'area di stampa e la riga da ripetere nella stampa al cambio di pagina.
Per eseguire la stampa, ho scritto apposito un codice (sub ProvaStampa1) che definisce l'area di stampa e la riga da ripetere (utilizzando le relative aree con nome).
Con

Codice: Seleziona tutto

	...
Dim RigaRipetere As Object
Dim IndirizzoRigaRipetere As New com.sun.star.table.CellRangeAddress	
'creo l'oggetto riga da ripetere utilizzando l'apposita area con nome
RigaRipetere = Foglio.getCellRangeByName("CA1_RigaRipetere")
'definisco l'indirizzo della riga da ripetere
IndirizzoRigaRipetere = RigaRipetere.RangeAddress 'i riferimenti alle colonne vengono ignorati
'imposto la riga da ripetere
Foglio.setTitleRows(IndirizzoRigaRipetere)
...
imposto la riga da ripetere al cambio pagina durante la stampa della tabella. E questo funziona.
Non riesco però a rimuovere la riga al termine del codice, senza eliminare la relativa area con nome.
Quale istruzione bisogna impartire?
Posto anche l'intero codice

Codice: Seleziona tutto

Sub ProvaStampa1
	Dim Foglio As Object
	Foglio = ThisComponent.Sheets(0)
rem imposto l'area di stampa
	Dim AreaStampa As Object
	Dim IndirizzoAreaStampa(0) As New com.sun.star.table.CellRangeAddress
	'creo l'oggetto area di stampa utilizzando l'apposita area con nome
	AreaStampa = Foglio.getCellRangeByName("CA1_AppStampa")
	'definisco l'indirizzo della area di stampa
	IndirizzoAreaStampa(0) = AreaStampa.RangeAddress
	'imposto area di stampa nel foglio
	Foglio.setPrintAreas(IndirizzoAreaStampa())
rem imposto la riga da ripetere al cambio pagina
	Dim RigaRipetere As Object
	Dim IndirizzoRigaRipetere As New com.sun.star.table.CellRangeAddress	
	'creo l'oggetto riga da ripetere utilizzando l'apposita area con nome
	RigaRipetere = Foglio.getCellRangeByName("CA1_RigaRipetere")
	'definisco l'indirizzo della riga da ripetere
	IndirizzoRigaRipetere = RigaRipetere.RangeAddress 'i riferimenti alle colonne vengono ignorati
	'imposto la riga da ripetere
	Foglio.setTitleRows(IndirizzoRigaRipetere)
rem aggiungo il foglio da stampare in un insieme (mi servirà in un futuro)
'	Dim oRanges As Variant
'	oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
'	oRanges.addRangeAddress(Foglio.RangeAddress,True)	
rem seleziono la stampante da utilizzare
	Dim oController as Object
	Dim oDispatcher as Object
	oController = ThisComponent.currentController
	oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
	oDispatcher.executeDispatch(oController.Frame,".uno:PrinterSetup","_self",0,Array())
rem stampo
	ThisComponent.Print(Array())
	wait 500	'fermo il codice altrimenti stampa non correttamente. Codice troppo veloce
rem elimino area di stampa definita in precedenza
	Foglio.setPrintAreas(Array())
rem elimino la riga da ripetere
'	Foglio.setTitleRows() 'Capire come si cancella	
End Sub 
Saluti
Geo
Allegati
setPrintAreas_da_Area_con_Nome.ods
(14.2 KiB) Scaricato 89 volte
Ultima modifica di geovign il martedì 5 ottobre 2021, 23:05, modificato 1 volta in totale.
LibO 7 su LinuxMint 21
patel
Volontario attivo
Volontario attivo
Messaggi: 4016
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Righe da ripetere in area di stampa

Messaggio da patel »

prova a dargli una cella vuota
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
geovign
Messaggi: 214
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Righe da ripetere in area di stampa

Messaggio da geovign »

Ciao patel, piacere risentirti.
L'istruzione setTitleRows necessita, come parametro, un indirizzo di un intervallo di celle.
setTitleRows( [in] ::com::sun::star::table::CellRangeAddress aTitleRows );
Personalmente non ho proprio idea di come si faccia a specificare l'indirizzo "vuoto" di un intervallo di celle ...
Oppure non ho capito il tuo intervento.
Saluti
Geo
LibO 7 su LinuxMint 21
patel
Volontario attivo
Volontario attivo
Messaggi: 4016
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Righe da ripetere in area di stampa

Messaggio da patel »

intendevo l'indirizzo di una cella vuota
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
geovign
Messaggi: 214
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Righe da ripetere in area di stampa

Messaggio da geovign »

Al termine del codice ho inserito la riga

Codice: Seleziona tutto

Foglio.setTitleRows(Foglio.getCellByPosition(0,0).RangeAddress)
(indirizzo di cella vuota) ma nella finestra "modifica area di stampa" (Formato->Area di Stampa->Modifica...) rimane sempre selezionata la ripetizione della riga; l'unica cosa che cambia è che, a conclusione del codice, riporta la riga $1 .
Ho però trovato la soluzione, o presumo sia la soluzione.
Da "Aprendiendo LibreOffice Basic", a proposito del metodo setTitleRows dice questo:
"... Quando usi il metodo setTitleRows, in teoria, la proprietà setPrintTitleRows è impostata su true per impostazione predefinita, ma specificarla non fa male. D'altra parte, quando si imposta setPrintTitleRows su true (True) ma non si imposta un intervallo con setTitleRows o si imposta una struttura vuota, per impostazione predefinita la riga 1 verrà lasciata come titolo da ripetere. ..."
In effetti dopo aver "settato" la proprietà TitleRows, la proprietà PrintTitleRows passa da False a True.
Quindi inserendo al termine del codice l'istruzione Foglio.setPrintTitleRows(False) , nella finestra modifica area di stampa, nel campo relativo a riga da ripetere risulta "nessuna" .

Codice: Seleziona tutto

Sub ProvaStampa1
	Dim Foglio As Object
	Foglio = ThisComponent.getCurrentController().getActiveSheet()
rem imposto l'area di stampa
	Dim AreaStampa As Object
	Dim IndirizzoAreaStampa(0) As New com.sun.star.table.CellRangeAddress
	'creo l'oggetto area di stampa utilizzando l'apposita area con nome
	AreaStampa = Foglio.getCellRangeByName("CA1_StampaAppezzamenti")
	'definisco l'indirizzo della area di stampa
	IndirizzoAreaStampa(0) = AreaStampa.RangeAddress
	'imposto area di stampa nel foglio
	Foglio.setPrintAreas(IndirizzoAreaStampa())
rem imposto la riga da ripetere al cambio pagina
	Dim RigaRipetere As Object
	Dim IndirizzoRigaRipetere As New com.sun.star.table.CellRangeAddress	
	'creo l'oggetto riga da ripetere utilizzando l'apposita area con nome
	RigaRipetere = Foglio.getCellRangeByName("CA1_TitoliAppezzamenti")
	'definisco l'indirizzo della riga da ripetere
	IndirizzoRigaRipetere = RigaRipetere.RangeAddress	'posso usare l'intera prop RangeAddress perchè c'è una sola riga
	'imposto la riga da ripetere
	Foglio.setPrintTitleRows(True)
	Foglio.setTitleRows(IndirizzoRigaRipetere)	' i riferimenti alle colonne sono ignorati
rem aggiungo il foglio da stampare in un insieme (mi servirà in un futuro)
'	oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
'	oRanges.addRangeAddress(Foglio.RangeAddress,True)	
rem seleziono la stampante da utilizzare
	Dim oController as Object
	Dim oDispatcher as Object
	oController = ThisComponent.currentController
	oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
	oDispatcher.executeDispatch(oController.Frame,".uno:PrinterSetup","_self",0,Array())
rem stampo
	ThisComponent.Print(Array())
	wait 500	'fermo il codice altrimenti stampa non correttamente. Codice troppo veloce
rem elimino area di stampa
	Foglio.setPrintAreas(Array())
rem elimino la riga da ripetere
	'settanto la proprietà PrintTitleRows su false, elimino anche la riga da ripetere
	Foglio.setPrintTitleRows(False)
End Sub 
Saluti
Geo
Allegati
setPrintAreas_da_Area_con_Nome_risolto.ods
(14.22 KiB) Scaricato 92 volte
LibO 7 su LinuxMint 21
Rispondi