[Risolto] Copia e incolla speciale tra fogli su prima riga

Creare una macro - Scrivere uno script - Usare le API
Rispondi
Record
Messaggi: 12
Iscritto il: lunedì 8 ottobre 2012, 0:47

[Risolto] Copia e incolla speciale tra fogli su prima riga

Messaggio da Record »

Buonasera,
sto cercando di creare una macro di Calc che mi permetta di:
copiare il contenuto del range di celle A2:DZ2 di un foglio chiamato "Formula" ed incollarlo speciale (solo testo, numeri e data/ora senza formule e formattazione) in un foglio chiamato "Dati" nella prima riga vuota in basso.
Le mie basilari conoscenze non mi permettono di venirne a capo.
Sono riuscito attraverso il registratore di macro a creare la porzione di codice che copia ed incolla correttamente.
Non so come fare per scrivere nella prima riga disponibile nel foglio di destinazione.
Oltretutto il registratore genera codice con un linguaggio che non conosco.
Provengo da esperienze con il basic, mi piacerebbe che fosse scritto in modo più comprensibile per me.
Ho provato a cercare sul forum ma non ho trovato aiuto negli argomenti già trattati.

Grazie
Ultima modifica di Record il lunedì 16 luglio 2018, 13:39, modificato 2 volte in totale.
OOo 3.4 Win7
patel
Volontario attivo
Volontario attivo
Messaggi: 4019
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Copia e incolla speciale tra fogli su prima riga libera

Messaggio da patel »

Per imparare
http://professoressa.altervista.org/Dis ... re_OOo.pdf
http://www.pitonyak.org/oo.php

prova questa

Codice: Seleziona tutto

sub CopiaIncollaUltimaRiga ' per copiare valori
Doc = ThisComponent
Sheet = Doc.Sheets(0)
Sheet1 = Doc.Sheets.getByName("Formula")
c = Sheet1.createCursor
c.gotoEndOfUsedArea(false)
LastRow = c.RangeAddress.EndRow + 2
source = Sheet.getCellRangeByName("A2:D22").getDataArray
nrighe = UBound(source()) - LBound(source())
Sheet1.getCellRangeByName("A" & Lastrow & ":D" & Lastrow + nrighe).setDataArray(Source)
End Sub
se non funziona allega un file di esempio con anche il risultato desiderato.
-------------------
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
Record
Messaggi: 12
Iscritto il: lunedì 8 ottobre 2012, 0:47

Re: Copia e incolla speciale tra fogli su prima riga libera

Messaggio da Record »

Grazie a patel per la sollecita risposta.
Allego un file di esempio perchè mi pare non funzioni.
Grazie
Allegati
esempio per macro.ods
(11.29 KiB) Scaricato 205 volte
OOo 3.4 Win7
patel
Volontario attivo
Volontario attivo
Messaggi: 4019
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Copia e incolla speciale tra fogli su prima riga libera

Messaggio da patel »

avevo capito che il range da copiare fosse A2:D22 (ventidue) invece vuoi copiare una sola riga, comunque la macro funziona, solo che nel file di esempio la riga 2 è vuota

Codice: Seleziona tutto

sub CopiaIncollaUltimaRiga ' per copiare valori
Doc = ThisComponent
Sheet = Doc.Sheets(0)
Sheet1 = Doc.Sheets.getByName("Formula")
c = Sheet1.createCursor
c.gotoEndOfUsedArea(false)
LastRow = c.RangeAddress.EndRow + 2
source = Sheet.getCellRangeByName("A2:DZ2").getDataArray
nrighe = UBound(source()) - LBound(source())
Sheet1.getCellRangeByName("A" & Lastrow & ":DZ" & Lastrow + nrighe).setDataArray(Source)
End Sub
-------------------
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
Record
Messaggi: 12
Iscritto il: lunedì 8 ottobre 2012, 0:47

Re: Copia e incolla speciale tra fogli su prima riga libera

Messaggio da Record »

Grazie ma continuo a non capire...
La riga 2 del foglio "Formula" contiene dati. Forse mi sono spiegato male.
Devo prendere la seconda riga del foglio "Formula" (resta sempre fissa la seconda) e copiarla nella prima riga disponibile del foglio "Dati" (aumenta sempre di una).
Nell'esempio c'è anche il foglio "Origine" ma è solo dove scrivo i dati, non è interessato dalla macro.

In particolare non capisco dove incolla speciale nel foglio dati

Codice: Seleziona tutto

sub CopiaIncollaUltimaRiga ' per copiare valori
Doc = ThisComponent 'legge il file
Sheet = Doc.Sheets(0) '?
Sheet1 = Doc.Sheets.getByName("Formula") 'seleziona il foglio "Formula"
c = Sheet1.createCursor '?
c.gotoEndOfUsedArea(false) 'trova l'ultima riga occupata?
LastRow = c.RangeAddress.EndRow + 2 'imposta la riga libera in cui scrivere?
source = Sheet.getCellRangeByName("A2:DZ2").getDataArray 'preleva i dati da copiare
nrighe = UBound(source()) - LBound(source()) '?
Sheet1.getCellRangeByName("A" & Lastrow & ":DZ" & Lastrow + nrighe).setDataArray(Source) '?
End Sub
ho commentato le righe di codice per quello che ho capito.
Non capisco dove le scrive nel foglio "Dati".
Puoi aiutarmi ancora?
Grazie!
OOo 3.4 Win7
patel
Volontario attivo
Volontario attivo
Messaggi: 4019
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Copia e incolla speciale tra fogli su prima riga libera

Messaggio da patel »

Scusami, ma tu ti eri spiegato bene, sono io che ho capito fischi per fiaschi

Codice: Seleziona tutto

sub CopiaIncollaUltimaRiga ' per copiare valori
Doc = ThisComponent
Sheet = Doc.Sheets.getByName("Formula")
Sheet1 = Doc.Sheets.getByName("Dati")
c = Sheet1.createCursor
c.gotoEndOfUsedArea(false)
LastRow = c.RangeAddress.EndRow + 2
source = Sheet.getCellRangeByName("A2:DZ2").getDataArray
nrighe = UBound(source()) - LBound(source())
Sheet1.getCellRangeByName("A" & Lastrow & ":DZ" & Lastrow + nrighe).setDataArray(Source)
End Sub
Questa macro funziona anche con range di più righe, nel tuo caso nrighe è sempre zero
Non viene usato l'incolla speciale ma il range viene convertito in array di valori
-------------------
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
Record
Messaggi: 12
Iscritto il: lunedì 8 ottobre 2012, 0:47

[Risolto]Copia e incolla speciale tra fogli su prima riga li

Messaggio da Record »

Grazie!
Funziona perfettamente.
Come posso sdebitarmi?

Ne approfitto per chiedere se è possibile che la macro si fermi alla prima riga disponibile nel caso in cui i dati in una riga vengano cancellati.
Ho provato ma ora va comunque sotto l'ultima riga piena saltando quelle eventualmente vuote.
In ogni caso è utilizzabile così comunque.
Grazie ancora
Andrea
OOo 3.4 Win7
patel
Volontario attivo
Volontario attivo
Messaggi: 4019
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: [Risolto] Copia e incolla speciale tra fogli su prima ri

Messaggio da patel »

Codice: Seleziona tutto

sub CopiaIncollaRigaVuota ' per copiare valori
Doc = ThisComponent
Sheet = Doc.Sheets.getByName("Formula")
Sheet1 = Doc.Sheets.getByName("Dati")
source = Sheet.getCellRangeByName("A2:DZ2").getDataArray
r = 1
while Sheet1.getCellRangeByName("A" & r).String <> ""
  r = r + 1
Wend
Sheet1.getCellRangeByName("A" & r & ":DZ" & r).setDataArray(Source)
End Sub
-------------------
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
Record
Messaggi: 12
Iscritto il: lunedì 8 ottobre 2012, 0:47

Re: [Risolto] Copia e incolla speciale tra fogli su prima ri

Messaggio da Record »

Grazie, è perfetto.
OOo 3.4 Win7
Rispondi