Pagina 1 di 1
[Risolto]Chiudere il documento con macro
Inviato: venerdì 16 giugno 2023, 17:51
da Lanfranchi G.Luigi
Buongiorno.
Vorrei, con determinate condizioni, chiudere il documento senza salvarlo via macro.
Ho adottato vari suggerimenti trovati in rete ma, quando si esegue l'arresto, compare sempre un messaggio d'errore.
Ultimo "Errore di runtime BASIC. Proprietà o metodo non trovato: RangeDiCelleModificate_disposing."
Al riavvio del file il programma tenta un ripristino documento.
Non c'è un sistema per chiudere il documento senza salvarlo, esente da errori ?
Grazie.
Re: Chiudere il documento con macro
Inviato: venerdì 16 giugno 2023, 21:52
da unlucky83
Buonasera
Non sò quale soluzione hai trovato in rete, ma posso dirti che riscontri quell'errore perchè non hai copiato anche la macro chiamata RangeDiCelleModificate_disposing
La macro più semplice per chiudere un documento senza salvare la trovi qui
https://forum.openoffice.org/it/forum/v ... vare+macro
Quello che ti serve è costruirti una macro principale che richiami questa quando si verificano le determinate condizioni
Re: Chiudere il documento con macro
Inviato: sabato 17 giugno 2023, 7:19
da Lanfranchi G.Luigi
Grazie per la risposta.
Ho inserito la macro e poi l'ho richiamata da un'altra macro e mi da l'errore...
"Errore di runtime BASIC.
Proprietà o metodo non trovato: RangeDiCelleModificate_disposing."
Mi chiede poi all'apertura del file se voglio fare il ripristrino.
Ho voluto riprovare ma avevo già tentato questa soluzione.
Questa è la macro incriminata che richiama "aggiorna dati" che a sua volta richiama Document_close.
Re: Chiudere il documento con macro
Inviato: sabato 17 giugno 2023, 7:56
da unlucky83
Come ti avevo anticipato. Hai usato un listener e questo richiede la presenza nel modulo anche di una macro chiamata “RangeDiCelleModificate_disposing."
La soluzione è: o riprendi dalla fonte internet tutta la discussione e ti copi la Macro mancante oppure ne fai una nuova esattamente con questo nome da riportare in fondo al modulo.
Se la fai ex_novo puoi riprendere là macro della discussione di questo forum che ti ho allegato e la rinomini
Re: Chiudere il documento con macro
Inviato: sabato 17 giugno 2023, 14:44
da Lanfranchi G.Luigi
Grazie per la risposta.
Ora ho capito che serve una sub “RangeDiCelleModificate_disposing." .
Purtroppo il copia e incolla l'ho fatto 2 anni fà e mi risulta impossibile accedere ancora alla fonte.
Cortesemente non puoi scrivermi la sub da copiare perchè sono completamente a digiuno in questo campo.
Grazie.
Re: Chiudere il documento con macro
Inviato: sabato 17 giugno 2023, 18:36
da patel
associa ad un pulsante questa macro
Codice: Seleziona tutto
Sub Document_close( ) ' solo da pulsante
thiscomponent.dispose()
End Sub
Re: Chiudere il documento con macro
Inviato: sabato 17 giugno 2023, 20:48
da Lanfranchi G.Luigi
Patel non mi serve da pulsante.
Avrei, in questo caso, usato il classico pulsante "X" posto sul lato dx in alto.
Il problema sorge quando c'è un problema di collegamento con internet (mio o esterno).
Il programma si aggiorna con dati errati (zero o nulli).
Una macro intercetta questo errore e , dopo un avviso, dovrebbe uscire dal programma senza salvare il documento.
Uscita forzata senza intervento alcuno.
Grazie della pazienza.
Re: Chiudere il documento con macro
Inviato: domenica 18 giugno 2023, 7:19
da Lanfranchi G.Luigi
Trovo strano che non ci sia una funzione, come in Excel, che chiude il file senza problemi.
Se premo la "X" per chiudere l'applicazione e confermo l'uscita senza salvataggio, Calc non dà nessun allarme o errore, ne mi chiede un ripristino documento.
Questo che ci sia una listener attiva o no.
Possibile che non esista una corrispettiva funzione da lanciare in una macro ?
Per il momento resto in attesa di vostri suggerimenti.
Grazie.
Re: Chiudere il documento con macro
Inviato: domenica 18 giugno 2023, 8:48
da patel
Ho detto di associarla ad un pulsante perché non è lanciabile dall'editor macro, ma la puoi inserire nella tua macro.
Immaginavo che tu la provassi.
Re: Chiudere il documento con macro
Inviato: domenica 18 giugno 2023, 11:56
da unlucky83
E’ lanciabile dal listener , basta cambiargli il nome
Codice: Seleziona tutto
Sub RangeDiCelleModificate_disposing
thiscomponent.dispose()
End Sub
Devi solo aggiungere queste tre righe alla fine del modulo della Macro che hai allegato
Re: Chiudere il documento con macro
Inviato: domenica 18 giugno 2023, 12:37
da Lanfranchi G.Luigi
Grazie per le risposte.
Unlufcky83 la tua risposta mi ha spiazzato.
Thiscomponent.dispose() era il comando che adoperavo come chiusura documento.(che poi generava errori e il ripristino del documento di Calc)
Che comando devo dare ora per chiude il documento e attivare la sub che hai postato ?
Comincio a dare i numeri (1-4-5-67-58-...) ha ha ha.
Portate pazienza...
Re: Chiudere il documento con macro
Inviato: domenica 18 giugno 2023, 12:54
da unlucky83
Perché non alleghi un file di calc di esempio?
Re: Chiudere il documento con macro
Inviato: domenica 18 giugno 2023, 14:14
da Lanfranchi G.Luigi
Ok buona idea.
Ho cancellato tutto quello che non serviva e ridotto le macro all'osso.
Per attivare l'evento andare in "Modifica"/"Collegamenti a file..."/"Aggiorna".
Ecco l'allegato.
Re: Chiudere il documento con macro
Inviato: domenica 18 giugno 2023, 21:13
da unlucky83
Con l'uso del listener sia ThisComponent.close(true) sia ThisComponent.dispose() chiudono il file senza salvare, ma generano una chiusura con errore che poi fa comparire la finestra di ripristino alla riapertura del file. Il problema non riesco a risolverlo nemmeno rimuovendo il listener prima della chiusura.
La macro che aggiunge il listener deve essere avviata una sola volta, quindi è associata all'evento apertura documento.
Per far chiudere il documento del mio esempio, ho posto come condizione l'inserimento di 1 in cella V1.
Per capire se e quale macro viene eseguita ho aggiunto dei msgbox.
Di seguito il codice
Codice: Seleziona tutto
REM ***** BASIC *****
Global CelleDaAscoltare As Object
Global Ascoltatore As Object
Sub AggiungiAscoltatoreVariazioneFoglio ' Sub che determina il comportamento ad un cambio valore nelle celle selezionate
' ------------------------------------------------
Doc = ThisComponent
Foglio = Doc.Sheets(0)
CelleDaAscoltare = Foglio.getCellRangeByName("V1:V200") 'Range di celle da ascoltare
Ascoltatore = CreateUnoListener("RangeDiCelleModificate_","com.sun.star.util.XModifyListener")
CelleDaAscoltare.addModifyListener(Ascoltatore)
msgbox "Aggiunto Ascoltatore"
End Sub
Sub RangeDiCelleModificate_modified(oEvent As Object) ' Unica Sub richiamata dall'aggiornamento web
msgbox "cella modificata"
AggiornaDati(oEvent)
End Sub
Sub RangeDiCelleModificate_disposing(oEvent As Object)
End Sub
Sub Range_Listeners_Remove(oEvent)
CelleDaAscoltare.RemoveModifyListener(Ascoltatore)
msgbox "Ascoltatore rimosso"
End Sub
Sub AggiornaDati(oEvent)
Doc = ThisComponent
Foglio = Doc.Sheets(0)
' ++++++++++++++++++++++ Qua dopo alcuni controlli va chiuso Calc senza salvataggio dati ++++++++++++++++++++++
If Foglio.getcellRangeByName("V1").value=1 Then ' condizione di esempio
Range_Listeners_Remove (oEvent)
wait 1000
Doc.close(True)
' Doc.dispose()
End If
End Sub
Forse qualcuno sa risolvere il problema
Re: Chiudere il documento con macro
Inviato: lunedì 19 giugno 2023, 6:42
da Lanfranchi G.Luigi
Grazie per il tempo che mi hai dedicato.
A memoria di più di un anno fà...
Anch'io avevo posto la listener con l'apertura del documento ma poi, aggiungendo un timer di 5 min al collegamento, stranamente alcune volte avevo dei download consecutivi (a volte 3-4).
Spostando la listener sull'evento vista creata il problema non l'ho più avuto.
Comunque riproverò con l'apertura documento...
Grazie ancora.
Re: Chiudere il documento con macro
Inviato: lunedì 19 giugno 2023, 7:17
da Lanfranchi G.Luigi
Curiosità.
Leggendo i vari forum, alcuni dicevano di aggiungere un Exit sub alla procedura che chiudeva calc, questo per uscire dalla sub senza generare errori.
Lo trovavo inutile dopo un istruzione Doc.close(True)....ma l'ho fatto.
Il problema sulla chiusura rimane ma se ne aggiunge un altro.
Se si aggiunge exit sub dopo l'istruzione doc.close e si esegue la macro (impostando a 1 la cella V1) calc genera un errore di "variabile dell'oggetto non impostata".
Se invece, dopo la modifica, si salva il file, si esce da calc e poi si rientra, eseguendo la macro il problema "variabile dell'oggetto non impostata" non si presenta più.
Misteri delle tecnica.
Re: Chiudere il documento con macro
Inviato: lunedì 19 giugno 2023, 15:49
da unlucky83
Lanfranchi G.Luigi ha scritto: ↑lunedì 19 giugno 2023, 7:17
Se si aggiunge exit sub dopo l'istruzione doc.close e si esegue la macro (impostando a 1 la cella V1) calc genera un errore di "variabile dell'oggetto non impostata".
Se invece, dopo la modifica, si salva il file, si esce da calc e poi si rientra, eseguendo la macro il problema "variabile dell'oggetto non impostata" non si presenta più.
Misteri delle tecnica.
Questo perchè per rimuovere il listener è necessario usare una variabile globale che viene assegnata quando si esegue la macro che associa il listener.
Se si modifica il modulo della macro scrivendo del codice, si svuota la memoria e la variabile global diventa un oggetto nullo, quindi la macro che deve eseguire la rimozione del listener da l'errore da te riscontrato. Salvando, chiudendo e riaprendo il file, la variabile global viene assegnata e mantiene il suo valore.
Ho provato ad aggiungere exit sub, ma la finestra di ripristino all'apertura successiva si presenta comunque.
Questi Listener sono potenti ma devo dire poco argomentati. Ho cercato sul forum inglese ma non ho trovato nulla di utile..
Re: Chiudere il documento con macro
Inviato: lunedì 19 giugno 2023, 16:00
da unlucky83
Trovata la soluzione.
Serve un Wait subito dopo il comando Doc.close(True)
Sul mio pc non ha problemi con un Wait 5000
Codice: Seleziona tutto
REM ***** BASIC *****
Global CelleDaAscoltare As Object
Global Ascoltatore As Object
Sub AggiungiAscoltatoreVariazioneFoglio ' Sub che determina il comportamento ad un cambio valore nelle celle selezionate
' ------------------------------------------------
Doc = ThisComponent
Foglio = Doc.Sheets(0)
CelleDaAscoltare = Foglio.getCellRangeByName("V1:V200") 'Range di celle da ascoltare
Ascoltatore = CreateUnoListener("RangeDiCelleModificate_","com.sun.star.util.XModifyListener")
CelleDaAscoltare.addModifyListener(Ascoltatore)
msgbox "Aggiunto Ascoltatore"
End Sub
Sub RangeDiCelleModificate_modified(oEvent As Object) ' Unica Sub richiamata dall'aggiornamento web
msgbox "cella modificata"
AggiornaDati(oEvent)
End Sub
Sub RangeDiCelleModificate_disposing(oEvent As Object)
End Sub
Sub Range_Listeners_Remove(oEvent)
CelleDaAscoltare.RemoveModifyListener(Ascoltatore)
msgbox "Ascoltatore rimosso"
End Sub
Sub AggiornaDati(oEvent)
Doc = ThisComponent
Foglio = Doc.Sheets(0)
' ++++++++++++++++++++++ Qua dopo alcuni controlli va chiuso Calc senza salvataggio dati ++++++++++++++++++++++
If Foglio.getcellRangeByName("V1").value=1 Then ' condizione di esempio
Range_Listeners_Remove (oEvent)
Doc.close(True)
wait 5000
End If
End Sub
Re: Chiudere il documento con macro
Inviato: lunedì 19 giugno 2023, 16:34
da Lanfranchi G.Luigi
Provato sul mio pc....
Da l'impressione che funzioni poi terminato il tempo di attesa compare ancora il solito messaggio di errore.
Provato anche con 6000.
Peccato...
Re: Chiudere il documento con macro
Inviato: martedì 20 giugno 2023, 8:24
da Lanfranchi G.Luigi
Buongiorno.
Il problema non è legato alla listener.
In questo file (vedi allegato senza listener) chiudo Calc con due opzioni.
1) Quando cambio il valore di A1, il cambiamento viene intercettato da una gestione evento che chiude Calc.
2) Premendo il pulsante "click" Calc viene chiuso.
La prima opzione da l'errore mentre la seconda no.
Calc da un errore quando è chiuso all'interno di una macro "evento".
Idee in merito ?
Grazie.
Re: Chiudere il documento con macro
Inviato: martedì 20 giugno 2023, 15:13
da unlucky83
Forse ho risolto aggiungendo un altro listener per la chiusura del file. Prova questo nuovo allegato. Ho messo molti msgbox per capire quali macro vengono eseguite mano mano, ma se è tutto ok puoi anche rimuoverle.
Fai prove
Codice: Seleziona tutto
REM ***** BASIC *****
Global CelleDaAscoltare As Object
Global Ascoltatore As Object
Global oListener as Object
Sub AggiungiAscoltatoreVariazioneFoglio ' Sub che determina il comportamento ad un cambio valore nelle celle selezionate
' ------------------------------------------------
Doc = ThisComponent
Foglio = Doc.Sheets(0)
CelleDaAscoltare = Foglio.getCellRangeByName("V1:V200") 'Range di celle da ascoltare
Ascoltatore = CreateUnoListener("RangeDiCelleModificate_","com.sun.star.util.XModifyListener")
CelleDaAscoltare.addModifyListener(Ascoltatore)
'aggiunta ascoltatore per gestire correttamente la chiusura
oListener = CreateUnoListener("Listensub_", "com.sun.star.util.XCloseListener")
thisComponent.addCloseListener(oListener)
msgbox "Aggiunto Ascoltatore"
End Sub
Sub RangeDiCelleModificate_modified(oEvent As Object) ' Unica Sub richiamata dall'aggiornamento web
msgbox "cella modificata"
Doc = ThisComponent
Foglio = Doc.Sheets(0)
If Foglio.getcellRangeByName("V1").value=1 Then ' condizione di esempio
Range_Listeners_Remove (oEvent)
Doc.ismodified(False)
msgbox "Sta per chiudere"
Doc.close(true)
End If
End Sub
Sub Range_Listeners_Remove(oEvent)
CelleDaAscoltare.RemoveModifyListener(Ascoltatore)
msgbox "Ascoltatore rimosso"
End Sub
Sub RangeDiCelleModificate_disposing(oEvent As Object)
End Sub
Sub Listensub_queryClosing(oEvent, bOwnership)
msgbox("query")
End Sub
Sub Listensub_notifyClosing(oEvent)
msgbox("notify")
End Sub
Sub Listensub_disposing(oEvent)
msgbox("disposing")
End Sub
Re: Chiudere il documento con macro
Inviato: martedì 20 giugno 2023, 16:25
da Lanfranchi G.Luigi
Pulllltroppo è uguale a prima.
Si apre una pagina e mi dice che Calc ha fatto un arresto anomalo.
Poi richiama la pagina principale di libreoffice chiedendomi se voglio inviare un rapporto dell'errore. Cosa che una volta ho fatto.
Comunque l'errore non è legato alla listener. Come vedi il mio allegato precedente ne è esente ma genera lo stesso errore.
Non so se esiste un'istruzione in basic che possa "resettare" calc azzerando tutte le pendenze che siano eventi o altro.
Non avrebbe importanza anche se ciò inquinasse dei dati perche si esce senza salvataggio.
Teoricamente dovrebbe farlo l'istruzione Close(true).
Strano che a te non dia problemi....
Grazie per l'impegno.
Re: Chiudere il documento con macro
Inviato: martedì 20 giugno 2023, 20:08
da unlucky83
A me adesso chiude il file e alla riapertura non mi chiede il ripristino. A parte il messaggio in cui ti chiede di inviare il rapporto di errore, ha smesso di chiederti il ripristino del file?
Re: Chiudere il documento con macro
Inviato: mercoledì 21 giugno 2023, 7:15
da Lanfranchi G.Luigi
Si il ripristino, quando riapro il file, non me lo richiede più.
Mi da il messaggio di errore che Calc si è arrestato in maniera anomala, dopo apre la pagina iniziale di Libreoffice chiedendomi se voglio inviare un report.
Re: Chiudere il documento con macro
Inviato: mercoledì 21 giugno 2023, 8:01
da unlucky83
Ottimo, vuol dire che stiamo verso la risoluzione. Adesso incide la differenza di sistema operativo. Con Windows dovrebbe essere utile mettere Stardesktop.terminate nell’ultima macro
Codice: Seleziona tutto
Sub Listensub_disposing(oEvent)
msgbox("disposing")
Stardesktop.terminate()
End Sub
Dovrei fare le prove su un pc Windows però
Re: Chiudere il documento con macro
Inviato: mercoledì 21 giugno 2023, 8:18
da Lanfranchi G.Luigi
Fatta io la prova....
Siamo vicino alla soluzione credo.
Ora non da più nessun messaggio alla chiusura.
Quando riapro il file mi appare la schermata "rapporto di errore".
Questo succede anche se chiudo il file manualmente, cosa che prima non succedeva.
Re: Chiudere il documento con macro
Inviato: mercoledì 21 giugno 2023, 16:32
da Lanfranchi G.Luigi
Dato che l'errore avviene se richiamo la sub di chiusura documenti da una macro legata ad un evento, ho pensato bene di creare un pulsante normalmente nascosto, poi reso visibile dalla macro sopre citata.
Uscito dalla macro, cliccando sul pulsante ora visibile avrei chiuso Calc in maniera pulita.
Bell'idea se non fosse che mi sono scontrato con un problema...come faccio a rendere visibile il pulsante con codice basic ?
Ho speso sei ore su internet in ricerche senza uscirne a capo.
Sicuramente è possibile dato che. nelle specifiche del pulsante, si può scegliere se renderlo visibile o no di default.
LibreOffice ha sicuramente grandi potenzialità ma sinceramente le mie forze cominciano a venirmi meno.....
PS: Un grosso grazie IN OGNI CASO a unlucky83
Re: Chiudere il documento con macro
Inviato: mercoledì 21 giugno 2023, 21:56
da unlucky83
Lanfranchi G.Luigi ha scritto: ↑mercoledì 21 giugno 2023, 16:32
Dato che l'errore avviene se richiamo la sub di chiusura documenti da una macro legata ad un evento, ho pensato bene di creare un pulsante normalmente nascosto, poi reso visibile dalla macro sopre citata.
Ottima alternativa, cosi evitiamo di compromettere il profilo utente di libreoffice o openoffice con degli arresti errati. Mi dispiace non aver risolto questa cosa al momento, ma è inutile complicarsi la vita se si trova un'alternativa soddisfacente.
Uscito dalla macro, cliccando sul pulsante ora visibile avrei chiuso Calc in maniera pulita.
Bell'idea se non fosse che mi sono scontrato con un problema...come faccio a rendere visibile il pulsante con codice basic ?
Ho speso sei ore su internet in ricerche senza uscirne a capo.
Qui sul forum c'erano delle informazioni sparse per rispondere al tuo nuovo quesito, ma ci sta perdersi quando non si sa bene cosa cercare.
Prova questo allegato e dimmi se cosi ti va bene
Re: Chiudere il documento con macro
Inviato: giovedì 22 giugno 2023, 7:37
da Lanfranchi G.Luigi
Si va bene così
grazie.
Cosa faccio ? Chiudo l'argomento con risolto o lo lascio aperto ?
Re: Chiudere il documento con macro
Inviato: giovedì 22 giugno 2023, 9:09
da unlucky83

Va bene chiuderlo.