Per la modifica, la cancellazione e l'aggiunta di nuove tabelle nel foglio di calcolo si utilizzano i seguenti comandi, con il servizio Spreadsheets:
insertNewByName("nome_del_nuovo_foglio", 0) --> per l'inserimento, il secondo parametro è l'indice dove inserire il foglio di calcolo
moveByName("nomeDelFoglioDaSpostare", 2) --> per lo spostamento, il secondo parametro è l'indice dove spostare il foglio di calcolo
copyByName("nomeDelFoglioDaCopiare","nomeDelNuovoFoglioDoveCopiare",1) --> per la copia, il terzo parametro è l'indice.
Per attivare il servizio Spreadsheets è necessario usare il metodo getSheets()
Option Explicit
Sub Main
Dim oDoc As Object, oSheets As Object
oDoc = ThisComponent
oSheets = oDoc.getSheets()
oSheets.insertNewByName("ciao",0) REM inserisce una nuova tabella di nome ciao nella posizione 0.
End Sub
Per impostare le caratteristiche delle colonne ci sono i comandi forniti da com.sun.star.table.TableColumn, che fornisce le seguenti proprietà: .Width(long), .OptimalWidth(boolean), .IsVisible(boolean), .IsStartOfNewPage(boolean)
Un esempio di impostazione della larghezza di una colonna è qui sotto:
Option Explicit
Sub Main
Dim oDoc As Object, oSheet As Object
Dim oPrimaCol As Object
oDoc = ThisComponent
oSheet = oDoc.Sheets(0)
oPrimaCol = oSheet.Columns(0) REM lo 0 indica la prima colonna, 1 la seconda e così via.
oPrimaCol.width = "2000"
End Sub
Le righe si trattano come le colonne, solo che le prime due proprietà della lista sopra sono: .Height(long) e .OptimalHeight(boolean).
Per inserire colonne e righe si usano i metodi: oSheet.Columns.insertByIndex(0,2) --> inserisce due colonne prima della prima colonna della tabella corrente, mentre oSheet.Columns.removeByIndex(1,3) --> rimuove 3 colonne a partire dalla seconda colonna. Gli stessi metodi si usano nella stessa maniera per .Rows (la riga si seleziona con Riga = oSheet.Rows(numeroDiRiga) )
Dopo aver avuto accesso al foglio di calcolo, e successivamente alle tabelle del foglio di calcolo, possiamo utilizzare i metodi sulle celle e sulle selezioni di celle. Le celle possono contenere numeri (value), lettere (string) e formule (formula), oltre ad essere vuote. In particolare:
oggetto_cella = oSheet.getCellByPosition(n_colonna,n_riga) --> permette di selezionare una cella specifica e di assegnarla ad un oggetto_cella
oggetto_cella.value = valore_da_assegnare --> permette di inserire un valore nell'oggetto_cella
come sopra, invece di value, si utilizza .String per le stringhe, .Formula per le formule (.FormulaLocal per le formule nella lingua locale, se non volete imparare i nomi delle formule in inglese ;-P)
option explicit
Sub Main
Dim oDoc As Object, oSheet As Object, oCell As Object
oDoc = ThisComponent
oSheet = oDoc.Sheets(0)
oCell = oSheet.getCellByPosition(0,0)
oCell.Value = 44
oCell = oSheet.getCellByPosition(1,0)
oCell.String = "gatti"
oCell = oSheet.getCellByPosition(2,0)
oCell.FormulaLocal = "=CONCATENA(""in fila per ""; A1)" REM per inserire una stringa, che normalmente scriviamo "tra due virgolette", dobbiamo raddoppiare le virgolette, cioè ""tra quattro virgolette""
End Sub
dà questo risultato (sempre con un foglio di calcolo aperto ed attivo, quindi deve essere selezionato per ultimo prima di eseguire la macro):
|
44 |
gatti |
in fila per 44 |
In alternativa, la macro sotto fa la stessa azione, utilizzando però il cursore per spostarsi nel foglio di calcolo:
option explicit
Sub Main
Dim oDoc As Object, oSheet As Object, oCursor As Object, oCell As Object
oDoc = ThisComponent
oSheet = oDoc.Sheets(0)
oCursor = oSheet.CreateCursor()
oCursor.goToStart() REM spostiamo il cursore all'inizio di una serie di celle continua con dati (o continua senza dati)
oCursor.goToOffset(-1,-1) REM il cursore si posiziona su B2 (non ho capito il motivo), per cui ci spostiamo su A1
oCell = oCursor.getCellByPosition(0,0) REM possono confondere le coordinate 0,0 che sono relative al cursore, non al foglio
oCell.Value = 44
oCursor.goToNext() REM il metodo goToNext() sposta a destra (goToPrevious sposterebbe a sinistra)
oCell = oCursor.getCellByPosition(0,0)
oCell.String = "gatti"
oCursor.goToNext()
oCell = oCursor.getCellByPosition(0,0)
oCell.FormulaLocal = "=CONCATENA(""in fila per ""; A1)"
End Sub
Se volessimo lavorare con i ranges di celle, invece, possiamo usare getCellRangeByPosition:
option explicit
Sub Main
Dim oDoc As Object, oSheet As Object, oRange As Object
oDoc = ThisComponent
oSheet = oDoc.Sheets(0)
oRange = oSheet.getCellRangeByPosition(0,0,1,1) REM le coordinate richieste sono: sinistra, alto, destra, basso, per cui in questo caso abbiamo selezionato A1:B2
oRange.RotateAngle = 4500 REM tra i tanti metodi disponibili, ho provato questo: ruota i caratteri presenti nella selezione di 45°
End Sub
Un'interfaccia molto utile con i ranges è la XCellSeries, che permette di usare i metodi fillSeries e fillAuto, che servono a riempire selezioni multiple di celle con valori, con varie modalità.
option explicit
Sub Main
Dim oDoc As Object, oSheet As Object, oRange As Object
oDoc = ThisComponent
oSheet = oDoc.Sheets(0)
oRange = oSheet.getCellRangeByPosition(0,0,10,10)
oRange.fillSeries( com.sun.star.sheet.FillDirection.TO_BOTTOM , com.sun.star.sheet.FillMode.SIMPLE, _
com.sun.star.sheet.FillDateMode.FILL_DATE_DAY , 0 , 0 ) REM fillSeries richiede 5 parametri, di cui i primi tre sono enumerazioni (vedi introduzione alle API), e in particolare: la prima riguarda la direzione del riempimento (verso il basso in questo caso), la seconda il metodo di riempimento (in questo caso costante, cioè tutte le celle sono riempite con lo stesso valore), la terna il metodo di riempimento nel caso ci siano date (in questo caso viene aggiunto un giorno per ogni cella). Gli ultimi due sono due valori che indicano: il primo, il valore di incremento/decremento della serie, il secondo, il valore massimo/minimo che può raggiungere la serie, prima di fermarsi.
End Sub
Una macro come quella seguente, modificata da una presente in www.OOoMacros.org , permette di modificare la selezione corrente (che sia una cella, un range o più ranges di celle), cella per cella oppure a livello di ranges.
REM ***** BASIC *****
'Copyright (c) 2004
Winfried Rohr, re-Solutions Software Test Engineering
'mailto:
office@re-solutions.de Untere Zahlbacher Strasse 18, D-55131
Mainz
'Copyright (c) 2007 Sergio Corato egio@tuxfamily.org
'This
program is free software; you can redistribute it and/or modify it
under
'the terms of the GNU General Public License as published
by the Free Software
'Foundation; either version 2 of the License, or (at your option) any later
'version.
'This program is distributed in the hope that it will be useful, but WITHOUT ANY
'WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
'A PARTICULAR PURPOSE. See the GNU General Public License for more details.
'You should have received a copy of the GNU General Public License along with
'this program; if not, write to the Free Software Foundation, Inc., 59 Temple
'Place, Suite 330, Boston, MA 02111-1307 USA
' ========================================================================
Dim oDoc
Dim lStartRow as Long
Dim lStartCol as Long
Dim lEndRow as Long
Dim lEndCol as Long
Dim actSheet
Dim actRange
Dim oCellRangeAdr
Sub Modifica_celle
oDoc = ThisComponent
oSel = oDoc.getCurrentSelection
If Not oSel.supportsService("com.sun.star.table.CellProperties" ) Then
MsgBox "Non sono state selezionate celle."
Exit Sub
end if
REM qui sotto si controlla se sono stati selezionati più di un ranges di celle con il tasto CTRL, nel qual caso si devono trattare i vari ranges uno REM per volta
If Not oSel.supportsService("com.sun.star.table.CellRange" ) Then
vRanges = oSel.getRangeAddresses
for j = 0 to uBound(vRanges)
oCellRangeAdr = vRanges(j)
SelezionaFoglioeRange
PROCESSO
next j
else
oCellRangeAdr = oSel.getRangeAddress
SelezionaFoglioeRange
PROCESSO
end if
End Sub
' -------------------------------------------------------------------
REM questa sub permette di assegnare a delle variabili la tabella del foglio di calcolo in uso e le coordinate delle selezioni di celle
Sub SelezionaFoglioeRange
actSheet = oDoc.Sheets.getByIndex(oCellRangeAdr.Sheet)
lStartCol = oCellRangeAdr.StartColumn
lStartRow = oCellRangeAdr.StartRow
lEndCol = oCellRangeAdr.EndColumn
lEndRow = oCellRangeAdr.EndRow
End Sub
' -------------------------------------------------------------------
REM questa sub esegue il lavoro pratico
Sub PROCESSO
actRange = actSheet.getCellRangeByPosition(lStartCol,lStartRow,lEndCol,lEndRow)
REM con questa riga qui sotto si lavora a livello di ranges di celle, in cui abbiamo fatto ruotare il contenuto di 45°
actRange.setPropertyValue("RotateAngle", 4500)
REM con i passaggi seguenti invece si lavora cella per cella sulle varie eventuali colonne della selezione, inserendo il valore 10
For c = 0 to (lEndCol - lStartCol)
For i = 0 to (lEndRow - lStartRow)
oCell = actRange.getCellByPosition(c,i)
oCell.Value = 10
Next i
Next c
End Sub
Lavoro in corso....
Ultima modifica: