Velocizza le macro di Calc leggendo e scrivendo i dati in batch

Il primo metodo affidabile per velocizzare una macro Calc lenta consiste nel sostituire le ripetute letture e scritture cella per cella con una lettura di intervallo, un ciclo in memoria e una scrittura di intervallo. Questo riduce le chiamate tra Basic e Calc; tuttavia, non garantisce un guadagno di velocità fisso, poiché formule, formattazione, dimensioni del file e logica della macro possono incidere notevolmente sul tempo di esecuzione. L'esempio seguente modifica una colonna di stato e mostra come misurare sia la velocità che la correttezza. I dettagli dell'API sono stati verificati con la documentazione di LibreOffice 26.8 il 9 ottobre 2026.

Cosa dovrebbe essere migliorato e come lo misurerete?

Esegui la macro corrente su una copia della cartella di lavoro e registra il tempo impiegato. Utilizza una copia pulita con gli stessi dati iniziali sia per la macro vecchia che per quella rivista, oppure ripristina i dati di input tra un'esecuzione e l'altra; altrimenti la seconda esecuzione potrebbe essere meno efficiente. Mantieni invariati il ​​numero di righe, le impostazioni di calcolo e le condizioni di output. Ripeti ogni esecuzione e confronta il tempo tipico anziché basarti su un'esecuzione insolitamente veloce. Verifica che il risultato corrisponda alla regola prevista. Una macro che termina prima ma modifica le righe sbagliate non rappresenta un miglioramento.

La funzione Timer di LibreOffice Basic Timerrestituisce i secondi trascorsi dalla mezzanotte; assegnandola a Longdelle variabili è possibile ottenere valori numerici. Per un intervallo breve, registra un valore iniziale e uno finale e sottraili. Se il valore finale è inferiore, significa che l'intervallo ha superato la mezzanotte, quindi aggiungi 86.400 secondi alla differenza. La funzione Timer restituisce i secondi interi; ScriptForgeper una precisione al millisecondo, utilizza il servizio Timer. Consulta la documentazione di LibreOffice Basic Timer e la documentazione del servizio Timer di ScriptForge . Evita di aprire, salvare o ispezionare manualmente la cartella di lavoro al di fuori dell'intervallo misurato, a meno che non facciano parte dell'attività effettiva.

Foglio di calcolo con colonne ID, Regione e Stato e un intervallo di dati selezionato
Iniziate utilizzando lo stesso intervallo di dati contiguo e le stesse condizioni della cartella di lavoro per ogni misurazione dei tempi.

Perché le macro Calc di grandi dimensioni rallentano?

Un ciclo che chiama getCellByPosition()o legge e scrive ripetutamente le proprietà delle singole celle richiede a Calc di attraversare l'interfaccia Basic-to-Calc per ogni operazione. Con molte righe e colonne, queste chiamate possono sommarsi anche quando la trasformazione in sé è semplice. Un ciclo su un array in memoria visita comunque ogni riga, ma evita una chiamata API di cella separata per ogni valore.

Innanzitutto, eliminate le operazioni che non influiscono sul risultato: evitate di selezionare o attivare celle all'interno del ciclo, non ricalcolate o formattate ripetutamente una cella quando è sufficiente una singola operazione sull'intervallo finale e non elaborate intere colonne se è necessario solo un blocco di dati delimitato. Queste modifiche aiutano a isolare il collo di bottiglia effettivo prima di aggiungere ulteriori controlli.

Come si elabora un intervallo come un array?

Utilizza un intervallo rettangolare che contenga solo i valori che la macro intende modificare. L'esempio presuppone un foglio denominato Data, una riga di intestazione nella riga 1 e valori di stato nella colonna C. Modifica il nome del foglio e l'intervallo in modo che corrispondano alla tua cartella di lavoro. L'API getDataArray()restituisce l'intervallo come righe contenenti valori; setDataArray()scrive un array delle stesse dimensioni in tale intervallo.

L'editor di LibreOffice Basic legge un intervallo Calc selezionato in un Data con getDataArray
Leggere l'intervallo rettangolare necessario una sola volta prima del ciclo in memoria.
Sub UpdateStatuses
    Dim oSheet As Object
    Dim oRange As Object
    Dim aData As Variant
    Dim i As Long

    oSheet = ThisComponent.Sheets.getByName("Data")
    oRange = oSheet.getCellRangeByName("A2:C10001")
    aData = oRange.getDataArray()

    For i = LBound(aData) To UBound(aData)
        If aData(i)(2) = "pending" Then
            aData(i)(2) = "review"
        End If
    Next i

    oRange.setDataArray(aData)
End Sub

L'array di righe è basato su indice zero: aData(i)(2)fa riferimento alla terza colonna di ogni riga. In questo caso, si tratta della colonna C perché l'intervallo selezionato inizia da A. La sequenza esterna dell'array rappresenta le righe e ogni sequenza interna rappresenta le colonne. L'intervallo passato setDataArray()deve avere le stesse dimensioni dell'array; una mancata corrispondenza genera un errore. Consultare il riferimento API XCellRangeData di LibreOffice e la documentazione sugli array di LibreOffice ScriptForge .

Macro di base di LibreOffice che modifica i valori in sospeso da rivedere in un array in memoria e riscrive l'array.
Applica la regola in memoria, quindi scrivi l'array completato in Calc in un'unica chiamata.

Escludi le celle formula da un aggiornamento solo valore

getDataArray()Restituisce i valori delle celle come numeri o stringhe, non come testo originale della formula. Se si legge un intervallo contenente formule e si riscrive tale array con setDataArray(), le formule possono essere sostituite dai loro risultati correnti. Limitare il metodo array di valori alle celle di input/output che devono contenere valori. Quando una macro deve preservare o modificare le formule, utilizzare i metodi array di formule getFormulaArray()e setFormulaArray(), oppure operare solo sull'intervallo non contenente formule. La documentazione di riferimento dell'API XCellRangeFormula descrive tale interfaccia separata.

Quando è opportuno modificare le impostazioni di calcolo o di visualizzazione?

Testa queste opzioni solo dopo aver misurato la versione dell'array. Se il ricalcolo delle formule rappresenta gran parte dell'esecuzione, puoi interrogare isAutomaticCalculationEnabled(), disabilitare temporaneamente il calcolo automatico con enableAutomaticCalculation(False), quindi ripristinare l'impostazione originale e ricalcolare le celle modificate quando necessario. Inserisci il ripristino in un percorso di pulizia in modo che un errore non lasci la cartella di lavoro in modalità di calcolo manuale. Non disabilitare il calcolo se la macro necessita di risultati di formule aggiornati tra i passaggi. LibreOffice documenta calculate()come ricalcolo delle celle modificate; calculateAll()forza un ricalcolo completo e può di per sé essere oneroso. Vedi il riferimento API di XCalculatable .

lockControllers()È possibile sospendere alcune notifiche utilizzate per gli aggiornamenti della visualizzazione mentre una macro modifica molte celle. Associare ogni blocco a unlockControllers(), incluso quando la macro termina tramite un gestore di errori. Ciò riduce il lavoro di aggiornamento della visualizzazione; non disattiva il calcolo delle formule né trasforma la logica per cella in un'operazione di massa. Utilizzarlo per un collo di bottiglia misurato di aggiornamento dello schermo, non come sostituto degli array di intervalli. Vedere il riferimento API di XModel .

Come si verifica la modifica e si capisce quando è il momento di cambiare metodo?

Esegui la macro modificata su una copia della cartella di lavoro e registra il tempo impiegato nelle stesse condizioni della macro di riferimento. Confronta le righe interessate, le righe non interessate, le formule e i totali principali. Se il flusso di lavoro di produzione prevede il salvataggio, salva, chiudi e riapri la copia; questo può rivelare problemi che un rapido controllo visivo non rileva. Un miglioramento stabile dovrebbe manifestarsi con esecuzioni ripetute, mentre i controlli di output continuano a risultare positivi.

Foglio di calcolo che mostra i valori di stato aggiornati e una griglia vuota per il confronto dei tempi.
Conferma i valori trasformati e registra i tempi misurati senza presumere un'accelerazione a priori.

Se la macro impiega ancora la maggior parte del tempo per eseguire formule complesse, formattazione, I/O di file o ordinamento, è consigliabile profilare separatamente tale fase; gli array di intervalli riducono solo gli accessi ripetuti alle celle. Per fogli di calcolo molto grandi, anche un array in memoria completo può consumare una quantità considerevole di memoria. Se la pressione sulla memoria aumenta, è consigliabile elaborare poche colonne alla volta o suddividere le righe in blocchi di dimensioni adeguate, verificando che ogni blocco inizi e termini sulle righe previste. Se i dati sono già presenti in un database e l'attività consiste nel filtrare, raggruppare o aggiornare i record, spostare tale operazione in una query di database potrebbe essere una soluzione migliore rispetto al caricamento di ogni singolo record in Calc.

Lascia un commento

Fai in modo che LibreOffice riconosca il tuo runtime Java

Fai in modo che LibreOffice riconosca il tuo runtime Java

Installa un runtime Java compatibile, abilitalo in LibreOffice e risolvi i problemi relativi a un elenco JRE vuoto senza modificare impostazioni non correlate.

Eseguire LibreOffice in modalità headless in Docker per la conversione in PDF.

Eseguire LibreOffice in modalità headless in Docker per la conversione in PDF.

Crea un piccolo container LibreOffice, converti documenti Office senza interfaccia grafica e verifica l'output PDF limitando l'accesso ai file host.

Riduci le dimensioni dei file di LibreOffice Impress senza sfocare le immagini

Riduci le dimensioni dei file di LibreOffice Impress senza sfocare le immagini

Riduci le dimensioni eccessive dei file di presentazione di LibreOffice comprimendo le foto incorporate, scegliendo impostazioni di immagine appropriate e verificando la qualità delle diapositive prima della condivisione.

Impedire il ritaglio delle stampe di dimensioni personalizzate in LibreOffice

Impedire il ritaglio delle stampe di dimensioni personalizzate in LibreOffice

Prima di stampare un documento di dimensioni personalizzate, assicurati che le dimensioni della pagina di LibreOffice corrispondano a quelle della tua stampante, verifica i margini di stampa e correggi il ridimensionamento.

Velocizza le macro di Calc leggendo e scrivendo i dati in batch

Velocizza le macro di Calc leggendo e scrivendo i dati in batch

Sostituisci gli accessi ripetuti alle celle con letture e scritture di intervallo in blocco, quindi confronta i risultati e proteggi le formule in cartelle di lavoro Calc di grandi dimensioni.

Organizzare un libro di LibreOffice con documenti master collegati.

Organizzare un libro di LibreOffice con documenti master collegati.

Dividi un lungo manoscritto in capitoli, assemblali in Writer e mantieni coerenti stili, contenuti e controlli di esportazione.

Collega LibreOffice Base a PostgreSQL con la procedura guidata integrata

Collega LibreOffice Base a PostgreSQL con la procedura guidata integrata

Utilizza l'opzione PostgreSQL diretta di Base per inserire i dettagli del tuo server, accedere, salvare un file di connessione ODB e risolvere i problemi di accesso più comuni.

Rendere disponibili i font personalizzati a LibreOffice Flatpak

Rendere disponibili i font personalizzati a LibreOffice Flatpak

Installa un font nella cartella dei font utente di Linux, riavvia LibreOffice Flatpak e verifica che venga visualizzato in Writer senza compromettere la sicurezza dell'applicazione.

Evita i crash di LibreOffice Save su Sonoma: lavora prima in locale.

Evita i crash di LibreOffice Save su Sonoma: lavora prima in locale.

Proteggi il tuo lavoro e isola i crash di LibreOffice su macOS Sonoma dovuti al salvataggio su unità di rete con un flusso di lavoro incentrato sul locale, controlli delle autorizzazioni e test mirati.

Mantieni intatti gli ID CSV in Calc importandoli come testo.

Mantieni intatti gli ID CSV in Calc importandoli come testo.

Per preservare gli zeri iniziali in Calc, imposta le colonne ID su Testo durante l'importazione CSV, controlla l'anteprima e verifica i dati salvati.