Dynamiskt lägga till och köra ett VBA-makro från Visual Basic

Gäller för: Microsoft Office Excel 2007Microsoft Office Professional Edition 2003Microsoft Office Excel 2003

Sammanfattning


Vid automatisering av en Office-produkt från Visual Basic, kan det vara användbart att flytta delar av koden i ett Microsoft Visual Basic for Applications (VBA)-modul som kan köras i processen diskutrymme på servern. Detta kan öka prestanda körning för programmet och undvika problem om servern utför endast en åtgärd när ett samtal görs i processen.

Den här artikeln visar hur du dynamiskt lägga till en VBA-modul till ett Office-program som körs från Visual Basic och sedan anropa makrot för att fylla ett kalkylblad i processen.

Mer Information


I följande exempel visas att infoga en kodmodul i Microsoft Excel, men du kan använda samma teknik för Word och PowerPoint eftersom både inkludera samma VBA-motorn.

Provet används en statisk textfil för kodmodulen som är insatt i Excel. Du kanske vill flytta koden till en resursfil som du kan sammanställa i programmet och sedan extrahera till en tillfällig fil när de behövs vid körning. Detta skulle göra projektet mer hanterbar för Vidaredistribution.

Från och med Microsoft Office XP måste användaren ge åtkomst till VBA-objektmodellen innan alla Automation-kod skrivs för att manipulera VBA fungerar. Detta är en ny säkerhetsfunktion med Office XP. Mer information finns i följande Knowledge base-artikel:
282830 nekas programmatisk åtkomst till VBA-projektet i Office XP

Åtgärder för att bygga upp provet

  1. Skapa först en ny textfil med namnet KbTest.bas (utan filnamnstillägget .txt). Detta är den kodmodul som vi infogar i Excel under körning.
  2. Lägg till följande rader med kod i textfilen:
       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. Spara textfilen till katalogen C:\KbTest.bas och sedan stänga filen.
  4. Starta Visual Basic och skapa ett projekt som standard. Form1 skapas som standard.
  5. Klicka påreferenserprojekt -menyn och välj lämplig typ bibliotek version så att du kan använda tidig bindning till Excel.

    Välj något av följande exempel:
    • Välj 12,0 bibliotek för Microsoft Office Excel 2007.
    • Välj 11.0 bibliotek för Microsoft Office Excel 2003.
    • Välj 10.0 bibliotek för Microsoft Excel 2002.
    • Markera biblioteket 9.0 för Microsoft Excel 2000.
    • Välj 8.0 bibliotek för Microsoft Excel 97.
  6. Lägg till en knapp i Form1 och placera följande kod på hanteraren för knappen klickar du på händelsen:
       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. För Excel 2002 och senare versioner av Excel, måste du aktivera access VBA-projektet. Genom att använda någon av följande metoder:
    • I Excel 2007 klickar du på Microsoft Office-knappenoch klicka sedan på Excel-alternativ. Klicka på Säkerhetscenteroch sedan på Inställningar för Säkerhetscenter. Klicka på Makroinställningar, markerar du kryssrutan Lita åtkomst till objektmodell för VBA-projekt och klicka sedan på OK två gånger.
    • I Excel 2003 och tidigare versioner av Excel pekar du på makroVerktyg -menyn och klicka sedan på säkerhet. Klicka på fliken Tillförlitliga källor i dialogrutan säkerhet och markera kryssrutan åtkomst till Visual Basic-projekt är tillförlitlig .
  8. Köra Visual Basic-projektet.

Referenser


Mer information om automatisering av Office från Visual Basic finns stöd för utveckling av Office-webbplatsen på följande adress: