# Macro (informatica)

In informatica, il termine macro sta ad indicare una procedura, ovvero un "insieme" o "blocco" di comandi o istruzioni, tipicamente ricorrente durante l'esecuzione di un programma. Concettualmente molto simile ad una funzione ovvero può essere richiamata da eventi ed essere parametrizzata, permettendo riuso di codice, un analogo concetto in ambito sistemistico è quello di shell script.
Consente dunque di eseguire una serie o blocco di operazioni/istruzioni con l'invio di un solo comando, riutilizzabili ed utili ad "automatizzare" su richiesta compiti più complessi delle singole istruzioni; alcuni programmi hanno all'interno la capacità di creare/registrare ed eseguire macro; in alternativa esistono software di automazione che consentono di realizzare macro a livello superiore, e quindi per tutti i programmi che non le prevedono. In un foglio di calcolo, alcune operazioni tipiche di una macro sono inserimento/eliminazione di righe/colonne, formattazione del testo/numero e colore, copia-incolla di valori, esecuzione di funzioni come le somme, impostazioni di stampa e salvataggio del file.
Il concetto originario di "macro" non prevede l'uso di un linguaggio di programmazione, trattandosi di una semplice registrazione di una serie di comandi già disponibile all'interno del software; evolvendosi nella forma attuale, le macro hanno acquisito un linguaggio di programmazione (es. VBA), con tanto di strutture condizionali (If... Then... Else...), subroutine, dialogo con l'utilizzatore attraverso finestre per l'introduzione di dati, raggiungendo un'efficienza molto maggiore, ma anche maggiore complessità nella loro stesura.

## Descrizione
### Livelli di esecuzione

La macro può essere salvata a livello di singolo foglio di lavoro, tutte le cartelle di lavoro aperte, qualsiasi file Excel/open office. In quest'ultimo caso, la macro deve essere salvata nella cartella di avvio del programma (XLStart/PERSONAL.XLS, ovvero Open Office/Avvio).
Se la macro è salvata nel codice del singolo foglio di lavoro è una private subroutine, non visibile nell'elenco di macro presente nel file, ed è un tipo di macro ad evento, eseguita ogni volta che si apre il foglio di lavoro cui è associata.
Se ad esempio si desidera avere un indice dinamico dei fogli di lavoro presenti in un file Excel, dovrà essere associata a un foglio di lavoro di nome "Index" una macro che crea un indice dei fogli di lavoro: in pratica, per avere un indice dinamico si utilizza una macro ad evento, salvata nel foglio di lavoro, che crea un comune indice statico.

### Esecuzione su una selezione corrente di celle

Il codice di una macro non necessariamente si riferisce a una determinata riga, colonna o intervallo di celle, e può essere tale da venire eseguito sulla selezione corrente, che viene effettuata prima di lanciare la macro. Se ad esempio l'utente desidera eseguire la macro sulla colonna N, la riga 1 o l'invervallo di celle "A2:N20", è sufficiente che evidenzi col mouse queste aree del foglio, prima di lanciare la macro, che sarà appunto eseguita sull'ultima selezione corrente di celle.
Per ottenere istruzioni di questo tipo con il registratore di macro, è sufficiente selezionare le aree di interesse prima di iniziare la registrazione di macro, e subito dopo lanciare la registrazione. Il registratore genera codice del tipo: "Selection.Copy", "selection.Autofilter", "Selection.Delete".
Per selezionare l'ultima cella attiva sopra, sotto, a destra o sinistra di quella corrente, si utilizzano le proprietà del metodo "End": "xlUp", "xldown", "xlToRight", "xlToLeft". Per selezionare le celle di un intervallo di dimensione variabile si utilizzano questi riferimenti con istruzioni del tipo:
    Range(Selection, Selection.End(xlDown)).Select
Questa istruzione indica gli estremi dell'intervallo da selezionare, da una parte la cella selezionata dal cursore e dall'altra l'ultima cella attiva (con valori o formule) fra quelle al di sotto della selezione corrente. Per ottenere la selezione di più colonne, è sufficiente selezionare un intervallo di celle, anziché una singola cella, prima di lanciare la macro.
Se l'area da selezionare dipende da altri intervalli di celle, si utilizza una variante del tipo:
    Range(Selection, Range("A1:B" & (Range("A1").End(xlDown).Row))).Select
che seleziona l'intervallo iniziale e l'intervallo da A1 alla colonna B in corrispondenza della riga dove si trova l'ultima cella non vuota sotto A1.
Per selezionare le celle sottostanti una colonna (es. la colonna 1) oggetto di filtro dati:

### Annidamento

È possibile "annidare" le macro, in modo che una macro ne esegua un'altra registrata in precedenza. Il registratore, sia di Excel che di Open Office, tiene conto dei passaggi del mouse nei menu, fra i quali in "macro / registra nuova macro".

### Estensione a tutti i fogli di lavoro

Sia in Excel che in Open Office Calc tutti i servizi di sistema possono essere eseguiti per singolo foglio di lavoro.
I servizi di sistema sono quelli richiamabili all'esterno del foglio di lavoro, come quelli dei menu "File", "Modifica", "Dati", "Strumenti". Il programma consente di selezionare più fogli di lavoro (CTRL + Sheet), ma esegue questi servizi solo per il foglio corrente, non permette di stampare, mettere dei filtri o "Modifica /sostituisci con" su una selezione di fogli di lavoro.
Per fare ciò, occorre una macro che contenga i comandi da eseguire, e una seconda macro che la richiama tramite il costrutto "For Each..Next" (oppure "For N=1 To WorkSheets.Count", seguito da "Sheets(N). Activate!" oppure "Application.GoTo ActiveWorkbook.Sheets(N).Range("A1:C20")" e l'istruzione che si desidera eseguire su un ciclo di fogli), eseguendola su tutti i fogli di lavoro del file corrente. Il codice è di questo tipo:
oppure, in modo molto più compatto:
Con le seguenti istruzioni si possono disabilitare i messaggi di errore, continuare l'esecuzione della macro, minimizzare la gestione grafica di Excel che in alcuni casi potrebbe rallentare i tempi di esecuzione della macro (al prezzo di non visualizzare e controllare a terminale le celle oggetto di elaborazione):
Il codice viene poi concluso con le istruzioni "opposte", che ripristinano le impostazioni predefinite:
    [...] Application.ScreenUpdating = True Application.DisplayAlerts = True End Sub

### Estensione a file diversi da quello di registrazione

Tramite il percorso "File/Apri"o "File/cerca" la macro può eseguire operazioni su file che non sono aperti al momento del lancio della macro. La macro trova il file, lo apre ed esegue i comandi registrati.

### Macro su date

Per eseguire un filtro, formula o procedura su una cella di tipo "Data", senza modificarne il formato europeo, occorre che i dati siano separati dal segno "*".
Diversamente, la macro porta la data nel formato americano del tipo "mm/g/aaaa", con i mesi che precedono i giorni. Ciò crea problemi nell'esecuzione di tutta una serie di funzioni, a partire dall'estrazione del mese o dell'anno contenuti nella data.

### Macro a evento

SI parla di macro ad evento quando la macro viene eseguita dopo aver compiuto certe azioni sul foglio di calcolo, come cliccare un bottone, aprire un certo foglio o file Excel.
Se la macro è associata all'apertura di un foglio di calcolo, deve iniziare come "Private Subroutine" ed essere copiata nel codice della pagina (etichetta del foglio di lavoro, tasto destro del mouse, Visualizza codice sorgente).
Utilizzando la barra per VBA, la macro si trova nella cartella moduli della pagina in oggetto. Facendo riferimento alla programmazione a oggetti, la macro a evento è trattata come un metodo dell'oggetto foglio di calcolo.
Una macro simile serve ad esempio a creare indice dinamico dei fogli presenti in un certo file: aprendo il foglio "Indice", se altri fogli sono stati rinominati o eliminati, la macro aggiornerà il contenuto di conseguenza.

### Anonimizzazione delle macro

La macro può essere resa utile dal significato del file e dei fogli di lavoro, sostituendo a questi istruzioni del tipo: ActiveSheet.Select" o "ActiveSheet.Add". Diversamente, se la macro è eseguita su un foglio di lavoro o file con nome diverso da quello registrato nel codice, l'esecuzione restituisce un messaggio di errore.

## Software

Per quanto detto in precedenza, macro e tabelle pivot sono strumenti di largo utilizzo nei fogli di calcolo, implementati da programmi quali Excel e Open Office Calc.
Tutti i programmi della suite office e Open Office hanno un motore interno per la registrazione ed esecuzione di macro.
L'integrazione fra programmi dello stesso pacchetto avviene anche sotto l'aspetto delle macro: è possibile, ad esempio, registrare una macro in Microsoft Access che opera con dei file Excel, e restituisce un output testuale su Word.
Esistono, inoltre, editor di macro, programmi dedicati che lavorano con file di decine di programmi appartenenti a pacchetti proprietari e open-source differenti: ad esempio, AutoHotkey, AutoIt, iMacros, Macro Mate e AutoMate.

### Microsoft Office

Microsoft Office consente l'esecuzione di macro all'interno di un singolo file o aprendo file salvati con i programmi Outlook, Word, Excel, Powerpoint, Publisher, Access. L'integrazione in pratica è disponibile per i programmi del pacchetto Office, e tramite Internet Explorer all'elaborazioni di dati pubblicati da altri applicativi nel web. Il registratore di macro è un editor grafico, che genera un codice Visual Basic, in base ai movimenti del mouse e alle stringhe digitate da tastiera. È possibile associare la macro ad un bottone che la richiama, e a un comando breve da tastiera (es. digitando "Alt+F5"), e salvarla a diversi livelli, per il file in uso, per una cartella di file oppure all'avvio di un programma di Office.
Dalla versione 2007, è possibile associare un commento alla macro e inserire parti di testo esplicative e non eseguibili all'interno del codice VB. È corretto un bug per il quale una macro non era automaticamente eseguita sul foglio Excel nel quale è posizionato il riferimento cella, cosa che rendeva talune macro difficilmente estendibili ad un intero foglio Excel, ad un insieme di diapositive di Powerpoint e simili. Inoltre, i riferimenti relativi rendono meno onerosa la manutenzione del codice generato, ed evitano di dover risistemare il codice della macro ad ogni cambiamento di nome del file o dei fogli Excel, e all'organizzazione del foglio, con aggiunta di righe/colonne o spostamento dei contenuti di interesse per la macro.

### Star Office

Le macro di StarOffice sono scritte nel linguaggio StarBasic, un linguaggio proprietario della Sun, radicalmente diverso dal VBA di Office e Microsoft.

### Open Office

Open Office contiene un application programming interface che consente la registrazione/compilazione manuale e l'esecuzione di macro in differenti linguaggi di programmazione, fra i quali: C++, Java, Python, CLI, StarBasic, JavaScript, OLE.
Open Office non possiede un ambiente di programmazione per il VBA di Microsoft, e non è compatibile con questo linguaggio. Esistono delle versioni del programma che permettono una conversione fra il codice VBA e Star Office.
Le macro di Open Office possono operare con una varietà molto più ampia di file, rispetto ad Excel 2007. Durante registrazione, dal menu File/Apri (e in Excel da "File/Cerca file") si richiamano i file con i quali si intende eseguire delle operazioni. Il registratore scriverà il codice necessario sia per il file di partenza, nel quale si è avviata la registrazione della macro, che per tutti quelli aperti con tale modalità. Le estensioni compatibili in OpenOffice includono immagini, file AutoCad, molti programmi di testo, i file Notepad (non importabili in una macro Excel) che sono una frequente via di comunicazione di dati fra applicazioni proprietarie. Le macro Openoffice operano anche con file Microsoft Office, mentre al solito non esiste un'interoperabilità in senso opposto. Il compilatore Macro di Excel è molto più veloce e stabile.

### LibreOffice

LibreOffice introduce, rispetto a Open Office (da cui deriva) il supporto alle macro VBA: questo rende compatibili con il software le macro sviluppate con Microsoft Office.
Resta il supporto ai linguaggi di programmazione supportati da Open Office.

### Interoperabilità delle macro

Le macro salvate in Open Office non possono essere eseguite in Office e viceversa.
Per farlo, occorre riscrivere il codice delle macro di origine nel linguaggio di programmazione utilizzato dal programma di destinazione per le macro: ciò può essere fatto manualmente o con ricompilatori automatici, interni o esterni ai programmi interessati.
Novell e Sun Microsystems hanno reso disponibile, con la collaborazione di Microsoft, una versione dei propri programmi Open Office e Star Office compatibili con Microsoft Office, almeno per alcune funzionalità. I due programmi hanno una funzionalità che converte il codice VBA delle macro Excel nel proprio linguaggio di programmazione. Invece, Microsoft Excel non contiene funzionalità per l'esecuzione di macro di Open office o Star Office.
Esistono anche dei ricompilatori automatici per passare da VBA a StarBasic e viceversa, e avere il codice necessario per eseguire la macro nel nuovo programma.