[Risolto]Copia tra due file e inserire in prima riga vuota

Discussioni sull'applicazione per i fogli di calcolo
Rispondi
Ant52
Messaggi: 176
Iscritto il: sabato 18 agosto 2018, 15:38

[Risolto]Copia tra due file e inserire in prima riga vuota

Messaggio da Ant52 »

Buonasera a tutti,
ho necessità di archiviare dei dati da un foglio di calc in un altro file chiamato "archivio" inserendoli nella prima riga vuota disponibile. Avevo predisposto una macro che copiava i dati' , apriva un nuovo file e li inseriva sempre nella stessa riga e da lì poi potevo lavorarci. Adesso però ho l'esigenza di prelevare i dati da una riga (sempre la stessa A7:J7) che però contiene dati generati da formule (quindi dovrei fare un copia/ incolla speciale) e inoltre li dovrei inserire in un elenco quindi nella prima riga vuota. Pensavo di utilizzare la macro che allego inserendo la parte relativa al copia/incolla speciale ed alla ricerca della prima riga vuota ma non ci sono riuscito. Chiedo pertanto il vostro aiuto per risolvere il problema. Grazie mille.
Questa è la macro di partenza:

Codice: Seleziona tutto

REM  *****  BASIC  *****

Rem Attribute VBA_ModuleType=VBADocumentModu

Sub ApriDoc_CopiaRange

Dim DocName as object, DocUlr as string, dummy(), range as object
Doc = ThisComponent
Sheet = Doc.Sheets(10)
Range = Sheet.getCellRangeByName("A7:J7").getDataArray ' range da copiare
sFileName ="C:\Users\Desktop\Archivio.ods"  ' file destinazione
DocUrl = ConvertToURL(sFileName)
DocName = StarDesktop.loadComponentFromURL (DocUrl, "_blank",0, Dummy() )
Sheet1 = DocName.Sheets(1)

dRange  = Sheet1.getCellRangeByName("A7:J7") ' range destinazione che adesso dovrà essere variabile in base alla prima cella vuota
dRange.setDataArray(Range)
DocName.store
DocName.Close(true)

End Sub
Ultima modifica di Ant52 il sabato 22 febbraio 2020, 15:24, modificato 2 volte in totale.
OpenOffice 4.1.5 Windows 10
Avatar utente
lucky63
Volontario assiduo
Volontario assiduo
Messaggi: 2997
Iscritto il: martedì 18 maggio 2010, 17:01

Re: Copia tra due file di calc e inserire nella prima riga v

Messaggio da lucky63 »

.
Prova questa.

Codice: Seleziona tutto

Sub AccodaDatiInFileEsterno
Dim dummy()
Doc = ThisComponent
Dest = StarDesktop.loadComponentFromURL ("file:///C:/Users/Desktop/Archivio.ods", "_Blank",0, Dummy() )
' Linux Dest = StarDesktop.loadComponentFromURL ("file:///home/NomeUtente/Scrivania/Archivio.ods", "_Blank",0, Dummy() )
' File esterno di archiviazione deve essere già presente
Origine = Doc.Sheets.getByIndex(0) 'Primo foglio dell'indice del file contenente la macro
Range = Origine.getCellRangeByName("A7:J7").getDataArray ' range da copiare

Archivio = Dest.Sheets.getByIndex(0) 'Primo foglio dell'indice del file esterno

Cursore = Archivio.createCursor
Cursore.gotoEndOfUsedArea(false)
UltimaRiga = Cursore.RangeAddress.EndRow
Riga = UltimaRiga + 2

RangeDestinazione = Archivio.getCellRangeByName("A" & Riga & ":J" & Riga) ' range destinazione (PrimaRigaLibera)
RangeDestinazione.setDataArray(Range)
Dest.store()
Dest.Close(true)
End sub
Ant52
Messaggi: 176
Iscritto il: sabato 18 agosto 2018, 15:38

Re: Copia tra due file di calc e inserire nella prima riga v

Messaggio da Ant52 »

Ringrazio lucky63 per la rapidissima risposta. Ho provato al macro che apre correttamente il file di destinazione però si blocca in quanto da errore nella riga: "Range = Origine.getCellRangeByName("A7:J7").getDataArray ' range da copiare" Errore di runtime Basic. '1' Type:com.sun.star.uno.RuntimeException
Message: Invalid Argument"
Pertanto non copia i dati.
Ti chiedo scusa se non ho allegato i due file ma, contenendo dati personali, avrei dovuto svuotarli e riempirli con dati a casaccio, però se è indispensabile posso ovviamente farlo. Inoltre faccio due precisazioni:
- ho modificato il foglio che contiene i dati da copiare in quanto è il foglio 11 del file di partenza (non è il primo foglio) ed ho inserito (10) al posto di (0)
- mi piacerebbe sapere se questa macro di archiviazione è valida anche se il file ricevente si trovasse in una cartella protetta da password o se il file stesso fosse protetto da password. Ritengo che, in questi casi andrebbe indicata la password nella macro stessa e quindi sorgerebbe il problema (per me)di nascondere tutte le macro.
Attendo fiducioso un aiuto per risolvere positivamente questo piccolo intoppo. Grazie mille e buona giornata
OpenOffice 4.1.5 Windows 10
Avatar utente
lucky63
Volontario assiduo
Volontario assiduo
Messaggi: 2997
Iscritto il: martedì 18 maggio 2010, 17:01

Re: Copia tra due file di calc e inserire nella prima riga v

Messaggio da lucky63 »

Per fare delle prove avevo creato un file "Test" contenente la macro e un file "archivio" come ricevente dei dati da accodare. Fatte alcune prove su Linux ed era tutto OK.

Ho modificato il file "Test" con 11 fogli.
Macro ora spostata in "LibreriaMia" proteggendo la libreria con password "PIPPOPIPPO".
Macro adeguata in base al foglio 11 e gestione iniziale e finale della password di protezione del foglio1 (Password "PIPPO") del file "archivio".

Cambiando valore alla cella gialla Foglio11.A6 del file "Test" cambiano i sottostanti valori del range verde Foglio11.A7:J7
01.png
01.png (8.85 KiB) Visto 2355 volte
Cliccando sul pulsante collegato alla macro si avvia la macro che accoda in archivio.
Macro provata su linux tutto OK

Codice: Seleziona tutto

Sub AccodaDatiInFileEsterno
Dim dummy()
Doc = ThisComponent
Dest = StarDesktop.loadComponentFromURL ("file:///home/NomeUtente/Scrivania/archivio.ods", "_Blank",0, Dummy() ) 'Esempio Linux
' Dest = StarDesktop.loadComponentFromURL ("file:///C:/Percorso/NomeFile.ods", "_Blank",0, Dummy() ) 'Esempio Windows
' ATTENZIONE - La barra del percorso è sempre indicata / anche su WINDOWS.
' Ovviamente il file esterno di archiviazione deve essere già presente
Origine = Doc.Sheets.getByIndex(10) 'Il primo foglio è Nr 0 (Nr 10 = 11°Foglio) dell'indice del file contenente la macro
Range = Origine.getCellRangeByName("A7:J7").getDataArray ' range da copiare

Archivio = Dest.Sheets.getByIndex(0) 'Primo foglio dell'indice del file esterno
Archivio.unprotect("PIPPO") ' toglie password PIPPO di protezione foglio al file esterno 

Cursore = Archivio.createCursor
Cursore.gotoEndOfUsedArea(false)
UltimaRiga = Cursore.RangeAddress.EndRow
Riga = UltimaRiga + 2

'Print Riga 'Test verifica NrRiga

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

Archivio.protect("PIPPO") ' Inserisce password PIPPO di protezione foglio
Dest.store() 
Dest.Close(true)

End sub
La macro deve essere adeguata nella parte iniziale relativamente al percorso e al proprio sistema operativo.
Allego i due file.
------------------------------------
- Se file "archivio" fosse protetto da password di apertura non ti so al momento aiutare;
- Come detto macro ora modificata per gestire protezione foglio1 del file "archivio";
- Per quanto riguarda la password da indicare nella macro potresti fare un mix tra inserimento testuale ed acquisizione da una o più celle. Spostare macro in libreria personalizzata protetta da password e sperare che utilizzatore finale non sia poi così smanettone da andare a scompattare il file contenente la macro ... in taluni casi si riuscirebbe ad individuare qualcosa in merito ...
Allegati
archivio.ods
(10.74 KiB) Scaricato 80 volte
Test.ods
(18.32 KiB) Scaricato 95 volte
Ant52
Messaggi: 176
Iscritto il: sabato 18 agosto 2018, 15:38

Re: Copia tra due file di calc e inserire nella prima riga v

Messaggio da Ant52 »

