Pagina 1 di 1

[Risolto] Copia tra due file di calc con macro

Inviato: lunedì 20 luglio 2020, 15:26
da Ant52
Buongiorno,
qualche tempo fa ero riuscito, grazie alla vostra preziosa collaborazione, a far funzionare questa macro che copia i dati da un determinato range di un file di calc e li trasferisce in un altro chiamato "Archivio" accodando i dati nella prima riga vuota.. Questa è la macro che mi funziona perfettamente:

Codice: Seleziona tutto

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

Rem Attribute VBA_ModuleType=VBADocumentModu

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 ="C:\Users\NomeUtente\Desktop\Archivio.ods"  ' file destinazione
DocUrl = ConvertToURL(sFileName)
DocName = StarDesktop.loadComponentFromURL (DocUrl, "_blank",0, Dummy() )
Archivio = DocName.Sheets(0) 

Archivio.unprotect("PIPPO") 

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
Avendo l'esigenza di fare lo stesso lavoro con altri due file di calc ho pensato bene, ingenuamente, che bastasse copiare la macro di cui sopra, modificare i riferimenti e tutto sarebbe andato bene. Viceversa la stessa macro, con i riferimenti modificati mi da "errore di runtime BASIC - Variabile dell'oggetto non impostata" alla riga:Scadenzario = DocName.Sheets(0) . Questa è la macro che ho modificato e mi piacerebbe capire perchè mi dà la segnalazione di errore pur essendo uguale alla prima:

Codice: Seleziona tutto

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

Rem Attribute VBA_ModuleType=VBADocumentModu

Sub AccodaDatiInFileEsterno

Dim DocName as object, DocUlr as string, dummy(), range as object
Doc = ThisComponent
Sheet = Doc.Sheets(5) ' 6° foglio del file contenete la macro
Range = Sheet.getCellRangeByName("A17:I17").getDataArray ' range da copiare
sFileName ="C:\Users\NomeUtente\Desktop\Scadenzario.ods"  ' file destinazione
DocUrl = ConvertToURL(sFileName)
DocName = StarDesktop.loadComponentFromURL (DocUrl, "_blank",0, Dummy() )
Scadenzario = DocName.Sheets(0) 

Scadenzario.unprotect("PIPPO") 

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

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

End Sub
Spero di essere stato chiaro anche se non ho allegato i files in questione. Se fosse indispensabile per capire da dove proviene l'errore, fatemelo sapere. Attendo fiducioso nella vostra estrema cortesia e preparazione in materia. Grazie.Buona giornata.

Re: Copia tra due file di calc con macro

Inviato: lunedì 20 luglio 2020, 17:37
da charlie
Ciao, per favore usa la formattazione del codice nei tui post. Per stavolta ci ho pensato io.

Re: Copia tra due file di calc con macro

Inviato: lunedì 20 luglio 2020, 19:33
da Ant52
Messaggio per Charlie: Grazie per la interessantissima guida però non sono riuscito a capire come (e dove) devo impostare la variabile dell'oggetto dal momento che la prima macro funziona perfettamente e la variabile dell'oggetto "Archivio" non è definita da nessuna parte. Se puoi spiegarmi in termini più semplici te ne sarei molto grato. Grazie mille.

Re: Copia tra due file di calc con macro

Inviato: lunedì 20 luglio 2020, 20:13
da charlie
Non colgo il senso, non ti ho dato nessun suggerimento. Ti ho solo invitato ad usare una funzione del forum per visualizzare meglio il codice postato.

Re: Copia tra due file di calc con macro

Inviato: lunedì 20 luglio 2020, 20:40
da Ant52
C'è stata sicuramente una incomprensione da parte mia però nel messaggio c'era scritto che per questa volta ci avevi pensato tu, quindi non ho capito che la risposta si riferiva alla formattazione del codice. Per quanto riguarda il mio quesito invece cosa mi puoi suggerire? Grazie.

Re: Copia tra due file di calc con macro

Inviato: lunedì 20 luglio 2020, 21:10
da lucky63
Su computer con sistema operativo linux.
Utilizzato “_Default” invece di “_blank”.
Nelle macro ho modificato il percorso (in formato linux).
Funzionano regolarmente. Test con:
LibreOffice 6.3.6 Ok
OpenOffice 4.1.7 Ok
Se hai ancora problemi prova a resettare il profilo utente.

Ti allego i file utilizzati.
.

Re: Copia tra due file di calc con macro

Inviato: martedì 21 luglio 2020, 8:47
da Ant52
Ho fatto le modifiche suggerite e adesso, non ho ancora capito perchè, funziona ma con un difetto. Nel senso che apre il file "Scadenzario" , copia tutta la riga A17:I17 ma non la incolonna nella prima riga vuota. La trovo incolonnata sotto l'ultima riga della griglia. Se invece cancello tutta la griglia che separa le colonne e le righe la mette al posto giusto cioè nella prima riga vuota. Mi piacerebbe capirci qualcosa in quanto la stessa identica macro, in un altro file, mi funziona perfettamente ed accoda i dati correttamente nella prima riga vuota. Stavolta allego i file di esempio per facilitare la comprensione del problema.Grazie mille per l'aiuto.

Re: Copia tra due file di calc con macro

Inviato: martedì 21 luglio 2020, 10:33
da patel
il metodo che hai usato per trovare l'ultima riga funziona soltanto in assenza di bordi, prova questa

Codice: Seleziona tutto

Sub Ultima__riga 
  Sh = ThisComponent.Sheets(0)
  RangeVuoto = Sh.Columns(2).queryEmptyCells ' colonna C
  RangeVuoto = RangeVuoto(RangeVuoto.Count - 1)
  Riga = RangeVuoto(0).RangeAddress.StartRow 
  print Riga
End Sub

Re: Copia tra due file di calc con macro

Inviato: martedì 21 luglio 2020, 13:18
da lucky63
Ant52 ha scritto:La trovo incolonnata sotto l'ultima riga della griglia. Se invece cancello tutta la griglia che separa le colonne e le righe la mette al posto giusto cioè nella prima riga vuota.
Sostituisci:

Codice: Seleziona tutto

Cursore = Scadenzario.createCursor
Cursore.gotoEndOfUsedArea(false)
UltimaRiga = Cursore.RangeAddress.EndRow
Riga = UltimaRiga + 2
Con:

Codice: Seleziona tutto

Rem Trova prima riga vuota in colonna A
Riga = 0
Do while  DocName.Sheets(0).GetCellByposition(0,Riga).String <> ""
Riga = Riga + 1
Loop
Riga = Riga + 1
... e accoda regolarmente anche con la griglia nella prima riga libera (riferita a colonna A) ...
.

[Risolto] Copia tra due file di calc con macro

Inviato: martedì 21 luglio 2020, 16:15
da Ant52
Mi sembra che con questa modifica funzioni correttamente. Ho solo sostituito a Riga = 0 con Riga = 7 in quanto la mia griglia inizia dalla riga 8 ed incolonna perfettamente i dati. Mi resta solo una curiosità: perchè la macro che avevo per fare lo stesso lavoro con altri due file mi funziona bene senza ricorrere a tutto questo? Dove sta la diversità? Sarei proprio curioso di saperlo. Grazie mille per l'aiuto determinante.

Re: Copia tra due file di calc con macro

Inviato: martedì 21 luglio 2020, 19:23
da lucky63
Il file che avevo allegato precedentemente lo avevo testato con "Scadenziario" senza tabella bordata e come dicevo era ok.
Ho riprovato adesso con tabella bordata (in scadenziario) e:
Con OpenOffice 4.1.7 è Ok. Accoda regolarmente nella prima riga libera nella tabella bordata.
Con LibreOffice 6.3.6 mi ha dato lo stesso problema che segnalavi (accodamento in prima riga libera dopo tabella bordata).
Cancellata tale riga.
Resettato il profilo utente di LibreOffice 6.3.6 e con nuovo test ora accoda regolarmente nella prima riga libera nella tabella bordata anche con LibreOffice.
Ant52 ha scritto:Mi resta solo una curiosità: perchè la macro che avevo per fare lo stesso lavoro con altri due file mi funziona bene senza ricorrere a tutto questo? Dove sta la diversità? Sarei proprio curioso di saperlo.
Per il mio esempio di prima, per come adattate nel percorso, ..., le macro sono entrambe corrette e funzionanti.
Non saprei cosa altro dirti.

Re: Copia tra due file di calc con macro

Inviato: mercoledì 22 luglio 2020, 7:40
da Ant52
Grazie per l'ulteriore spiegazione. Forse è proprio il reset del profilo utente che avrebbe risolto il problema senza modificare la macro vecchia. Ancora grazie per il prezioso aiuto. Buona giornata.

Re: Copia tra due file di calc con macro

Inviato: mercoledì 22 luglio 2020, 8:46
da lucky63
.
Correggi l'inserimento del [Risolto].
Va inserito davanti al quesito di apertura (iniziale) altrimenti poi non si vede nel riepilogo degli argomenti.

Vedi questo link.
.