[Risolto] Copiare un range da Calc in un nuovo doc. Write

Creare una macro - Scrivere uno script - Usare le API
Rispondi
Alvin
Messaggi: 33
Iscritto il: domenica 17 febbraio 2019, 3:06

[Risolto] Copiare un range da Calc in un nuovo doc. Write

Messaggio da Alvin »

Ciao a tutti!

Per evitare di caricare gli stessi files, ingombrando inutilmente la bbs, vi prego di fare riferimento al mio post precedente (Una macro che si comporta in modo insolito), nel quale ho allegato i files che interessano anche qui. In questo post, mi fisso su un problema che da giorni non mi riesce di risolvere: devo copiare un range di celle da un documento Calc ad un nuovo file Writer.
Nel documento Calc sto creando unn programmino di fatturazione quanto piu' possibile automatizzata per un mio amico. Una volta realizzata la fattura in Calc, (per ora a mano) creo un nuovo documento Writer vuoto, seleziono su Calc il range di celle relativo alla fattura, lo copio e poi l'incollo sul documento Writer, che poi rinomino e salvo. Per automatizzare la cosa, ho cercato di creare una macro col registratore, ma la cosa non funziona. In realta', di macro ne ho create due: copiafattura ed incollafattura, che vengono chiamate, la prima, un momento prima di chiamare la macro che crea il nuovo documento Writer, e la seconda all'interno di quest'ultima. Copiafattura fa quello che le si chiede, anche se non chiude in modo grazioso, lasciando l'area prescelta ancora selezionata. Ci ho guardato dentro, ma non ci ho capito abbastanza da poter rimediare. Incollafattura invece, almeno dove l'ho chiamata, non riesce a fare quanto richiesto. Per quel che ne ho capito, la sua call riporta il fuoco sul documento Calc, pur essendosi in precedenza spostato sul documento appena creato, che risulta in evidenza. Altro discorso e' se invece la installo su un documento "modello" (non e' un modello ma un documento vuoto preparato ad hoc), che poi richiamo manualmente. Allora, (settata per partire all'apertura del documento) non ci sono problemi e la copia viene fatta come desidero. Ovviamente cosi' non basta, perche' poi bisogna stare attenti a non salvare il file originale e salvarlo subito con un nome adeguato. In un modo o nell'altro ho bisogno di portare in automatico il fuoco sul documento Writer prima di poter lanciare incollafattura. Guardando in giro, ho visto anche il consiglio di Pitonyak di inserire document.ContainerWindow.setFocus. ma non e' cambiato niente.
A questo punto, pur sentendomi molto vicino alla soluzione, non ci sono riuscito da solo, e sono qui a chiedere aiuto a chi ne sa molto piu' di me.
Buona giornata
Ultima modifica di charlie il martedì 26 febbraio 2019, 10:50, modificato 2 volte in totale.
Motivazione: Aggiunta spunta verde
LibreOffice 6.2 x64 su windows 7 64
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Copiare un range di celle da Calc in un nuovo doc. Write

Messaggio da patel »

-------------------
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
Alvin
Messaggi: 33
Iscritto il: domenica 17 febbraio 2019, 3:06

Re: Copiare un range di celle da Calc in un nuovo doc. Write

Messaggio da Alvin »

Grazie Patel!

Nel frattempo avevo trovato una soluzione utilizzando una risposta di Gaetano del Novembre scorso,
che ho adattato in maniera alquanto brutale. Per copiare il range utilizzo ancora la macro "copiafattura" precedentemente ricavata con il macro recorder e poi riadattata a mano. Ho invece eliminato la macro "incollafattura" e ho spostato il suo codice all'interno di "CreaFileFogli0 per poter utilizzare le variabili locali.
A quel punto, ho sostituito la riga classica "document = ThisComponent.CurrentController.Frame"
con " document = NuovoFile.currentController.Frame", che mi ha portato il fuoco sul documento appena creato,
chiudendo con i normali comandi del dispatcher. Funzionare, funziona, ma non ho abbastanza esperienza per prevedere se questo trucco possa avere delle controindicazioni. Se non ti e` di troppo disturbo, ti chiedo di dare un'occhiata. Rimane un ultimo problema, e cioe` che, se apro il file con OpenOffice fila tutto come previsto, se invece uso LibreOffice, a copiatura eseguita l'area di partenza rimane selezionata ed evidenziata, non capisco perche`. Ho scaricato ora la macro di Villeroi che mi hai indicato, non fosse altro che per imparare, ora la guardo.
Grazie ancora e buona giornata.
Allegati
provaxforum.ods
(23.03 KiB) Scaricato 129 volte
LibreOffice 6.2 x64 su windows 7 64
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Copiare un range di celle da Calc in un nuovo doc. Write

