[RISOLTO]Errore copia e incolla in altro file

Creare una macro - Scrivere uno script - Usare le API
Rispondi
Nicco
Messaggi: 24
Iscritto il: martedì 4 ottobre 2022, 20:53

[RISOLTO]Errore copia e incolla in altro file

Messaggio da Nicco »

Ciao a tutti, sto provando a scrivere una macro che copia un range dal foglio attivo di un documento calc e lo incolla nella prima riga libera di un altro documento. Ho cercato tanto in rete ed ho trovato questo codice che ho adattato al mio caso.

Codice: Seleziona tutto

Sub AccodaDatiInFileEsterno

Dim Args(0) As New com.sun.star.beans.PropertyValue
Args(0).Name = "MacroExecutionMode"
Args(0).Value = com.sun.star.document.MacroExecMode.ALWAYS_EXECUTE_NO_WARN

Dim DocName as object, DocUlr as string, dummy(), range as object

Doc = ThisComponent
Sheet = Doc.currentcontroller.getActiveSheet() 
Range = Sheet.getCellRangeByName("N40:Q130").getDataArray ' range da copiare
sFileName ="file:///home/valerio/Desktop/GIORNALIERI/PRODUZIONI/BIOLOGICO.ods"  ' file destinazione
DocUrl = ConvertToURL(sFileName)
DocName = StarDesktop.loadComponentFromURL (DocUrl, "_Default",0, Args() )
Archivio = DocName.Sheets(0) 

Riga = 0
Do while  DocName.Sheets(0).GetCellByposition(0,Riga).String <> ""
Riga = Riga + 1
Loop
Riga = Riga + 1

dRange  = Archivio.getCellRangeByName("A" & Riga & ":I" & Riga) ' range destinazione (PrimaRigaLibera)
dRange.setDataArray(Range)

DocName.store
DocName.Close(true)

End Sub
Mi apre il file in cui dovrebbe incollare ma poi mi restituisce l'errore come da immagine allegata.
Ho provato a fargli incollare in un range ben definito e funziona, ma a condizione che la dimensione del range di destinazione sia uguale a quella di partenza.
Consigli?
Allegati
Schermata del 2022-10-13 17-49-27.png
Schermata del 2022-10-13 17-49-27.png (106.32 KiB) Visto 1252 volte
Ultima modifica di Nicco il lunedì 17 ottobre 2022, 13:52, modificato 1 volta in totale.
LibreOffice 7.4.1.2 su Ubuntu 20.04
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Errore copia e incolla in altro file

Messaggio da Gaetanopr »

Nicco ha scritto: giovedì 13 ottobre 2022, 17:55 Ho provato a fargli incollare in un range ben definito e funziona, ma a condizione che la dimensione del range di destinazione sia uguale a quella di partenza.
Consigli?
Questa è una condizione fondamentale, i range di origine e destinazione devono essere di uguale dimensione, nella macro che hai allegato l'origine ha 4 colonne e 90 righe, la destinazione invece 9 colonne e una riga, la destinazione dovrebbe essere qualcosa del genere ma già lo sai se hai provato e funziona

Codice: Seleziona tutto

dRange  = Archivio.getCellRangeByName("A" & Riga & ":D" & Riga+90) ' range destinazione (PrimaRigaLibera)
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Nicco
Messaggi: 24
Iscritto il: martedì 4 ottobre 2022, 20:53

Re: Errore copia e incolla in altro file

Messaggio da Nicco »

Grazie Gaetano hai ragione! ero stato io un tattarillo, non avevo adattato la macro correttamente...
Tra l'altro avevo bisogno che mi copiasse e incollasse i valori, le date e la formattazione delle celle di partenza, ho sostituito il codice precedente con quest'altro, funziona ma sicuramente sarebbe da ripulire perchè ho scopiazzato righe in qua e la fino a che non ho trovato la quadra...

Codice: Seleziona tutto

Sub AccodaDatiInFileEsterno

Dim Args(0) As New com.sun.star.beans.PropertyValue
Args(0).Name = "MacroExecutionMode"
Args(0).Value = com.sun.star.document.MacroExecMode.ALWAYS_EXECUTE_NO_WARN

Dim DocUlr as string, dummy()

oDispatcher=createUnoService("com.sun.star.frame.DispatchHelper")

Doc = ThisComponent

oFrame1=Doc.CurrentController.Frame

Sheet = Doc.currentcontroller.getActiveSheet() 

Range = Sheet.getCellRangeByName("N40:Q130")

Doc.CurrentController.Select(Range)

oDispatcher.executeDispatch(oFrame1,".uno:Copy","",0,Array())

DocUrl = ConvertToURL(Archivio)

oFrame1=Doc.CurrentController.Frame


Archivio = StarDesktop.loadComponentFromURL("file:///home/valerio/Desktop/GIORNALIERI/PRODUZIONI/BIOLOGICO.ods","_dEF", 0,dummy())

FoglioDestinazione = Archivio.Sheets(0) 

