[Risolto] imparare a scrivere macro

Discussioni sull'applicazione per i fogli di calcolo
Rispondi
Raoul Duke
Messaggi: 132
Iscritto il: giovedì 7 marzo 2019, 12:11

[Risolto] imparare a scrivere macro

Messaggio da Raoul Duke »

Salve a tutti,
se volessi imparare a scrivere delle macro, dove mi consigliate di studiare per apprendere la sintassi di base? in passato ho programmato in vari linguaggi ma è passtao molto tempo e sto praticamente ricominciando da zero.
grazie.
Ultima modifica di Raoul Duke il lunedì 15 aprile 2019, 10:40, modificato 1 volta in totale.
OpenOffice 4.1.5 con MacOS 10.13.6
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8803
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: imparare a scrivere macro

Messaggio da charlie »

Ciao, basta cercare: viewforum.php?f=35.
E poi la "bibbia" di Pitoniak: http://www.pitonyak.org/oo.php.
charlie
macOS 14.4.1 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: imparare a scrivere macro

Messaggio da patel »

Aggiungo alle indicazioni di Charlie che su Pitoniak trovi molti esempi pratici, inoltre lascia perdere il registratore di macro, produce codice incomprensibile. Allego un esempio di codice che fa quello che hai chiesto nel post precedente

Codice: Seleziona tutto

sub prova

Doc = ThisComponent ' il documento su cui lavori
Sheet = Doc.Sheets.getByName("Foglio1")
CellA1 = Sheet.getCellRangeByName("A1")
CellA10 = Sheet.getCellRangeByName("A10")
CellA10.Value = CellA1.Value ' in caso di valori numerici
CellA10.String = CellA1.String  ' in caso di stringhe
CellA10.Formula = CellA1.Formula  ' in caso di Formule
end sub
Al contrario del VBA di excel non puoi mai omettere i riferimenti al foglio e le proprietà value, string ecc

Allego alcuni appunti
-Come si fa tramite macro a leggere e/o scrivere le celle di calc?
Possiamo accedere alla cella in base alla sua posizione con la funzione (metodo) GetCellByPosition:
Doc = ThisComponent
Sheet = Doc.Sheets(0)
oCell = Sheet.GetCellByPosition(0,0)
Dove il primo 0 sta ad indicare la colonna, e il secondo 0 la riga.
oppure
oCell = Sheet.getCellRangeByName("A1")
Partendo sempre con la numerazione
Si avrà con 0,0 la cella A1
Per leggere il contenuto della cella e metterlo in una variabile per poi riutilizzarlo, è possibile procedere come 'segue:
Variabile = oCell.Value
'se la cella contiene un valore
Variabile = oCell.String
'se la cella contiene una stringa di testo
Variabile = oCell.Formula
'se la cella contiene una formula
Per scrivere in una cella basterà agire all'inverso e cioè:
oCell.Value = 1
'inserisce il valore 1 nella cella
oCell.String = "Uno"
'inserisce la stringa Uno nella cella
oCell.Formula = "=1"
'inserisce la formula =1 nella cella
Per semplificare il lavoro possiamo crearci dei sottoprogrammi e delle funzioni che eseguono questo compito.
Ad es:
Sub ScriviCella (foglio,colonna,riga,stringa)
' Scrivi una stringa in una cella
Doc = ThisComponent
Sheet = Doc.Sheets(foglio)
Cell = Sheet.getCellByPosition(colonna, riga)
Cell.string = stringa
End Sub
'_______________________________________________
Function LeggiCella (foglio,colonna,riga)
' Leggi una stringa da una cella
Doc = ThisComponent
Sheet = Doc.Sheets(foglio)
Cell = Sheet.getCellByPosition(colonna, riga)
LeggiCella=Cell.String
End function
Le sub sopra lavorano solo con le stringhe e occorre anche precisare in quale foglio si trovano le celle (anche in questo caso la numerazione
dei fogli parte da zero).
Se ci servisse il valore numerico contenuto ad es in A1 potremmo procedere così:
Valore=val(Function LeggiCella (0,0,0))
Se si preferisce riferirsi alle celle con il loro nome (A1, B5 ecc. ecc.) possiamo modificare le macro in questo modo:
Sub ScriviCellaPerNome (foglio,nomecella,stringa)
' Scrivi una stringa in una cella
Doc = ThisComponent
Sheet = Doc.Sheets(foglio)
Cell = Sheet.getCellRangeByName(nomecella)
Cell.string = stringa
End Sub
Function LeggiCellaPerNome (foglio,nomecella)
' Leggi una stringa da una cella
Doc = ThisComponent
Sheet = Doc.Sheets(foglio)
Cell = Sheet.getCellRangeByName(nomecella)
LeggiCellaPerNome=Cell.String
End function
Se addirittura vogliamo copiare da un documento all'altro riferendosi alle celle con il loro nome (A1, B5 ecc. ecc.) possiamo ulteriormente
modificare le macro in questo modo:

Sub ScriviCellaPerNome (Doc,foglio,nomecella,stringa)
' Scrivi una stringa in una cella
Sheet = Doc.Sheets(foglio)
Cell = Sheet.getCellRangeByName(nomecella)
Cell.string = stringa
End Sub

Function LeggiCellaPerNome (Doc,foglio,nomecella)
' Leggi una stringa da una cella
Sheet = Doc.Sheets(foglio)
Cell = Sheet.getCellRangeByName(nomecella)
LeggiCellaPerNome=Cell.String
End function

In questo caso dobbiamo fornire nella variabile Doc l'oggetto documento a cui ci si riferisce.
-----------------------------------
-------------------
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
Raoul Duke
Messaggi: 132
Iscritto il: giovedì 7 marzo 2019, 12:11

Re: imparare a scrivere macro

Messaggio da Raoul Duke »

grazie mille a entrambi
OpenOffice 4.1.5 con MacOS 10.13.6
Rispondi