Buongiorno. Sono un nuovo arrivato, (mi chiamo Tony) e questo è il mio primo post. La mia conoscenza su la gestione e scrittura delle macro è quasi zero, quello che riesco a fare e cambiare riferimenti e indirizzi a celle ma niente altro. Gentilmente cerco un aiuto per far funzionare la macro in questo foglio di calc. In questa prova creata con valori e nomi di fantasia, descrivo la macro come funziona. La macro copia (A1:E1)del foglio1 nei fogli di destinaione prendendo il valore della cella B1 (valore che cambia in base ad elenco) come riferimento per la destinazione. Ogni volta che il valore della cella B1 è uguale ma i valori nelle altre celle sono diversi succede che i nuovi valori non vengono aggiunti (formando così una tabella) ma cancella e riscrive la riga, portando con se anche la formattazione della riga del foglio 1. Io vorrei che si creasse una tabella completa con tutti gli inserimenti fatti in precedenza senza formattazione se possibile.
Il tratto di codice per la soluzione lo trovata cercando in rete e tra le macro che conservo e poter leggere l’ultima riga libera nel foglio di destinazione e aggiungere la nuova riga, ma tutto si blocca con avviso di errore, dice di impostare la variabile del codice inserito. Ho provato a smanettare ma la risposta e sempre la stessa ( impostare la variabile).
Grazie a coloro che con pazienza e volontà potranno aiutarmi.
Un saluto e una buona giornata a Voi.
Prova per copiaincolla.ods (15.6 KB)
Questa è la risposta di Chat GPT, prova a tuo rischio 
Ok, ho capito benissimo cosa vuoi ottenere 
Il problema è doppio:
- Stai sempre incollando in A2, quindi la riga viene sovrascritta
-
copyRangecopia anche la formattazione, che tu invece non vuoi
La soluzione corretta in LibreOffice Basic è:
- trovare la prima riga vuota nel foglio di destinazione
- copiare solo i valori, non lo stile
Sotto ti lascio una macro completa, funzionante e pulita, poi ti spiego perché il codice che avevi commentato dà errore.
Macro corretta: aggiunge righe in fondo senza formattazione
Sub CopiaDatiSuFoglioVariabile
Dim Doc As Object
Dim Sheets As Object
Dim SheetSource As Object
Dim SheetDest As Object
Dim NomeFoglioDest As String
Dim SourceRange As Object
Dim DataArray As Variant
Dim LastRow As Long
Dim i As Long
Doc = ThisComponent
Sheets = Doc.Sheets
'--- Foglio sorgente ---
SheetSource = Sheets.getByName("Foglio1")
NomeFoglioDest = SheetSource.getCellRangeByName("B1").String
'--- Controllo esistenza foglio destinazione ---
If Not Sheets.hasByName(NomeFoglioDest) Then
MsgBox "Il foglio di destinazione '" & NomeFoglioDest & "' non esiste!"
Exit Sub
End If
SheetDest = Sheets.getByName(NomeFoglioDest)
'--- Dati da copiare ---
SourceRange = SheetSource.getCellRangeByName("A1:E1")
DataArray = SourceRange.getDataArray() ' SOLO valori (niente formattazione)
'--- Trova prima riga vuota in colonna A ---
LastRow = 0
Do While SheetDest.getCellByPosition(0, LastRow).String <> ""
LastRow = LastRow + 1
Loop
'--- Scrittura dati ---
SheetDest.getCellRangeByPosition(0, LastRow, 4, LastRow).setDataArray(DataArray)
End Sub
Perché il tuo codice dava errore
Questo pezzo:
LastRow = 0
Do While oSheetDest.getCellByPosition(0, LastRow).String <> ""
LastRow = nLastRow + 1
Loop
ha tre errori:
-
oSheetDestnon esiste → la variabile corretta èSheetDest -
nLastRownon esiste → deve essereLastRow -
stai usando copyRange, che porta con sé la formattazione
Perché questa soluzione è migliore
-
Ogni cambio di B1aggiunge una nuova riga -
Nessuna riga viene sovrascritta -
Niente formattazione copiata
-
Funziona come una vera tabella storica
Buonasera, ho letto la risposta che charlie.it ha postato e devo dire che i commenti al nuovo codice inserito sono lodevoli perchè aggiungono qualcosa in più alla scarsissima quasi nulla cultura nel compilare codice basic. La risposta è quella che serviva per la soluzione al quesito. Grazie ancora a charlie.it per il tempo che gentilmente mi ha didicato, lo ringrazio personalmente e auguro una buona serata. Saluti.