Riga = 0
Do while  Archivio.Sheets(0).GetCellByposition(0,Riga).String <> ""
Riga = Riga + 1
Loop
Riga = Riga + 1

dRange  = FoglioDestinazione.getCellRangeByName("A" & Riga & ":D" & Riga+90) ' range destinazione (PrimaRigaLibera)

Archivio.CurrentController.Select(dRange)

oFrame2=Archivio.CurrentController.Frame

Dim args1(5)as new com.sun.star.beans.PropertyValue
args1(0).Name="Flags"
args1(0).Value="SVDNT"
args1(1).Name="FormulaCommand"
args1(1).Value=0
args1(2).Name="SkipEmptyCells"
args1(2).Value=false
args1(3).Name="Transpose"
args1(3).Value=false
args1(4).Name="AsLink"
args1(4).Value=false
args1(5).Name="MoveMode"
args1(5).Value=4
oDispatcher.executeDispatch(oFrame2,".uno:InsertContents","",0,args1())


Archivio.store
Archivio.Close(ture)

End Sub
Ora il probelma è che nel file di destinazione dovrò copiarci i dati più volte e vorrei che me li incollasse sempre nella prima riga disponibile (in realtà preferirei mantenere una cella vuota tra ogni record ma a questo ci pensiamo dopo), solo che nel range che copio ho alcune celle unite in verticale e le celle unite me le considera come vuote, quindi mi incolla il secondo record a metà del primo. Una possibile soluzione che mi era venuta in mente é modificare la macro che scriva uno spazio o un punto nelle celle vuote prima di copiare o una volta incollate. Esiste un altro metodo? Avete consigli?
EDIT:
Non ne vengo a capo ma mi sono accorto che semplificherei molto le cose se potessi incollare invece che nell'ultima riga disponibile, nell'ultima colonna. In quel caso non avrei celle unite in orizzontale e avrei anche un archivio piu leggibile, solo che non riesco ad adattare questo

Codice: Seleziona tutto

Riga = 0
Do while  Archivio.Sheets(0).GetCellByposition(0,Riga).String <> ""
Riga = Riga + 1
Loop
Riga = Riga + 1

dRange  = FoglioDestinazione.getCellRangeByName("A" & Riga & ":D" & Riga+90) ' range destinazione (PrimaRigaLibera)
Alle colonne. O meglio, farei cosi

Codice: Seleziona tutto

Colonna = 0
Do while  Archivio.Sheets(0).GetCellByposition(Colonna,0).String <> ""
Colonna = Colonna + 1
Loop
Colonna = Colonna + 1
                                                                                  

dRange  = FoglioDestinazione.getCellRangeByposition(Colonna,2,Colonna+3,92)
ma il primo record me lo mette nella colonna C anziché A....ed il secondo non lo incolla proprio...non capisco perchè
LibreOffice 7.4.1.2 su Ubuntu 20.04
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Errore copia e incolla in altro file

Messaggio da Gaetanopr »

Ciao, tu hai il file per provare noi no, allega un esempio, sul primo foglio i dati origine comprensivo di celle unite ect e sul secondo la destinazione incollata a mano per come deve essere, magari inserisci due o più riprese o per colonna o per riga come meglio preferisci.
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Nicco
Messaggi: 24
Iscritto il: martedì 4 ottobre 2022, 20:53

Re: Errore copia e incolla in altro file

Messaggio da Nicco »

Hai ragione.. Il problema è che il file ce l'ho a lavoro... E non posso pubblicarlo.. Appena riesco faccio un facsimile e vediamo se riesco a spiegarvi la situazione
LibreOffice 7.4.1.2 su Ubuntu 20.04
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Errore copia e incolla in altro file

Messaggio da Gaetanopr »

Deve essere uguale nella struttura il resto non conta giusto per testare il codice.
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Nicco
Messaggi: 24
Iscritto il: martedì 4 ottobre 2022, 20:53

Re: Errore copia e incolla in altro file

Messaggio da Nicco »

Eccomi, ho creato un esempio simile con le stesse caratteristiche dell'originale:
_File "Estratto originale" _ è il file che contiene il database nel foglio1, nel foglio 2 la situazione che si presenta nel file originale e nel foglio 3 un esempio di tabella da copiare ed incollare nel file "PRODUZIONE1".
_File "PRODUZIONE1" _ E' il file di destinazione in cui incolla la macro, l'archivio in cui vorrei venissero incollate le tabelle.
_File "archivio obbiettivo" _ è un esempio di come vorrei risultasse il file PRODUZIONE1 dopo aver salvato 3 record.
Purtroppo non riesco a ritestare la macro perchè a casa ho windows 11 ed a lavoro ubuntu, con ubuntu funzionava (seppur con i limiti che ho descritto nel post precedente), con windows mi da questo errore...
Impossibile creare il file di blocco per l'accesso esclusivo di LibreOffice, in quanto mancano i permessi per la sua creazione in quella posizione oppure non c'è spazio libero sul disco.

Ho provato a smanettare tra le autorizzazioni di windows ma non ne vengo a capo, comunque non mi interessa per il momento.

Mi è venuto in mente che non ho provato ad incollare a mano la prima tabella e poi lanciare la macro, quando avevo modificato il codice per incollare nella prima colonna libera, mi incollava a partire da B3 anziché A3 ed il secondo record non lo incollava, probabilmente lui prendeva colonna+1 e incollava in B3, il secondo record me lo incollava sopra al primo perche vedeva la colonna A vuota e incollava in B. Forse incollando una prima tabella a mano dopo inizia a funzionare, sarei apposto ma non riesco a testare ora :x
Allegati
PRODUZIONE1.ods
(7.06 KiB) Scaricato 37 volte
Estratto originale.ods
(35.4 KiB) Scaricato 39 volte
archivio obbiettivo.ods
(27.89 KiB) Scaricato 43 volte
LibreOffice 7.4.1.2 su Ubuntu 20.04
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Errore copia e incolla in altro file

Messaggio da Gaetanopr »

Nicco ha scritto: sabato 15 ottobre 2022, 15:14 Mi è venuto in mente che non ho provato ad incollare a mano la prima tabella e poi lanciare la macro, quando avevo modificato il codice per incollare nella prima colonna libera, mi incollava a partire da B3 anziché A3 ed il secondo record non lo incollava, probabilmente lui prendeva colonna+1 e incollava in B3, il secondo record me lo incollava sopra al primo perche vedeva la colonna A vuota e incollava in B. Forse incollando una prima tabella a mano dopo inizia a funzionare, sarei apposto ma non riesco a testare ora :x
Intanto ti rispondo velocemente a questa, puoi aggiungere questa parte dopo il loop If Colonna = 1 The Colonna = 0.
In pratica se la colonna è B allora diventa A, in questo modo alla prima ripresa incolla a partire da colonna A e poi non la trova più vuota, vedi se così risolvi:D .
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Nicco
Messaggi: 24
Iscritto il: martedì 4 ottobre 2022, 20:53

Re: Errore copia e incolla in altro file

Messaggio da Nicco »

Buongiorno, il tuo consiglio come al solito funzionava, il primo record lo posizionava in maniera corretta. Avevo però dei problemi con i successivi record perchè se volevo lasciare una colonna vuota tra un record e l'altro non potevo usare come metodo per trovare la colonna su cui incollare questo

Codice: Seleziona tutto

Colonna = 0
Do while  Archivio.Sheets(0).GetCellByposition(Colonna,0).String <> ""
Colonna = Colonna + 1
Loop
Colonna = Colonna + 1
                                                                                  

dRange  = FoglioDestinazione.getCellRangeByposition(Colonna,2,Colonna+3,92)
Altrimenti il secondo record lo avrebbe incollato in maniera corretta ma il terzo avrebbe trovato la colonna vuota tra il 1° e il 2° e me lo avrebbe incollato sopra al 2°.
Ho risolto utilizzando questo codice che da quel che ne capisco dovrebbe andare a cercare l'ultima colonna piena anzichè la prima vuota...

Codice: Seleziona tutto

Cursore = FoglioDestinazione.createCursor
Cursore.gotoEndOfUsedArea(false)
UltimaColonna = Cursore.RangeAddress.EndColumn
Colonna = UltimaColonna + 2
                                                                              
dRange  = FoglioDestinazione.getCellRangeByPosition(Colonna,2,Colonna+3,92)
Solo un dubbio, in che riga controlla se la colonna è piena? su tutte? e se avessi un intestazione?
LibreOffice 7.4.1.2 su Ubuntu 20.04
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Errore copia e incolla in altro file

Messaggio da Gaetanopr »

Nicco ha scritto: lunedì 17 ottobre 2022, 9:26 Solo un dubbio, in che riga controlla se la colonna è piena? su tutte? e se avessi un intestazione?
Si controlla sull'ultima riga piena quindi tutte, se lo vuoi specifico per riga puoi fare un ciclo a ritroso come questo, partendo dall'ultima colonna piena vai indietro verificando le celle sulla riga da te indicata se sono piene.

Codice: Seleziona tutto

Cursore = FoglioDestinazione.createCursor
Cursore.gotoEndOfUsedArea(false)
UltimaColonna = Cursore.RangeAddress.EndColumn
For x = UltimaColonna To 0 Step - 1
 If FoglioDestinazione.getCellByPosition(x, rigainteressata).String <> "" Then
   UltimaColonna = x + 1 ' aggiungo 1 all'ultima cella piena
   exit For   ' una volta trovata l'ultima cella piena si esce dal ciclo
Next x                                   
UltimaColonna sarà l'ultima cella piena + 1 sulla riga indicata da te.
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Nicco
Messaggi: 24
Iscritto il: martedì 4 ottobre 2022, 20:53

Re: Errore copia e incolla in altro file

Messaggio da Nicco »

Fantastico! grazie ancora, metto risolto!!!
LibreOffice 7.4.1.2 su Ubuntu 20.04
Rispondi