Riepilogo
Quando si automatizza un prodotto Office da Visual Basic, può essere utile spostare parte del codice in un modulo Microsoft Visual Basic, Applications Edition (VBA) che può essere eseguito all'interno dello spazio di processo del server. In questo modo è possibile aumentare la velocità di esecuzione complessiva dell'applicazione e risolvere i problemi se il server esegue un'azione solo quando viene effettuata una chiamata in-process.
Questo articolo illustra come aggiungere dinamicamente un modulo VBA a un'applicazione di Office in esecuzione da Visual Basic e quindi chiamare la macro per riempire un foglio di lavoro in-process.
Altre informazioni
Nell'esempio seguente viene illustrato l'inserimento di un modulo di codice in Microsoft Excel, ma è possibile usare la stessa tecnica per Word e PowerPoint perché entrambi incorporano lo stesso motore VBA.
Nell'esempio viene utilizzato un file di testo statico per il modulo di codice inserito in Excel. È consigliabile spostare il codice in un file di risorse che è possibile compilare nell'applicazione e quindi estrarre in un file temporaneo quando necessario in fase di esecuzione. Ciò renderebbe il progetto più gestibile per la ridistribuzione.
A partire da Microsoft Office XP, un utente deve concedere l'accesso al modello a oggetti VBA prima che qualsiasi codice di automazione scritto per modificare VBA funzioni. Si tratta di una nuova funzionalità di sicurezza con Office XP. Per altre informazioni, vedere il seguente articolo della Knowledge Base:
282830 Accesso programmatico a Office XP VBA Project negato
Passaggi per compilare l'esempio
Innanzitutto, crea un nuovo file di testo denominato KbTest.bas (senza l'estensione .txt). Questo è il modulo di codice che inseriremo in Excel in fase di esecuzione.
Nel file di testo, aggiungi le seguenti righe di codice:
Attribute VB_Name = "KbTest" ' Your Microsoft Visual Basic for Applications macro function takes 1 ' parameter, the sheet object that you are going to fill. Public Sub DoKbTest(oSheetToFill As Object) Dim i As Integer, j As Integer Dim sMsg As String For i = 1 To 100 For j = 1 To 10 sMsg = "Cell(" & Str(i) & "," & Str(j) & ")" oSheetToFill.Cells(i, j).Value = sMsg Next j Next i End SubSalvare il file di testo nella directory C:\KbTest.bas, quindi chiudere il file.
Avviare Visual Basic e creare un progetto standard. Form1 viene creato per impostazione predefinita.
Nel menu Progetto fare clic suRiferimenti e quindi selezionare la versione della libreria dei tipi appropriata che consente di usare l'associazione anticipata a Excel.
Selezionare ad esempio una delle opzioni seguenti:
- Per Microsoft Office Excel 2007, selezionare la raccolta 12.0.
- Per Microsoft Office Excel 2003, selezionare la raccolta 11.0.
- Per Microsoft Excel 2002, selezionare la raccolta 10.0.
- Per Microsoft Excel 2000, selezionare la raccolta 9.0.
- Per Microsoft Excel 97, selezionare la raccolta 8.0.
Aggiungere un pulsante a Form1 e inserire il codice seguente nel gestore per l'evento Click del pulsante:
Private Sub Command1_Click() Dim oXL As Excel.Application Dim oBook As Excel.Workbook Dim oSheet As Excel.Worksheet Dim i As Integer, j As Integer Dim sMsg As String ' Create a new instance of Excel and make it visible. Set oXL = CreateObject("Excel.Application") oXL.Visible = True ' Add a new workbook and set a reference to Sheet1. Set oBook = oXL.Workbooks.Add Set oSheet = oBook.Sheets(1) ' Demo standard Automation from out-of-process, ' this routine simply fills in values of cells. sMsg = "Fill the sheet from out-of-process" MsgBox sMsg, vbInformation Or vbMsgBoxSetForeground For i = 1 To 100 For j = 1 To 10 sMsg = "Cell(" & Str(i) & "," & Str(j) & ")" oSheet.Cells(i, j).Value = sMsg Next j Next i ' You're done with the first test, now switch sheets ' and run the same routine via an inserted Microsoft Visual Basic ' for Applications macro. MsgBox "Done.", vbMsgBoxSetForeground Set oSheet = oBook.Sheets.Add oSheet.Activate sMsg = "Fill the sheet from in-process" MsgBox sMsg, vbInformation Or vbMsgBoxSetForeground ' The Import method lets you add modules to VBA at ' run time. Change the file path to match the location ' of the text file you created in step 3. oXL.VBE.ActiveVBProject.VBComponents.Import "C:\KbTest.bas" ' Now run the macro, passing oSheet as the first parameter oXL.Run "DoKbTest", oSheet ' You're done with the second test MsgBox "Done.", vbMsgBoxSetForeground ' Turn instance of Excel over to end user and release ' any outstanding object references. oXL.UserControl = True Set oSheet = Nothing Set oBook = Nothing Set oXL = Nothing End SubPer Excel 2002 e versioni successive di Excel, è necessario attivare l'accesso al progetto VBA. A tale scopo, utilizzare uno dei metodi seguenti:
- In Excel 2007 fare clic sul pulsante Microsoft Office e quindi su Opzioni di Excel. Fare clic su Centro protezione e quindi su Impostazioni Centro protezione. Fare clic su Impostazioni macro, selezionare la casella di controllo Accesso attendibile al modello a oggetti del progetto VBA e quindi fare clic su OK due volte.
- In Excel 2003 e nelle versioni precedenti di Excel, scegliere Macro dal menu Strumenti e quindi fare clic su Sicurezza. Nella finestra di dialogo Sicurezza , fare clic sulla scheda Origini attendibili e quindi fare clic per selezionare la casella di controllo Considera attendibile l'accesso a Visual Basic Project .
Eseguire il progetto Visual Basic.
Riferimenti
Per altre informazioni sull'automazione di Office da Visual Basic, vedere il sito del supporto per lo sviluppo di Office all'indirizzo seguente: