Macro per copiaincolla

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 :grinning:

Ok, ho capito benissimo cosa vuoi ottenere :+1:
Il problema è doppio:

  1. Stai sempre incollando in A2, quindi la riga viene sovrascritta
  2. copyRange copia 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.

:white_check_mark: 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

:mag: Perché il tuo codice dava errore

Questo pezzo:

LastRow = 0
Do While oSheetDest.getCellByPosition(0, LastRow).String <> ""
    LastRow = nLastRow + 1
Loop

ha tre errori:

  1. :x: oSheetDest non esiste → la variabile corretta è SheetDest
  2. :x: nLastRow non esiste → deve essere LastRow
  3. :x: stai usando copyRange, che porta con sé la formattazione

:sparkles: Perché questa soluzione è migliore

  • :heavy_check_mark: Ogni cambio di B1 aggiunge una nuova riga
  • :heavy_check_mark: Nessuna riga viene sovrascritta
  • :heavy_check_mark: Niente formattazione copiata
  • :heavy_check_mark: 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.