Dynamisk legge til og kjøre en VBA-makro fra Visual Basic

Gjelder: Microsoft Office Excel 2007Microsoft Office Professional Edition 2003Microsoft Office Excel 2003

Sammendrag


Når automatisere et Office-produkt fra Visual Basic, kan det være nyttig å flytte deler av koden i et Microsoft Visual Basic for Applications (VBA)-modul som kan kjøres i prosessområdet til serveren. Dette kan øke samlet kjøretid for programmet og bidra til å unngå problemer hvis serveren bare utfører en handling når oppringingen blir foretatt i prosessen.

Denne artikkelen beskriver hvordan du dynamisk legger en VBA-modul til et Office-program som kjører fra Visual Basic, og deretter kaller du makroen for å fylle en regneark i prosess.

Hvis du vil ha mer informasjon


Følgende eksempel viser hvordan du setter inn en kodemodul i Microsoft Excel, men du kan bruke samme metode for Word og PowerPoint fordi begge ta samme VBA-motoren.

Eksemplet bruker en statisk fil for kodemodulen som settes inn i Excel. Du bør vurdere å flytte koden til en ressursfil som du kan kompilere inn i programmet, og deretter trekke ut i en midlertidig fil når det er nødvendig ved kjøretid. Dette vil gjøre prosjektet lettere å håndtere for ny distribusjon.

Fra og med Microsoft Office XP, må en bruker gi tilgang til VBA-objektmodellen automatiseringskoden skrevet for å manipulere VBA skal fungere. Dette er en ny sikkerhetsfunksjon i Office XP. Hvis du vil ha mer informasjon, kan du se følgende Knowledge base-artikkel:
282830 avslås programmatisk tilgang til VBA-prosjektet i Office XP

Trinn for å bygge opp utvalget

  1. Først oppretter du en ny tekstfil kalt KbTest.bas (uten filtypen TXT). Dette er en kodemodul som vi vil sette inn i Excel under kjøring.
  2. Legg til følgende kodelinjer i tekstfilen:
       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. Lagre tekstfilen i C:\KbTest.bas-mappen, og deretter lukke filen.
  4. Start Visual Basic og Opprett et standard prosjekt. Form1 opprettes som standard.
  5. KlikkReferencesprosjekt -menyen, og deretter velger du riktig type bibliotek-versjon som lar deg bruke tidlig binding til Excel.

    Hvis du for eksempel velger du ett av følgende:
    • Velg 12,0 biblioteket for Microsoft Office Excel 2007.
    • Velg 11.0 biblioteket for Microsoft Office Excel 2003.
    • Velg 10.0 biblioteket for Microsoft Excel 2002.
    • Velg 9.0 biblioteket for Microsoft Excel 2000.
    • Velg 8.0 biblioteket for Microsoft Excel 97.
  6. Legge til en knapp i Form1, og Plasser følgende kode i hendelsesbehandlingen for Klikk -hendelsen for knappen:
       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. Excel 2002 og senere versjoner av Excel, må du aktivere access VBA-prosjektet. Hvis du vil gjøre dette, bruker du én av følgende metoder:
    • I Excel 2007 klikker du Microsoft Office-knappen, og klikk deretter Alternativer for Excel. Klikk Klareringssenter, og klikk deretter Innstillinger for klareringssenter. Klikk Makroinnstillinger, klikker du for å merke av for Klarer tilgang til VBA-prosjektobjektmodellen , og klikk deretter OK to ganger.
    • I Excel 2003 og i tidligere versjoner av Excel, velger du makroVerktøy -menyen, og klikk deretter Sikkerhet. Klikk kategorien Klarerte kilder i dialogboksen Sikkerhet , og deretter for å merke av for Klarer tilgang til Visual Basic-prosjektet .
  8. Kjøre Visual Basic-prosjektet.

Referanser


Hvis du vil ha mer informasjon om automatisering av Office fra Visual Basic, kan du se webområdet for støtte for utvikling av Office på følgende adresse: