Creazione di una macro

From Apache OpenOffice Wiki
Jump to: navigation, search



Di solito mi faccio due domande, prima di registrare una macro:

  1. Il compito può essere eseguito come un semplice insieme di comandi che non cambiano?
  2. Posso organizzare i passaggi in maniera tale che l'ultimo comando posizioni il cursore in modo da accettare direttamente il prossimo comando?

Un esempio complesso

Di solito copio righe e colonne di dati da un sito web e li formatto in una tabella, in un documento di testo. Prima di tutto, copio la tabella dal sito web negli appunti. Per evitare di copiare anche la formattazione e il tipo di carattere, incollo il testo in un documento Writer come testo non formattato. Riformatto il testo con l'utilizzo delle tabulazioni tra le colonne, così posso utilizzare Tabella > Converti > Testo in tabella per convertirlo in una tabella.

Analizzo il testo, per vedere se posso registrare una macro che formatti il testo (ricordando le due domande che mi sono posto). Come esempio, ho copiato il gruppo di costanti FontWeight dal sito web OpenOffice.org. La prima colonna indica il nome delle costanti. Ogni nome è seguito da uno spazio e una tabulazione.

DONTKNOW La dimensione del carattere non viene specificata.
THIN Identifica una dimensione del font del 50%.
ULTRALIGHT    Identifica una dimensione del carattere del 60%.
LIGHT Indica una dimensione del carattere del 75%.
SEMILIGHT Identifica una dimensione del carattere del 90%.
NORMAL Identifica una dimensione standard del carattere.
SEMIBOLD Identifica una dimensione del carattere del 110%.
BOLD Identifica una dimensione del carattere del 150%.
ULTRABOLD Identifica una dimensione del carattere del 175%.
BLACK Identifica una dimensione del carattere del 200%.

Voglio che la prima colonna contenga il valore numerico, la seconda colonna il nome, e la terza la descrizione. Il lavoro è facilmente eseguibile per ogni riga, eccetto per DONTKNOW e NORMAL, che non contengono un valore numerico, ma so che i valori sono rispettivamente 0 e 100, quindi posso inserirli manualmente.

I dati possono essere ripuliti in molti modi — tutti semplici. Il primo esempio utilizza la pressione di opportuni tasti presumendo che il cursore si trovi all'inizio della riga con il testo THIN.

  1. Fate clic su Strumenti > Macro > Registra Macro per cominciare la registrazione di una macro.
  2. Premete Ctrl+Freccia destra per muovere il cursore all'inizio delle specifiche.
  3. Premete Backspace due volte per rimuovere lo spazio e la tabulazione.
  4. Premete Tab per aggiungere una tabulazione senza lo spazio dopo il nome della costante.
  5. Premete Canc per cancellare la s minuscola, e dopo premete S per aggiungere una S maiuscola.
  6. Premete Ctrl+Freccia destra due volte per muovere il cursore all'inizio del numero.
  7. Premete Ctrl+Maiusc+Freccia destra per selezionare e muovere il cursore prima del simbolo %.
  8. Premete Ctrl+C per copiare il testo selezionato negli appunti.
  9. Premete Fine per muovere il cursore alla fine della riga.
  10. Premete Backspace due volte per rimuovere gli spazi rimanenti.
  11. Premete Home Per muovere il cursore all'inizio della riga.
  12. Premete Ctrl+V per incollare il numero selezionato all'inizio della riga.
  13. Quando incollate il valore, verrà incollato anche uno spazio extra, quindi premete Backspace per rimuovere lo spazio in più.
  14. Premete Tab per inserire una tabulazione fra il numero e il nome.
  15. Premete Home per muovervi all'inizio della riga.
  16. Premete Freccia giù per muovere il cursore alla riga successiva.
  17. Fermate la registrazione e salvate la macro.

Ci vuole molto più tempo per leggere e scrivere i passi da eseguire che per eseguire la macro. Lavorate con calma e pensate ai passi e a come li fareste voi. Con la pratica verrà tutto più naturale.

La macro generata è stata modificata per contenere il numero del passo nei commenti, per vedere la corrispondenza con le azioni descritte sopra.

Listato 2: Copia del valore numerico all'inizio della colonna.

 sub CopyNumToCol1
 rem ----------------------------------------------------------------------
 rem definizione variabili
 dim document   as object
 dim dispatcher as object
 rem ----------------------------------------------------------------------
 rem accesso al documento
 document   = ThisComponent.CurrentController.Frame
 dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
 
 rem (2) Premete Ctrl+Freccia destra per muovere il cursore all'inizio di "specifies".
 dispatcher.executeDispatch(document, ".uno:GoToNextWord", "", 0, Array())
 
 rem (3) Premete Backspace due volte per rimuovere lo spazio e la tabulazione.
 dispatcher.executeDispatch(document, ".uno:SwBackspace", "", 0, Array())
 
 rem ----------------------------------------------------------------------
 dispatcher.executeDispatch(document, ".uno:SwBackspace", "", 0, Array())
 
 rem (4) Premete Tab per aggiungere una tabulazione senza lo spazio dopo il nome della costante.
 dim args4(0) as new com.sun.star.beans.PropertyValue
 args4(0).Name = "Text"
 args4(0).Value = CHR$(9)
 
 dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args4())
 
 rem (5) Premete Canc per cancellare la s minuscola....
 dispatcher.executeDispatch(document, ".uno:Delete", "", 0, Array())
 
 rem (5) ... e dopo premete S per aggiungere una S maiuscola.
 dim args6(0) as new com.sun.star.beans.PropertyValue
 args6(0).Name = "Text"
 args6(0).Value = "S"
 
 dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args6())
 
 rem (6) Premete Ctrl+Freccia destra due volte per muovere il cursore all'inizio del numero.
 dispatcher.executeDispatch(document, ".uno:GoToNextWord", "", 0, Array())
 
 rem ----------------------------------------------------------------------
 dispatcher.executeDispatch(document, ".uno:GoToNextWord", "", 0, Array())
 
 rem (7) Premete Ctrl+Shift+Freccia destra per selezionare il numero.
 dispatcher.executeDispatch(document, ".uno:WordRightSel", "", 0, Array())
 
 rem (8) Premete Ctrl+C per copiare il testo selezionato negli appunti.
 dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
 
 rem (9) Premete Fine per muovere il cursore alla fine della riga.
 dispatcher.executeDispatch(document, ".uno:GoToEndOfLine", "", 0, Array())
 
 rem (10) Premete Backspace due volte per rimuovere gli spazi rimanenti.
 dispatcher.executeDispatch(document, ".uno:SwBackspace", "", 0, Array())
 
 rem ----------------------------------------------------------------------
 dispatcher.executeDispatch(document, ".uno:SwBackspace", "", 0, Array())
 
 rem (11) Premete Home per muovere il cursore all'inizio della riga.
 dispatcher.executeDispatch(document, ".uno:GoToStartOfLine", "", 0, Array())
 
 rem (12) Premete Ctrl+V per incollare il numero selezionato all'inizio della riga.
 dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
 
 rem (13) Premete Backspace per rimuovere lo spazio rimasto.
 dispatcher.executeDispatch(document, ".uno:SwBackspace", "", 0, Array())
 
 rem (14) Premete Tab per inserire una tabulazione fra il numero ed il nome.
 dim args17(0) as new com.sun.star.beans.PropertyValue
 args17(0).Name = "Text"
 args17(0).Value = CHR$(9)
 
 dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args17())
 
 rem (15) Premete Home per andare all'inizio della riga.
 dispatcher.executeDispatch(document, ".uno:GoToStartOfLine", "", 0, Array())
 
 rem (16) Premete Freccia giù per muovere il cursore alla riga successiva.
 dim args19(1) as new com.sun.star.beans.PropertyValue
 args19(0).Name = "Count"
 args19(0).Value = 1
 args19(1).Name = "Select"
 args19(1).Value = false
 
 dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args19())
 end sub

I movimenti del cursore vengono utilizzati per tutte le operazioni (al contrario di quanto accade nella ricerca). Se eseguite la macro nella riga contenente DONTKNOW, la parola weight viene spostata davanti alla riga e il primo “The” viene cambiato in “She”. In questo caso la macro non funziona bene, ma non dovrei eseguire la macro nelle righe che non hanno il formato appropriato: bisogna elaborarle manualmente.

Esecuzione rapida di una macro

È tedioso eseguire ripetutamente una macro facendo sempre clic su Strumenti > Macro > Esegui Macro. Potete eseguire la macro dall'interno dell'IDE. Fate clic su Strumenti > Macro > Organizza Macro > OpenOffice.org Basic per aprire la finestra di dialogo Macro OpenOffice.org Basic. Selezionate la vostra macro e fate clic su Modifica per aprire la macro nell'IDE.

L'IDE contiene un'icona Esegui Programma Basic nella barra degli strumenti, che esegue la prima macro presente nell'IDE. Fino a quando non la cambiate, la prima macro è quella vuota denominata Main. Modificate Main in maniera tale che appaia come mostrato nel Listato 3.

Listato 3: Modifica di Main per invocare CopiaNumAllaCol1.

 Sub Main
   CopiaNumAllaCol1
 End Sub


Adesso, potete eseguire CopiaNumAllaCol1 facendo clic ripetutamente sull'icona Esegui Programma Basic nella barra degli strumenti dell'IDE. Questo metodo è semplice e rapido, specialmente per macro temporanee che vengono utilizzate solo poche volte e poi cancellate.


Content on this page is licensed under the Creative Common Attribution 3.0 license (CC-BY).
Personal tools