Ho provato la macro che hai postato ma mi da sempre lo stesso errore di prima nella riga Range = Origine.getCellRangeByName("A7:J7").getDataArray
Io uso Wndows 10 è possibile che si comporti in maniera differente da Linux? Comunque avevo ovviamente scelto Dest = StarDesktop.loadComponentFromURL ("file:///C:/Percorso/NomeFile.ods", "_Blank",0, Dummy() ) per l'apertura del file di archiviazione e cancellato la riga per Linux. Se è indispensabile ti manderei i files su cui lavoro svuotati. Grazie mille per la collaborazione.
OpenOffice 4.1.5 Windows 10
Avatar utente
lucky63
Volontario assiduo
Volontario assiduo
Messaggi: 2997
Iscritto il: martedì 18 maggio 2010, 17:01

Re: Copia tra due file di calc e inserire nella prima riga v

Messaggio da lucky63 »

.
Fatto nuovi test su Linux sia con LibreO628 che OOo417 tutto OK.
Fatto nuovi test su una vecchia versione di Windows XP (Quanto tempo che non usavo Windows) sia con LibreO628 che OOo417 tutto OK

L'errore che hai riscontrato potrebbe essere riconducibile al "Java" ... vedi questo link

Ho adattato la macro che hai postato inizialmente modificandola per quel che serviva ed è ora inserita nella libreria standard del file "Test1".

Codice: Seleziona tutto

Sub AccodaDatiInFileEsterno
Dim DocName as object, DocUlr as string, dummy(), range as object
Doc = ThisComponent
Sheet = Doc.Sheets(10) ' 11° foglio del file contenete la macro
Range = Sheet.getCellRangeByName("A7:J7").getDataArray ' range da copiare
'sFileName ="/home/NomeUtente/Scrivania/archivio.ods"  ' file destinazione
sFileName ="C:\Test\archivio.ods"  ' file destinazione
DocUrl = ConvertToURL(sFileName)
DocName = StarDesktop.loadComponentFromURL (DocUrl, "_blank",0, Dummy() )
Archivio = DocName.Sheets(1) ' il secondo foglio del file archivio

Archivio.unprotect("PIPPO") ' toglie password PIPPO di protezione foglio al file esterno 

Cursore = Archivio.createCursor
Cursore.gotoEndOfUsedArea(false)
UltimaRiga = Cursore.RangeAddress.EndRow
Riga = UltimaRiga + 2

dRange  = Archivio.getCellRangeByName("A" & Riga & ":J" & Riga) ' range destinazione (PrimaRigaLibera)
dRange.setDataArray(Range)
Archivio.protect("PIPPO") ' Inserisce password PIPPO di protezione foglio
DocName.store
DocName.Close(true)

End Sub
Accodamento dati sul secondo foglio del file "archivio".
Test fatti con le versioni predette di LibreO e OOo sia su Linux che su Windows XP tutto OK.
Macro da adattare nel percorso ...
Allego i nuovi file usati.
.
Allegati
Test1.ods
(14.41 KiB) Scaricato 110 volte
archivio.ods
(11.22 KiB) Scaricato 105 volte
Ant52
Messaggi: 176
Iscritto il: sabato 18 agosto 2018, 15:38

[Risolto]Copia tra due file di calc e inserire nella prima r

Messaggio da Ant52 »

Adesso funziona perfettamente. Non mi è chiaro solo come fare per proteggere le librerie che contengono le macro con password. Tieni presente che, dovendo lavorare con pc diversi, le macro non posso registrarle nelle libreria personale ma in quella del file. Grazie ancora per il preziosissimo aiuto
OpenOffice 4.1.5 Windows 10
Avatar utente
lucky63
Volontario assiduo
Volontario assiduo
Messaggi: 2997
Iscritto il: martedì 18 maggio 2010, 17:01

Re: Copia tra due file di calc e inserire nella prima riga v

Messaggio da lucky63 »

Ant52 ha scritto:Non mi è chiaro solo come fare per proteggere le librerie ...
Allego file con descrizione grafica dei passaggi da effettuare per creare nuova libreria protetta da password interna al file.
Procedura riguarda LibreOffice 6.2.8.
Con OpenOffice è simile ...

Per quanto riguarda come mettere il [RISOLTO] vedi questo link e adegua il tutto.
.
Allegati
NuovaLibreriaProtettaConPassword.pdf
(133.95 KiB) Scaricato 116 volte
Ant52
Messaggi: 176
Iscritto il: sabato 18 agosto 2018, 15:38

Re: [Risolto]Copia tra due file e inserire in prima riga vuo

Messaggio da Ant52 »

Ti ringrazio molto per il prezioso aiuto e per la celerità delle risposte. Appena possibile proverò a proteggere tutte le macro del mio file. Però mi sorge qualche dubbio: se creo una libreria nuova protetta posso copiarci ( con copia/incolla)tutte le macro che mi servono? Le macro continueranno a funzionare anche trasportando il mio file su un altro computer (ovviamente cambiando i riferimenti)? E in quest'ultimo caso come potrei modificare il riferimento del nuovo pc per uniformarli (per esempio da
C:\\Users\MioPc\Dsktop....etc a C:\\Users\Giovanni\Desktop...etc)?
Spero di non avere approfittato troppo della tua disponibilità e cortesia. Grazie mille
OpenOffice 4.1.5 Windows 10
Avatar utente
lucky63
Volontario assiduo
Volontario assiduo
Messaggi: 2997
Iscritto il: martedì 18 maggio 2010, 17:01

Re: [Risolto]Copia tra due file e inserire in prima riga vuo

Messaggio da lucky63 »

Nella LibreriaProtetta inserita nel file puoi copiare tutte le macro che servono al file (o che vuoi).

Nel caso le macro siano collegate a "Pulsanti" dovrai però reimpostarne il collegamento/percorso nelle proprietà del pulsante interessato.

Trasferendo il file ad altri PC la LibreriaProtetta inserita nel file segue ovviamente il file e le macro quando richiamate si avvieranno normalmente.

Laddove avessi necessità di modificare in modo dinamico riferimenti di percorso interni alla macro potresti ad esempio acquisire il risultato restituito da una formula simile alla seguente posta in una cella (anche in area nascosta) del file stesso:

Codice: Seleziona tutto

=CELLA("FILENAME";A1)
01.png
La formula restituisce una stringa simile alle seguenti (si adatta al sistema operativo).
'file:///home/NomeUtente/...PercorsoAllaCartellaDelFile.../NomeDelFile'#$NomeDelFoglio
'file:///C:/users/NomeUtente/...PercorsoAllaCartellaDelFile.../NomeDelFile'#$NomeDelFoglio
Di questa stringa potresti quindi acquisirne la parte d'interesse.

Altra possibilità direttamente interna alla macro (che ho trovato descritta in rete e non ho provato) potrebbe essere quella di usare un'istruzione simile:

Codice: Seleziona tutto

Percorso = enviroment("USERPROFILE") & "\NomeCartellaDoveSiTrovaIlFile\"
In questo caso però il file dovrebbe restare sempre nella cartella indicata nella macro mentre nel caso precedente non sussisterebbe tale limite.
.
Allegati
PIPPO.ods
(9.6 KiB) Scaricato 95 volte
Ant52
Messaggi: 176
Iscritto il: sabato 18 agosto 2018, 15:38

Re: [Risolto]Copia tra due file e inserire in prima riga vuo

Messaggio da Ant52 »

Ti ringrazio per i tuoi preziosissimi suggerimenti che ho già applicato al mio file creando la cartella protetta e copiandoci (con il copia/incolla) tutte le macro. Ho dimenticato però di scrivere che questo file si apre con una finestra di dialogo , tipo Menu, con otto pulsanti collegati alle macro e, uno di questi, apre una seconda finestra di dialogo che mi serve come maschera di inserimento dati. Ovviamente non sono riuscito a copiare queste due finestre di dialogo nella nuova libreria. Mentre per quella tipo Menu con pochi pulsanti e nessun campo dati potrei rifarla, l'altra contiene una cinquantina di campi dati con altrettante intestazioni di casella oltre a otto pulsanti collegati alle macro e sinceramente preferirei, se fosse possibile, trovare un metodo per ricopiarla pari pari anche per evitare errori nella ricopiatura. Grazie mille per la disponibilità e buona giornata.
OpenOffice 4.1.5 Windows 10
Avatar utente
lucky63
Volontario assiduo
Volontario assiduo
Messaggi: 2997
Iscritto il: martedì 18 maggio 2010, 17:01

Re: [Risolto]Copia tra due file e inserire in prima riga vuo

Messaggio da lucky63 »

Al momento non so aiutarti oltre.
Inoltre siamo già andati di molto oltre al quesito iniziale.
Nel caso apri un nuovo post con relativo quesito specifico.
Ant52
Messaggi: 176
Iscritto il: sabato 18 agosto 2018, 15:38

Re: [Risolto]Copia tra due file e inserire in prima riga vuo

Messaggio da Ant52 »

Ti chiedo scusa per l'insistenza. Hai perfettamente ragione avrei dovuto aprire un nuovo post con una richiesta diversa.
Grazie ancora. Buona serata.
OpenOffice 4.1.5 Windows 10
Rispondi