Jak dynamicznie dodawać i uruchamiać makra VBA z języka Visual Basic

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

Streszczenie


Podczas automatyzowania produktu pakietu Office z programu Visual Basic, może być przydatne do przeniesienia części kodu do programu Microsoft Visual Basic for Applications (VBA) moduł, który można uruchomić wewnątrz przestrzeni procesu serwera. Może to zwiększyć ogólną szybkość wykonywania aplikacji i pomóc złagodzić problemy, jeśli serwer tylko przeprowadza akcję po nawiązaniu połączenia w procesie.

W tym artykule przedstawiono sposób dynamicznego dodawania modułu VBA do działającej aplikacji pakietu Office z programu Visual Basic, a następnie wywołać makra do wypełnienia arkusza w procesie.

Więcej informacji


Poniższy przykład demonstruje, wstawianie modułu kodu do programu Microsoft Excel, ale można użyć tej samej techniki dla programów Word i PowerPoint, ponieważ oba dołączyć sam aparat języka VBA.

W przykładzie zastosowano plik statyczny tekst dla modułu kodu, który jest wstawiany do programu Excel. Warto rozważyć przeniesienie kod do pliku zasobu, który można skompilować w aplikacji, a następnie wyodrębnij do pliku tymczasowego, gdy są potrzebne w czasie wykonywania. Spowodowałoby łatwiejsze w obsłudze dla redystrybucji projektu.

Począwszy od pakietu Microsoft Office XP, użytkownik musi udzielić dostępu do modelu obiektu języka VBA przed dowolnego kodu automatyzacji zapisywane do manipulowania VBA będzie działać. Jest to nowa funkcja zabezpieczeń z pakietem Office XP. Aby uzyskać więcej informacji zobacz następujący artykuł bazy wiedzy Knowledge base:
282830 odmowa programistyczny dostęp do projektu VBA pakietu Office XP

Kroki w celu tworzenia przykładu

  1. Najpierw należy utworzyć nowy plik tekstowy o nazwie KbTest.bas (bez rozszerzenia .txt). Jest moduł kodu, który będzie wstawić do programu Excel w czasie wykonywania.
  2. W pliku tekstowym należy dodać następujące wiersze kodu:
       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. Zapisz plik tekstowy do katalogu C:\KbTest.bas, a następnie zamknij plik.
  4. Uruchom program Visual Basic i Utwórz projekt standard. Domyślnie utworzony zostanie formularz Form1.
  5. W menu Projekt kliknij polecenieodwołania, a następnie wybierz odpowiedni typ wersji biblioteki, dzięki czemu można użyć wczesnego wiązania do programu Excel.

    Na przykład wybierz jedną z następujących czynności:
    • Dla programu Microsoft Office Excel 2007 wybierz bibliotekę 12,0.
    • Dla programu Microsoft Office Excel 2003 wybierz bibliotekę 11.0.
    • Dla programu Microsoft Excel 2002 wybierz bibliotekę 10.0.
    • Dla programu Microsoft Excel 2000 wybierz bibliotekę 9.0.
    • Dla programu Microsoft Excel 97 wybierz bibliotekę 8.0.
  6. Dodaj przycisk do formularza Form1 i umieść następujący kod w procedurze obsługi dla zdarzenia Click przycisku:
       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. W programie Excel 2002 i nowszych wersjach programu Excel należy włączyć dostęp do projektu VBA. Aby to zrobić, użyj jednej z następujących metod:
    • W programie Excel 2007 kliknij Przycisk pakietu Microsoft Office, a następnie kliknij przycisk Opcje programu Excel. Kliknij pozycję Centrum zaufania, a następnie kliknij przycisk Ustawienia Centrum zaufania. Kliknij przycisk Ustawienia makr, kliknij, aby zaznaczyć pole wyboru Ufaj dostęp do modelu obiektowego projektu VBA , a następnie dwa razy kliknij przycisk OK .
    • W programie Excel 2003 i we wcześniejszych wersjach programu Excel wskaż polecenie makro w menu Narzędzia , a następnie kliknij kartę Zabezpieczenia. W oknie dialogowym zabezpieczeń kliknij kartę Zaufane źródła , a następnie kliknij, aby zaznaczyć pole wyboru Ufaj dostępowi do programu Visual Basic Project .
  8. Uruchom projekt języka Visual Basic.

Powiązane artykuły


Aby uzyskać więcej informacji dotyczących automatyzacji pakietu Office z programu Visual Basic odwiedź witrynę wsparcia rozwoju Office pod następującym adresem: