Pannello di Controllo Moderatore ]

[Risolto]Righe da ripetere in area di stampa

Creare una macro - Scrivere uno script - Usare le API

[Risolto]Righe da ripetere in area di stampa

Messaggioda geovign » domenica 3 ottobre 2021, 10:53

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   Espandi visualeStringi visuale
   ...
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   Espandi visualeStringi visuale
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 23 volte
Ultima modifica di geovign il martedì 5 ottobre 2021, 22:05, modificato 1 volta in totale.
LibO 6 su MX Linux
geovign
 
Messaggi: 163
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Righe da ripetere in area di stampa

Messaggioda patel » lunedì 4 ottobre 2021, 15:41

prova a dargli una cella vuota
-------------------
OpenOffice 4.1 e Libre Office 6.4.1.2 su Windows 10
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
patel
Volontario attivo
Volontario attivo
 
Messaggi: 3699
Iscritto il: venerdì 30 aprile 2010, 7:04
Località: Livorno

Re: Righe da ripetere in area di stampa

Messaggioda geovign » lunedì 4 ottobre 2021, 23:16

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 6 su MX Linux
geovign
 
Messaggi: 163
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Righe da ripetere in area di stampa

Messaggioda patel » martedì 5 ottobre 2021, 4:58

intendevo l'indirizzo di una cella vuota
-------------------
OpenOffice 4.1 e Libre Office 6.4.1.2 su Windows 10
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
patel
Volontario attivo
Volontario attivo
 
Messaggi: 3699
Iscritto il: venerdì 30 aprile 2010, 7:04
Località: Livorno

Re: Righe da ripetere in area di stampa

Messaggioda geovign » martedì 5 ottobre 2021, 22:04

Al termine del codice ho inserito la riga
Codice: Seleziona tutto   Espandi visualeStringi visuale
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   Espandi visualeStringi visuale
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 24 volte
LibO 6 su MX Linux
geovign
 
Messaggi: 163
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena


Torna a Macro e UNO API

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti