ActiveX in Excel per macOS: alternative ai CommandButton e migrazione VBA senza sorprese

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.

Indice

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

ObiettivoPossibile soluzioneDettagli operativi
Attivare ActiveX su MacNon possibileExcel per macOS non supporta e non supporterà ActiveX; la tecnologia è deprecata e non è mai stata implementata su macOS.
Sostituire i CommandButtonControlli modulo o FormeAssocia 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 separataUserForm VBACrea un UserForm con pulsanti e campi; l’utente interagisce con la finestra, i fogli restano protetti.
Evitare che i pulsanti vengano spostatiFoglio dedicato/protettoPosiziona 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 WindowsVirtual machine (es. Parallels, VMware Fusion). Boot Camp (solo Mac Intel). Desktop remoto verso un PC Windows dedicato.

Percorso di migrazione consigliato

  1. Mappa i controlli esistenti. Elenca su Windows i CommandButton ActiveX presenti e la macro/evento a cui puntano (CommandButtonX_Click).
  2. 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.
  3. Scegli UI alternativa. Decidi se usare Controlli modulo/forme sul foglio o uno UserForm modeless.
  4. 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”

  1. Abilita la scheda Sviluppatore (macOS): Excel ▸ Preferenze ▸ Ribbon & Toolbar, spunta Sviluppatore.
  2. InserisciSviluppatore ▸ Inserisci ▸ Controlli modulo ▸ Pulsante (oppure una Forma).
  3. Assegna macro ▸ scegli GeneraReport (vedi codice).
  4. Rinomina il controllo in modo parlante (es. btnGenera), utile per manutenzione.
  5. 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, chiamate Declare 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 collezioni Collection.
  • Non fare affidamento su percorsi assoluti o separatori Windows (\). Usa Application.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 ActiveXEventoNuova macroSostituzione
CommandButton1ClickGeneraReportPulsante (Modulo) “btnGenera”
CommandButton2ClickAggiornaDatiForma “btnAggiorna”
CommandButton3ClickEsportaPDFUserForm “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

ScenarioMeglio UI su foglioMeglio UserForm
Pochi pulsanti globali (Aggiorna/Report)
Molti parametri utente, convalide e passaggi
Fogli devono restare sempre protetti✔ (Form Controls)
Look & feel personalizzatoForme 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.

Indice