Come aggiungere ed eseguire dinamicamente una macro VBA da Visual Basic

Si applica a
Microsoft Office Professional Edition 2003 Excel 2010

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

  1. 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.

  2. 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 Sub
    
    
  3. Salvare il file di testo nella directory C:\KbTest.bas, quindi chiudere il file.

  4. Avviare Visual Basic e creare un progetto standard. Form1 viene creato per impostazione predefinita.

  5. 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.
  6. 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 Sub
    
    
  7. Per 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 .
  8. 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:

http://support.microsoft.com/ofd