Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
È possibile utilizzare il codice visual Basic, Applications Edition (VBA) in un documento che fa parte di una personalizzazione a livello di documento per Microsoft Office Word o Microsoft Office Excel. È possibile chiamare il codice VBA nel documento dall'assembly di personalizzazione oppure configurare il progetto per abilitare il codice VBA nel documento per chiamare il codice nell'assembly di personalizzazione.
Si applica a: Le informazioni contenute in questo argomento si applicano ai progetti a livello di documento per Excel e Word. Per altre informazioni, vedere Funzionalità disponibili per l'applicazione e il tipo di progetto di Office.
Comportamento del codice VBA in una personalizzazione a livello di documento
Quando si apre il progetto in Visual Studio, il documento viene aperto in modalità progettazione. Il codice VBA non viene eseguito quando il documento è in modalità progettazione, quindi è possibile lavorare sul documento e sul codice senza eseguire il codice VBA.
Quando si esegue la soluzione, i gestori eventi sia in VBA sia nell'assembly di personalizzazione rilevano gli eventi generati nel documento ed entrambi i set di codice vengono eseguiti. Non è possibile determinare in anticipo quale codice verrà eseguito prima dell'altro; è necessario determinare questa operazione tramite test in ogni singolo caso. È possibile ottenere risultati imprevisti se i due set di codice non sono accuratamente coordinati e testati.
Chiamare il codice VBA dall'assembly di customizzazione
È possibile chiamare macro nei documenti di Word ed è possibile chiamare macro e funzioni nelle cartelle di lavoro di Excel. Per farlo, usare uno dei metodi seguenti:
Per Word, chiamare il Run metodo della Application classe .
Per Excel, chiamare il Run metodo della Application classe .
Per ogni metodo, il primo parametro identifica il nome della macro o della funzione che si desidera chiamare e i parametri facoltativi rimanenti specificano i parametri da passare alla macro o alla funzione. Il primo parametro può avere formati diversi per Word ed Excel:
Per Word, il primo parametro è una stringa che può essere qualsiasi combinazione di modello, modulo e nome della macro. Se si specifica il nome del documento, il codice può eseguire solo macro nei documenti correlati al contesto corrente, non solo qualsiasi macro in qualsiasi documento.
Per Excel, il primo parametro può essere una stringa che specifica il nome della macro, un Range oggetto che indica dove si trova la funzione o un ID registro per una funzione DLL registrata (XLL). Se si passa una stringa, la stringa verrà valutata nel contesto del foglio attivo.
Nell'esempio di codice seguente viene illustrato come chiamare una macro denominata
MyMacroda un progetto a livello di documento per Excel. In questo esempio si presuppone cheMyMacrosia definito inSheet1.
Globals.Sheet1.Application.Run("MyMacro", missing, missing, missing,
missing, missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing);
Annotazioni
Per informazioni sull'uso della variabile globale missing al posto dei parametri facoltativi in Visual C#, vedere Scrivere codice nelle soluzioni Office.
Chiamare codice nelle personalizzazioni a livello di documento tramite VBA
È possibile configurare un progetto a livello di documento per Word o Excel in modo che il codice di Visual Basic for Applications (VBA) nel documento possa chiamare il codice nell'assembly di personalizzazione. Si tratta di una funzionalità utile nei seguenti scenari:
Si vuole estendere il codice VBA esistente in un documento utilizzando le funzionalità di una personalizzazione a livello di documento associata allo stesso documento.
Si desidera rendere disponibili servizi sviluppati in una personalizzazione a livello di documento per gli utenti finali che possono accedere ai servizi scrivendo codice VBA nel documento.
Gli strumenti di sviluppo di Office in Visual Studio offrono una funzionalità simile per i componenti aggiuntivi VSTO. Se si sviluppa un componente aggiuntivo VSTO, è possibile chiamare il codice nel componente aggiuntivo VSTO da altre soluzioni di Microsoft Office. Per altre informazioni, vedere Chiamare il codice nei componenti aggiuntivi VSTO da altre soluzioni Office.
Annotazioni
Questa funzionalità non può essere utilizzata nei progetti modello di Word. Può essere usato solo nei progetti di documenti di Word, cartella di lavoro di Excel o modello di Excel.
Requisiti
Prima di abilitare il codice VBA per chiamare l'assembly di personalizzazione, il progetto deve soddisfare i requisiti seguenti:
Il documento deve avere una delle estensioni di file seguenti:
Per Word: .docm o .doc
Per Excel: .xlsm, .xltm, .xlso xlt
Il documento deve contenere già un progetto VBA contenente codice VBA.
È necessario consentire l'esecuzione del codice VBA nel documento senza chiedere all'utente di abilitare le macro. È possibile considerare attendibile il codice VBA da eseguire aggiungendo il percorso del progetto office all'elenco di percorsi attendibili nelle impostazioni del Centro protezione per Word o Excel.
Il progetto di Office deve contenere almeno una classe pubblica che contiene uno o più membri pubblici esposti a VBA.
È possibile esporre metodi, proprietà ed eventi a VBA. La classe esposta può essere una classe di elementi host (ad esempio
ThisDocumentper Word o perThisWorkbookExcel) oSheet1un'altra classe definita nel progetto. Per altre informazioni sugli elementi host, vedere Panoramica degli elementi host e dei controlli host.
Abilitare il codice VBA per consentire l'accesso all'assembly di personalizzazione
Esistono due modi diversi per esporre i membri in un assembly di personalizzazione al codice VBA nel documento:
È possibile esporre i membri di una classe di elementi host in un progetto Visual Basic a VBA. A tale scopo, impostare la proprietà EnableVbaCallers dell'elemento host su True nella finestra Proprietà mentre l'elemento host , ovvero il documento, il foglio di lavoro o la cartella di lavoro, è aperto nella finestra di progettazione. Visual Studio esegue automaticamente tutte le operazioni necessarie per consentire al codice VBA di chiamare i membri della classe .
È possibile esporre membri in qualsiasi classe pubblica in un progetto Visual C# o membri in una classe di elementi non host in un progetto Visual Basic a VBA. Questa opzione offre maggiore libertà per scegliere le classi esposte a VBA, ma richiede anche passaggi più manuali.
A tale scopo, è necessario eseguire i passaggi principali seguenti:
Esporre la classe a COM.
Sovrascrivere il metodo GetAutomationObject di una classe di elementi host nel progetto per restituire un'istanza della classe che stai esponendo a VBA.
Impostare la proprietà ReferenceAssemblyFromVbaProject di qualsiasi classe dell'elemento host nel progetto su True. In questo modo la libreria dei tipi dell'assembly di personalizzazione viene incorporata nell'assembly e viene aggiunto un riferimento alla libreria dei tipi al progetto VBA nel documento.
Per istruzioni dettagliate, vedere Procedura: Esporre codice a VBA in un progetto Visual Basic e Procedura: Esporre codice a VBA in un progetto Visual C#.
Le proprietà EnableVbaCallers e ReferenceAssemblyFromVbaProject sono disponibili solo nella finestra Proprietà in fase di progettazione; non possono essere usati in fase di esecuzione. Per visualizzare le proprietà, aprire la finestra di progettazione per un elemento host in Visual Studio. Per altre informazioni sulle attività specifiche eseguite da Visual Studio quando si impostano queste proprietà, vedere Attività eseguite dalle proprietà dell'elemento host.
Annotazioni
Se la cartella di lavoro o il documento non contiene già codice VBA o se il codice VBA nel documento non è attendibile per l'esecuzione, verrà visualizzato un messaggio di errore quando si imposta la proprietà EnableVbaCallers o ReferenceAssemblyFromVbaProject su True. Ciò è dovuto al fatto che Visual Studio non può modificare il progetto VBA nel documento in questa situazione.
Usare i membri nel codice VBA per invocare l'assembly di personalizzazione
Dopo aver configurato il progetto per consentire al codice VBA di chiamare nell'assembly di personalizzazione, Visual Studio aggiunge i membri seguenti al progetto VBA nel documento:
Per tutti i progetti, Visual Studio aggiunge un metodo globale denominato
GetManagedClass.Per i progetti Visual Basic in cui si espongono membri di una classe di elementi host tramite la proprietà EnableVbaCallers, Visual Studio aggiunge anche una proprietà denominata
CallVSTOAssemblyalThisDocumentmodulo ,ThisWorkbookSheet1,Sheet2, oSheet3nel progetto VBA.È possibile utilizzare la proprietà
CallVSTOAssemblyo il metodoGetManagedClassper accedere ai membri pubblici della classe esposta al codice VBA nel progetto.
Annotazioni
Durante lo sviluppo e la distribuzione della soluzione, sono disponibili diverse copie del documento in cui è possibile aggiungere il codice VBA. Per altre informazioni, vedere Linee guida per l'aggiunta di codice VBA al documento.
Utilizzare la proprietà CallVSTOAssembly in un progetto Visual Basic
Utilizzare la CallVSTOAssembly proprietà per accedere ai membri pubblici aggiunti alla classe dell'elemento host. Ad esempio, la macro VBA seguente chiama un metodo denominato MyVSTOMethod definito nella Sheet1 classe in un progetto di cartella di lavoro di Excel.
Sub MyMacro()
Sheet1.CallVSTOAssembly.MyVSTOMethod()
End Sub
Questa proprietà è un modo più pratico per accedere all'assembly di personalizzazione rispetto all'uso diretto del metodo GetManagedClass.
CallVSTOAssembly restituisce un oggetto che rappresenta la classe di elementi host esposta a VBA. I membri e i parametri del metodo dell'oggetto restituito vengono visualizzati in IntelliSense.
La CallVSTOAssembly proprietà ha una dichiarazione simile al codice seguente. Questo codice presuppone che la classe dell'elemento Sheet1 host sia stata esposta a VBA in un progetto di cartella di lavoro di Excel denominato ExcelWorkbook1.
Property Get CallVSTOAssembly() As ExcelWorkbook1.Sheet1
Set CallVSTOAssembly = GetManagedClass(Me)
End Property
Usare il metodo GetManagedClass
Per usare il metodo globale GetManagedClass , passare l'oggetto VBA che corrisponde alla classe dell'elemento host che contiene l'override del metodo GetAutomationObject . Usare quindi l'oggetto restituito per accedere alla classe esposta a VBA.
Ad esempio, la macro VBA seguente chiama un metodo denominato MyVSTOMethod definito nella classe dell'elemento Sheet1 host in un progetto di cartella di lavoro di Excel denominato ExcelWorkbook1.
Sub CallVSTOMethod
Dim VSTOSheet1 As ExcelWorkbook1.Sheet1
Set VSTOSheet1 = GetManagedClass(Sheet1)
VSTOSheet1.MyVSTOMethod
End Sub
Il GetManagedClass metodo ha la dichiarazione seguente.
GetManagedClass(pdispInteropObject Object) As Object
Questo metodo restituisce un oggetto che rappresenta la classe esposta a VBA. I membri e i parametri del metodo dell'oggetto restituito vengono visualizzati in IntelliSense.
Linee guida per l'aggiunta di codice VBA al documento
Sono disponibili varie copie del documento in cui è possibile aggiungere codice VBA che chiama la personalizzazione a livello di documento.
Durante lo sviluppo e il test della soluzione, è possibile scrivere codice VBA nel documento aperto durante il debug o l'esecuzione del progetto in Visual Studio, ovvero il documento nella cartella di output della compilazione. Tuttavia, qualsiasi codice VBA aggiunto a questo documento verrà sovrascritto alla successiva compilazione del progetto, perché Visual Studio sostituisce il documento nella cartella di output della compilazione con una copia del documento dalla cartella del progetto principale.
Se si desidera salvare il codice VBA aggiunto al documento durante il debug o l'esecuzione della soluzione, copiare il codice VBA nel documento nella cartella del progetto. Per altre informazioni sul processo di compilazione, vedere Creare soluzioni office.
Quando si è pronti per distribuire la soluzione, sono disponibili tre percorsi principali per i documenti in cui è possibile aggiungere il codice VBA.
Nella cartella del progetto nel computer di sviluppo
Questa posizione è utile se si ha il controllo completo sul codice VBA nel documento e sul codice di personalizzazione. Poiché il documento si trova nel computer di sviluppo, è possibile modificare facilmente il codice VBA se si modifica il codice di personalizzazione. Il codice VBA aggiunto a questa copia del documento rimane nel documento quando si compila, si esegue il debug e si pubblica la soluzione.
Non è possibile aggiungere il codice VBA al documento mentre è aperto nella finestra di progettazione. È necessario innanzitutto chiudere il documento nella finestra di progettazione e quindi aprire il documento direttamente in Word o Excel.
Attenzione
Se si aggiunge codice VBA eseguito all'apertura del documento, in rari casi questo codice potrebbe danneggiare il documento o impedirne l'apertura nella finestra di progettazione.
Nella cartella di pubblicazione o installazione
In alcuni casi, potrebbe essere opportuno aggiungere il codice VBA al documento nella cartella di pubblicazione o installazione. Ad esempio, è possibile scegliere questa opzione se il codice VBA viene scritto e testato da uno sviluppatore diverso in un computer in cui non è installato Visual Studio.
Se gli utenti installano la soluzione direttamente dalla cartella publish, è necessario aggiungere il codice VBA al documento ogni volta che si pubblica la soluzione. Visual Studio sovrascrive il documento nella destinazione di pubblicazione quando si pubblica la soluzione.
Se gli utenti installano la soluzione da una cartella di installazione diversa dalla cartella publish, è possibile evitare di aggiungere il codice VBA nel documento ogni volta che si pubblica la soluzione. Quando un aggiornamento di pubblicazione è pronto per essere spostato dalla cartella di pubblicazione alla cartella di installazione, copiare tutti i file nella cartella di installazione, ad eccezione del documento.
Nel computer dell'utente finale
Se gli utenti finali sono sviluppatori VBA che effettuano chiamate a servizi forniti nella personalizzazione a livello di documento, è possibile indicare loro come chiamare il codice usando la CallVSTOAssembly proprietà o il GetManagedClass metodo nelle relative copie del documento. Quando si pubblicano gli aggiornamenti alla soluzione, il codice VBA nel documento nel computer dell'utente finale non verrà sovrascritto, perché il documento non viene modificato dagli aggiornamenti di pubblicazione.
Attività eseguite dalle proprietà dell'elemento host
Quando si usano le proprietà EnableVbaCallers e ReferenceAssemblyFromVbaProject , Visual Studio esegue diversi set di attività.
EnableVbaCallers
Quando si imposta la proprietà EnableVbaCallers di un elemento host su True in un progetto Visual Basic, Visual Studio esegue le attività seguenti:
Aggiunge gli ComClassAttribute attributi e ComVisibleAttribute alla classe dell'elemento host.
Esegue l'override del metodo GetAutomationObject della classe dell'elemento host.
Imposta la proprietà ReferenceAssemblyFromVbaProject dell'elemento host su True.
Quando si imposta la proprietà EnableVbaCallers su False, Visual Studio esegue le attività seguenti:
Rimuove gli ComClassAttribute attributi e ComVisibleAttribute dalla
ThisDocumentclasse .Rimuove il metodo GetAutomationObject dalla classe dell'elemento host.
Annotazioni
Visual Studio non reimposta automaticamente la proprietà ReferenceAssemblyFromVbaProject su False. È possibile impostare questa proprietà su False manualmente usando la finestra Proprietà .
ReferenceAssemblyFromVbaProject
Quando la proprietà ReferenceAssemblyFromVbaProject di qualsiasi elemento host in un progetto Visual Basic o Visual C# è impostata su True, Visual Studio esegue le attività seguenti:
Genera una libreria dei tipi per l'assembly di personalizzazione e incorpora la libreria dei tipi nell'assembly.
Aggiunge un riferimento alle librerie dei tipi seguenti nel progetto VBA nel documento:
Libreria dei tipi per l'assembly di personalizzazione.
Libreria dei tipi dell'Execution Engine 9.0 di Microsoft Visual Studio Tools for Office. Questa libreria dei tipi è inclusa nel runtime di Visual Studio Tools per Office.
Quando la proprietà ReferenceAssemblyFromVbaProject viene impostata su False, Visual Studio esegue le attività seguenti:
Rimuove i riferimenti alla libreria dei tipi dal progetto VBA nel documento.
Rimuove la libreria dei tipi incorporata dall'assembly.
Troubleshoot
Nella tabella seguente sono elencati alcuni errori comuni e suggerimenti per la correzione degli errori.
| Errore | Suggerimento |
|---|---|
| Dopo aver impostato la proprietà EnableVbaCallers o ReferenceAssemblyFromVbaProject , un messaggio di errore indica che il documento non contiene un progetto VBA o non si dispone dell'autorizzazione per accedere al progetto VBA nel documento. | Verificare che il documento nel progetto contenga almeno una macro VBA, che il progetto VBA disponga di un trust sufficiente per l'esecuzione e che il progetto VBA non sia protetto da una password. |
| Dopo aver impostato la proprietà EnableVbaCallers o ReferenceAssemblyFromVbaProject , un messaggio di errore indica che la GuidAttribute dichiarazione è mancante o danneggiata. | Assicurarsi che la GuidAttribute dichiarazione si trovi nel file AssemblyInfo.cs o AssemblyInfo.vb nel progetto e che questo attributo sia impostato su un GUID valido. |
| Dopo aver impostato la proprietà EnableVbaCallers o ReferenceAssemblyFromVbaProject , un messaggio di errore indica che il numero di versione specificato da AssemblyVersionAttribute non è valido. | Assicurarsi che la AssemblyVersionAttribute dichiarazione nel file AssemblyInfo.cs o AssemblyInfo.vb nel progetto sia impostata su un numero di versione di assembly valido. Per informazioni sui numeri di versione dell'assembly validi, vedere la classe AssemblyVersionAttribute. |
| Dopo aver rinominato l'assembly di personalizzazione, il codice VBA che chiama nell'assembly di personalizzazione smette di funzionare. | Se si modifica il nome dell'assembly di personalizzazione dopo averlo esposto al codice VBA, il collegamento tra il progetto VBA nel documento e l'assembly di personalizzazione viene interrotto. Per risolvere questo problema, modificare la proprietà ReferenceFromVbaAssembly nel progetto impostandola su False e quindi su True e quindi sostituire eventuali riferimenti al nome dell'assembly precedente nel codice VBA con il nuovo nome dell'assembly. |
Contenuti correlati
- Procedura: Esporre codice a VBA in un progetto Visual Basic
- Procedura: Esporre codice a VBA in un progetto Visual C#
- Procedura dettagliata: Chiamare il codice da VBA in un progetto Visual Basic
- Procedura dettagliata: Chiamare il codice da VBA in un progetto Visual C#
- Progettare e creare soluzioni Office
- Confronto tra soluzioni VBA e Office in Visual Studio
- Programmare personalizzazioni a livello di documento