Usi Excel su Mac ma i pulsanti ActiveX non rispondono? Non è un bug: ActiveX non esiste su macOS. In questa guida trovi un percorso pratico per sostituire i CommandButton con alternative supportate, proteggere i pulsanti da modifiche e — se serve davvero ActiveX — continuare in ambiente Windows.
Perché ActiveX non funziona su macOS
ActiveX è una tecnologia legata al mondo Windows/COM. Excel per macOS non implementa la piattaforma ActiveX e non contiene il percorso File ▸ Opzioni ▸ Trust Center ▸ Impostazioni ActiveX presente su Windows. Anche se apri una cartella di lavoro che su PC usa controlli ActiveX, su Mac quei controlli non saranno interattivi: nella migliore delle ipotesi compaiono come oggetti non cliccabili; nella peggiore, vengono rimossi o trasformati in segnaposto.
Microsoft ha annunciato e prosegue una graduale dismissione delle dipendenze da ActiveX in Office e nel web. Per chi lavora in ambienti misti Mac/Windows, la direzione consigliata è eliminare ActiveX e migrare verso controlli supportati ovunque (Form Controls), UserForm in VBA o, per scenari più evoluti, componenti moderni come Office Add-ins e automazioni cloud.
Soluzioni e raccomandazioni a colpo d’occhio
Obiettivo | Possibile soluzione | Dettagli operativi |
---|---|---|
Attivare ActiveX su Mac | Non possibile | Excel per macOS non supporta e non supporterà ActiveX; la tecnologia è deprecata e non è mai stata implementata su macOS. |
Sostituire i CommandButton | Controlli modulo o Forme | Associa le macro ai Controlli modulo (pulsante) o a delle Forme con Assegna macro…. Per evitarne la modifica, proteggi il foglio (vedi più avanti) disattivando “Modifica oggetti”. Eventuali Pivot possono continuare a funzionare consentendo “Aggiorna tabelle pivot”. |
Mantenere l’interfaccia utente separata | UserForm VBA | Crea un UserForm con pulsanti e campi; l’utente interagisce con la finestra, i fogli restano protetti. |
Evitare che i pulsanti vengano spostati | Foglio dedicato/protetto | Posiziona i pulsanti su un foglio “hub” protetto; le macro operano sui fogli dati/risultati. Se devi nasconderlo, apri direttamente uno UserForm. |
Continuare a usare ActiveX “vero” | Esecuzione di Excel per Windows | Virtual machine (es. Parallels, VMware Fusion). Boot Camp (solo Mac Intel). Desktop remoto verso un PC Windows dedicato. |
Percorso di migrazione consigliato
- Mappa i controlli esistenti. Elenca su Windows i CommandButton ActiveX presenti e la macro/evento a cui puntano (
CommandButtonX_Click
). - Isola la logica. Sposta il codice “di business” dagli eventi dei controlli a Procedure pubbliche in moduli standard (es.
GeneraReport
,AggiornaDati
). Così i pulsanti — qualunque siano — chiamano funzioni stabili. - Scegli UI alternativa. Decidi se usare Controlli modulo/forme sul foglio o uno UserForm modeless.
- Proteggi e distribuisci. Applica protezione ai fogli per impedire modifiche ai pulsanti, prevedi un Workbook_Open che configura tutto e prepara l’ambiente macOS/Windows.
Opzione A: sostituire i CommandButton con Controlli modulo o Forme
Quando preferire i Controlli modulo
I “Controlli modulo ▸ Pulsante” restano cliccabili anche a foglio protetto, senza dover concedere agli utenti la modifica degli oggetti. Sono la scelta più robusta quando vuoi bottoni non modificabili su macOS.
Quando bastano le Forme
Una Forma (rettangolo, icona) è più flessibile esteticamente e può richiamare una macro impostando .OnAction
. Su alcune build di Excel per Mac, per cliccarla su foglio protetto può essere necessario consentire “Modifica oggetti”; se vuoi evitare questa concessione, preferisci i Controlli modulo.
Passi pratici per un pulsante “Genera report”
- Abilita la scheda Sviluppatore (macOS): Excel ▸ Preferenze ▸ Ribbon & Toolbar, spunta Sviluppatore.
- Inserisci ▸ Sviluppatore ▸ Inserisci ▸ Controlli modulo ▸ Pulsante (oppure una Forma).
- Assegna macro ▸ scegli GeneraReport (vedi codice).
- Rinomina il controllo in modo parlante (es. btnGenera), utile per manutenzione.
- Proteggi il foglio come descritto più sotto.
Refactoring del codice: dagli eventi ActiveX a Sub chiamabili
Spesso il codice è annidato in CommandButtonX_Click
. Estrarre la logica in una Sub pubblica consente di richiamarla da qualunque UI:
' Modulo: Report.bas
Option Explicit
Public Sub GeneraReport()
Application.ScreenUpdating = False
Application.EnableEvents = False
On Error GoTo EH
' 1) Recupero dati
' 2) Popolamento modello
' 3) Aggiornamento pivot e grafici
Call AggiornaPivotTutte
MsgBox "Report generato correttamente.", vbInformation
Done:
Application.EnableEvents = True
Application.ScreenUpdating = True
Exit Sub
EH:
MsgBox "Errore durante la generazione: " & Err.Description, vbExclamation
Resume Done
End Sub
Public Sub AggiornaPivotTutte()
Dim ws As Worksheet, pvt As PivotTable
For Each ws In ThisWorkbook.Worksheets
For Each pvt In ws.PivotTables
pvt.PivotCache.Refresh
Next pvt
Next ws
End Sub
Se desideri riutilizzare il nome del vecchio evento per retro‑compatibilità, crea un “bridge” nel modulo del foglio o dello UserForm Windows:
' Vecchio evento su Windows (ActiveX)
Private Sub CommandButton1_Click()
GeneraReport
End Sub
Dispatcher centralizzato per più pulsanti
Per evitare decine di macro diverse, usa un unico dispatcher che decide cosa fare in base al nome del controllo chiamante. Funziona sia con Controlli modulo sia con Forme (proprietà OnAction
):
' Modulo: Ui.bas
Option Explicit
Public Sub UI_Run()
Dim caller As String
caller = Application.Caller ' Nome del pulsante/forma
Select Case LCase$(caller)
Case "btnaggiorna", "aggiorna_dati"
AggiornaDati
Case "btngenera", "genera_report"
GeneraReport
Case "btnesporta"
EsportaPDF
Case Else
MsgBox "Azione non riconosciuta: " & caller, vbExclamation
End Select
End Sub
Public Sub WireButtons(Optional ByVal ws As Worksheet)
Dim t As Variant, i As Long
t = Array("btnAggiorna", "btnGenera", "btnEsporta")
If ws Is Nothing Then Set ws = ActiveSheet
For i = LBound(t) To UBound(t)
If HasShape(ws, CStr(t(i))) Then ws.Shapes(CStr(t(i))).OnAction = "UI_Run"
Next i
End Sub
Private Function HasShape(ByVal ws As Worksheet, ByVal nm As String) As Boolean
On Error Resume Next
HasShape = Not ws.Shapes(nm) Is Nothing
On Error GoTo 0
End Function
Trucco pratico: imposta l’associazione OnAction
a ogni apertura file:
' ThisWorkbook
Private Sub Workbook_Open()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
WireButtons ws
Next ws
ProteggiTuttiIFogli
End Sub
Protezione del foglio “a prova di click”
La protezione del foglio è il modo giusto per impedire la modifica dei pulsanti e, allo stesso tempo, lasciare che gli utenti eseguano le macro. Configurala così:
- Blocca i pulsanti (Formato forma ▸ Proprietà ▸ Bloccata).
- Proteggi il foglio senza consentire “Modifica oggetti”.
- Consenti operazioni utente utili (Selezione celle, Uso filtri, Aggiornamento pivot).
- Attiva
UserInterfaceOnly:=True
per permettere alle macro di scrivere su celle bloccate senza sbloccare il foglio.
' Modulo: Security.bas
Option Explicit
Public Sub ProteggiTuttiIFogli()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ProteggiFoglio ws, "password123" ' Cambia password
Next ws
End Sub
Public Sub ProteggiFoglio(ByVal ws As Worksheet, ByVal pwd As String)
On Error Resume Next
ws.Unprotect Password:=pwd
On Error GoTo 0
ws.Protect Password:=pwd, _
DrawingObjects:=True, Contents:=True, Scenarios:=True, _
UserInterfaceOnly:=True, _
AllowFiltering:=True, _
AllowUsingPivotTables:=True
End Sub
Nota: l’impostazione UserInterfaceOnly
non si salva nella cartella; va rilanciata a ogni apertura (già gestito in Workbook_Open
).
Indicare visivamente lo stato “abilitato/disabilitato”
ActiveX offre proprietà come Enabled. Con Forme/Controlli modulo puoi simulare lo stato disabilitato con accorgimenti UI:
- Usa due versioni del pulsante (attivo/grigio) e mostra/nascondi la forma corretta.
- Controlla in
UI_Run
eventuali prerequisiti e, se non soddisfatti, mostra un messaggio invece di eseguire.
Public Function PrerequisitiOk() As Boolean
PrerequisitiOk = Len(Trim$(Range("rngDataSource").Value)) > 0
End Function
Public Sub UI_Run()
If Not PrerequisitiOk Then
MsgBox "Compila i parametri prima di procedere.", vbExclamation
Exit Sub
End If
' ... segue come sopra
End Sub
Opzione B: mantenere l’interfaccia nell’editor — UserForm VBA
Gli UserForm sono supportati anche su Mac e rappresentano un’ottima alternativa quando vuoi tenere i fogli “puliti” (ed eventualmente protetti) e spostare l’interazione in una finestra dedicata.
Vantaggi principali
- UI separata dai fogli, niente oggetti cliccabili nel worksheet.
- Controllo fine dei flussi (convalide, passaggi guidati).
- Compatibilità macOS/Windows senza ActiveX sul foglio.
Esempio di form “Modeless” come pannello di controllo
' UserForm: frmHub
' Aggiungi 3 pulsanti: cmdAggiorna, cmdGenera, cmdEsporta
Private Sub cmdAggiorna_Click()
AggiornaDati
End Sub
Private Sub cmdGenera_Click()
GeneraReport
End Sub
Private Sub cmdEsporta_Click()
EsportaPDF
End Sub
' ThisWorkbook
Private Sub Workbook_Open()
frmHub.Show vbModeless ' l'utente può interagire con i fogli
ProteggiTuttiIFogli
End Sub
Se vuoi che il form apra uno specifico foglio, aggiungi un selettore (ComboBox) con l’elenco dei report e chiama Worksheets(...).Activate
all’azione del pulsante.
Opzione C: quando serve davvero ActiveX — eseguire Excel per Windows
Se una dipendenza esterna (un controllo proprietario ActiveX, una libreria COM) è ineliminabile nel breve periodo, l’unica strada è far girare Excel per Windows dal Mac:
- Virtual machine (Parallels, VMware Fusion): installa Windows e Office. Su Mac con chip Apple Silicon si usa Windows 11 ARM. La maggior parte dei controlli ActiveX “classici” funziona tramite emulazione x86, ma componenti x64 o driver/COM specifici possono non essere supportati.
- Boot Camp (solo Mac Intel): avvio nativo di Windows, piena compatibilità ActiveX. Non disponibile su Mac con chip Apple.
- Desktop remoto: lascia i file su OneDrive/SharePoint o su un server e accedi a un PC Windows attraverso RDP. È spesso la soluzione più semplice per utenti occasionali.
Valuta questa opzione come “ponte” durante il refactoring: riduci progressivamente la superficie ActiveX per tornare su macOS nativo.
Considerazioni extra per un refactoring solido
Deprecazione di ActiveX
ActiveX è una tecnologia legacy. Ridurne l’uso oggi abbassa i costi futuri: meno vincoli COM/Windows, meno rischi di rottura con aggiornamenti di Office e passaggi architetturali (ARM, sandbox, app store).
Protezione flessibile senza bloccare l’utente
La protezione del foglio non è “tutto o niente”. Puoi consentire selezione celle, filtri, ordinamenti, aggiornamento Pivot e vietare modifica a oggetti/testi. Con UserInterfaceOnly
il codice continua a operare anche su celle bloccate. Questo elimina la necessità di ActiveX come “trucco” per tenere fermi i pulsanti.
Portabilità del codice VBA
- Evita oggetti COM/WinAPI (
CreateObject("Scripting.Dictionary")
,FileSystemObject
, chiamateDeclare PtrSafe
verso DLL di Windows): su Mac non esistono. - Preferisci API VBA native per file/cartelle (
Dir
,MkDir
,Kill
,Open #
…). Se ti serve un dictionary, usa una classe VBA oppure collezioniCollection
. - Non fare affidamento su percorsi assoluti o separatori Windows (
\
). UsaApplication.PathSeparator
e posiziona i file accanto al workbook (ThisWorkbook.Path
).
Guida passo passo: migrazione di un file reale
Individua e dismetti i controlli ActiveX
Apri il file su Windows, vai su Sviluppatore ▸ Modalità progettazione e annota i nomi dei CommandButton e i rispettivi gestori. Per tenere traccia, incolla direttamente sul foglio una piccola tabella “di servizio”. Esempio:
Controllo ActiveX | Evento | Nuova macro | Sostituzione |
---|---|---|---|
CommandButton1 | Click | GeneraReport | Pulsante (Modulo) “btnGenera” |
CommandButton2 | Click | AggiornaDati | Forma “btnAggiorna” |
CommandButton3 | Click | EsportaPDF | UserForm “frmHub” ▸ cmdEsporta |
Estrai la logica dagli eventi
Trasforma ogni ..._Click
in una chiamata a Sub pubbliche in moduli standard. Questo è il cuore del refactoring: la logica non deve dipendere dal tipo di pulsante.
Inserisci e cabla i nuovi pulsanti
Sostituisci ogni CommandButton con un Controllo modulo o una Forma. Rinomina e assegna UIRun
o la macro specifica. Per le Forme, imposta .OnAction = "UIRun"
con uno script WireButtons per evitare dimenticanze.
Applica la protezione
Blocca le forme/controlli e proteggi il foglio disabilitando la modifica degli oggetti; consenti filtri e Pivot a seconda delle esigenze. Inserisci in Workbook_Open
un richiamo a ProteggiTuttiIFogli
.
Verifica su macOS
- Apri la cartella su Excel per Mac.
- Con il foglio protetto, i pulsanti devono restare cliccabili; le macro devono completare senza errori.
- Controlla che non esistano riferimenti a percorsi/dll di Windows, né chiamate a oggetti COM.
Snippet utili pronti all’uso
Esportazione PDF multipiattaforma
Public Sub EsportaPDF()
Dim p As String
p = ThisWorkbook.Path & Application.PathSeparator & "Report.pdf"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=p, _
Quality:=xlQualityStandard, IgnorePrintAreas:=False, OpenAfterPublish:=True
End Sub
Rilevare la piattaforma in runtime
Public Function IsMac() As Boolean
#If Mac Then
IsMac = True
#Else
IsMac = False
#End If
End Function
Gestione robusta degli errori nelle macro “da pulsante”
Public Sub AggiornaDati()
On Error GoTo Trap
Application.ScreenUpdating = False
' ... carica dati, refresh, ecc.
Fin:
Application.ScreenUpdating = True
Exit Sub
Trap:
MsgBox "Aggiornamento non riuscito: " & Err.Description, vbExclamation
Resume Fin
End Sub
UI sul foglio o UserForm? Linee guida rapide
Scenario | Meglio UI su foglio | Meglio UserForm |
---|---|---|
Pochi pulsanti globali (Aggiorna/Report) | ✔ | — |
Molti parametri utente, convalide e passaggi | — | ✔ |
Fogli devono restare sempre protetti | ✔ (Form Controls) | ✔ |
Look & feel personalizzato | Forme con stile | ✔ |
Compatibilità totale Mac/Windows | ✔ | ✔ |
Domande frequenti
Posso “convertire” automaticamente un CommandButton ActiveX in un pulsante modulo?
Non esiste un convertitore nativo. La migrazione consiste nel ricreare il pulsante e riassociare la macro, spostando la logica fuori dagli eventi ActiveX.
I pulsanti su foglio protetto non rispondono al click: cosa controllo?
Verifica di star usando Controlli modulo (non ActiveX), che il foglio sia protetto senza concessione di modifica oggetti e che il controllo sia associato alla macro giusta. Se usi Forme, considera di passare ai Controlli modulo se la build di Excel in uso blocca il click sulle forme con oggetti non modificabili.
Gli UserForm usano ActiveX?
Gli UserForm si basano sulla libreria MSForms, supportata anche su macOS. Non dipendono dalla piattaforma ActiveX sul foglio, per cui sono utilizzabili.
Posso usare Power Query/Power Pivot su Mac?
Il supporto su Mac è più limitato rispetto a Windows (soprattutto per il Data Model). Se il tuo processo si affida pesantemente a queste funzionalità avanzate, valuta l’esecuzione su Windows.
Checklist finale prima della consegna
- Tutti i CommandButton ActiveX sono stati rimossi o ignorati e sostituiti.
- La logica è in Sub pubbliche in moduli standard (riutilizzabili).
- I nuovi pulsanti su foglio sono Controlli modulo o Forme con
OnAction
impostato. - Il foglio “hub” è protetto; sono consentite solo le azioni necessarie (filtri, pivot).
Workbook_Open
esegue cablaggio pulsanti e protezione (UserInterfaceOnly
).- Il file è testato su macOS e Windows (assenza di chiamate COM/WinAPI).
- Eventuali utenti che richiedono ActiveX “puro” dispongono di VM o accesso RDP a un PC Windows.
Sintesi operativa
- Non esiste alcun hack per abilitare ActiveX su macOS.
- Rimpiazza i Control ActiveX con Form Controls + protezione del foglio oppure con UserForm VBA.
- Se hai bisogno di ActiveX “a tutti i costi”, esegui Excel in Windows (VM o PC dedicato).
- Approfitta del refactoring per rendere le macro future‑proof, abbandonando una tecnologia in dismissione.
Appendice: modello di modulo standard riutilizzabile
' Modulo: EntryPoints.bas
Option Explicit
Public Sub Entrypoint_Genera()
Call GeneraReport
End Sub
Public Sub Entrypoint_Aggiorna()
Call AggiornaDati
End Sub
Public Sub Entrypoint_Esporta()
Call EsportaPDF
End Sub
Associare direttamente questi EntryPoint ai pulsanti semplifica la manutenzione: i nomi sono parlanti e puoi riassegnarli in massa con una macro di wire-up.
Appendice: suggerimenti di design per pulsanti su foglio
- Usa forme con testo centrato e margini interni ampi per un aspetto “nativo”.
- Allinea e distribuisci gli elementi attraverso Formato ▸ Allinea ▸ Distribuisci.
- Raggruppa pulsanti correlati all’interno di un rettangolo con titolo, così isoli l’area “Comandi”.
- Per evitare spostamenti, attiva Proprietà ▸ Non spostare o ridimensionare con le celle.
Con questo approccio la tua cartella di lavoro manterrà l’esperienza “a pulsanti” su macOS, senza ActiveX, con codice più pulito e portabile. E quando — o se — deciderai di abbandonare del tutto il VBA, la stessa architettura a Sub pubbliche semplificherà il passaggio a Office Scripts, Power Automate o ad Add-in moderni.