Messaggio da patel »

Il tuo file è troppo incasinato per me, a cosa ti serve la gestione degli eventi ? comunque io ho riassunto il codice su un mio file di prova così:

Codice: Seleziona tutto

sub copiafattura
dim document   as object
dim dispatcher as object
Dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$A$1:$F$7" ' da modificare

document = ThisComponent.CurrentController.Frame
document.ContainerWindow.setFocus
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

NomeFile="F:\Download\prova.odt"
NuovoFile = StarDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, Args1() )
document = NuovoFile.currentController.Frame	
document.ContainerWindow.setFocus rem get access to the document
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
NuovoFile.StoreAsURL(ConvertToUrl(NomeFile), args1() )
NuovoFile.close(true)
end sub
La macro di villeroi non incolla come immagine, ma crea una vera tabella modificabile
-------------------
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
Alvin
Messaggi: 33
Iscritto il: domenica 17 febbraio 2019, 3:06

Re: Copiare un range di celle da Calc in un nuovo doc. Write

Messaggio da Alvin »

Grazie Patel!
Hai dato organicita` ad un insieme di istruzioni abbastanza farraginoso. Del resto io non ho mai lavorato ad oggetti, sto imparando ora e mi e` spesso difficile cogliere la struttura d'insieme. Per questo sono costretto a ragionarci spesso un bel po' prima di coglierne l'essenza. Gia` sono soddisfatto nel vedere che era giusta la mia sostituzione di "ThisComponent".
Ora ho riscritto tutto per bene in un'unica subroutine come mi hai indicato, e mi sono preso pure lo sfizio di creare e riempire una cartella interna delle fatture con le loro copie in PDF... solo come esercizio, ma l'ho trovato interessante.
Ho ancora il problema che, una volta creato ed archiviato l'odt, la selezione del range di celle nell'ods rimane attiva finche` non sposto manualmente il fuoco su un'altra cella. Non sono riuscito a trovare un comando che lo faccia dall'interno del dispatcher.
Mi sembra tutto sommato un difetto minore perche`, avendo creato in una cella un messaggio di operazione espletata con successo, l'utente e` in pratica obbligato a cliccarci sopra per cancellare il messaggio resettando la cella per la prossima volta, e contestualmente spostando il fuoco dalla precedente selezione. Nel manuale di Pitonyak ho comunque visto una subroutine di Paolo Mantovani che sposta il fuoco da un range di celle e la voglio provare, anche se mi sembra un accanimento abbastanza inutile...
Classifichero` "risolto" il post, buona giornata
LibreOffice 6.2 x64 su windows 7 64
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Copiare un range di celle da Calc in un nuovo doc. Write

Messaggio da patel »

Alvin ha scritto: Ho ancora il problema che, una volta creato ed archiviato l'odt, la selezione del range di celle nell'ods rimane attiva finche` non sposto manualmente il fuoco su un'altra cella.
è l'unico modo che conosco
-------------------
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
Avatar utente
Eramad
Volontario
Volontario
Messaggi: 278
Iscritto il: martedì 10 aprile 2018, 14:56
Località: Pistoia

Re: [Risolto] Copiare un range da Calc in un nuovo doc. Writ

Messaggio da Eramad »

Per togliere la selezione, basterebbe aggiungere una riga di codice alla fine che sposti la selezione a una cella.

Codice: Seleziona tutto

ThisComponent.CurrentController.Select(ThisComponent.Sheets.getByName(nomefoglio).getCellRangeByName("A1"))
Prova una cosa del genere (modificando il nome del foglio ovviamente ed eventualmente la cella dove vuoi spostarti)
Apache OpenOffice 4.1.5 su Windows 10

Se hai risolto il problema, ricordati di aggiungere [RISOLTO]: viewtopic.php?f=9&t=5661
Alvin
Messaggi: 33
Iscritto il: domenica 17 febbraio 2019, 3:06

Re: [Risolto] Copiare un range da Calc in un nuovo doc. Writ

Messaggio da Alvin »

Grazie per il suggerimento, Eramad!
Poi provo e riferisco.
Buon pomeriggio
LibreOffice 6.2 x64 su windows 7 64
Alvin
Messaggi: 33
Iscritto il: domenica 17 febbraio 2019, 3:06

Re: [Risolto] Copiare un range da Calc in un nuovo doc. Writ

Messaggio da Alvin »

BRAVO ERAMAD!!
Funziona!
Grazie mille!!
Ho portato il fuoco sulla cella dove compare il messaggio di file creato, cosi` l'utente deve solo dare return per cancellarlo e riarmarlo.
ri- buon pomeriggio! :D :D :D
LibreOffice 6.2 x64 su windows 7 64
Rispondi