Zusammenfassung
Beim Automatisieren eines Office-Produkts aus Visual Basic kann es sinnvoll sein, einen Teil des Codes in ein Microsoft Visual Basic for Applications (VBA)-Modul zu verschieben, das im Prozessbereich des Servers ausgeführt werden kann. Dies kann die Ausführungsgeschwindigkeit für Ihre Anwendung insgesamt erhöhen und Probleme beheben, wenn der Server nur dann eine Aktion ausführt, wenn ein Aufruf in Bearbeitung erfolgt.
Dieser Artikel veranschaulicht, wie Sie dynamisch ein VBA-Modul aus Visual Basic zu einer ausgeführten Office-Anwendung hinzufügen und dann das Makro aufrufen, um ein Arbeitsblatt in Bearbeitung auszufüllen.
Weitere Informationen
Das folgende Beispiel veranschaulicht das Einfügen eines Codemoduls in Microsoft Excel. Sie können jedoch dieselbe Vorgehensweise für Word und PowerPoint verwenden, da beide dasselbe VBA-Modul enthalten.
Im Beispiel wird eine statische Textdatei für das Codemodul verwendet, die in Excel eingefügt wird. Möglicherweise möchten Sie den Code in eine Ressourcendatei verschieben, die Sie in Ihre Anwendung kompilieren und dann zur Laufzeit bei Bedarf in eine temporäre Datei extrahieren können. Dies würde das Projekt für die Umverteilung überschaubarer machen.
Ab Microsoft Office XP muss ein Benutzer Zugriff auf das VBA-Objektmodell gewähren, damit ein Automatisierungscode, der zur Bearbeitung von VBA geschrieben wurde, funktioniert. Dies ist ein neues Sicherheitsfeature in Office XP. Weitere Informationen finden Sie im folgenden Knowledge Base-Artikel:
282830 Programmgesteuerter Zugriff auf Office XP VBA-Projekt verweigert
Schritte zum Erstellen des Beispiels
Erstellen Sie zunächst eine neue Textdatei mit dem Namen "KbTest.bas" (ohne die Erweiterung ".txt". Dies ist das Codemodul, das zur Laufzeit in Excel eingefügt wird.
Fügen Sie in der Textdatei die folgenden Codezeilen hinzu:
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 SubSpeichern Sie die Textdatei im Verzeichnis C:\KbTest.bas, und schließen Sie dann die Datei.
Starten Sie Visual Basic, und erstellen Sie ein Standardprojekt. Form1 wird standardmäßig erstellt.
Klicken Sie im Menü Projekt auf Verweise, und wählen Sie dann die entsprechendeTypbibliotheksversion aus, die Ihnen die frühe Bindung an Excel ermöglicht.
Wählen Sie beispielsweise eine der folgenden Optionen aus:
- Wählen Sie für Microsoft Office Excel 2007 die Bibliothek 12.0 aus.
- Wählen Sie für Microsoft Office Excel 2003 die 11.0-Bibliothek aus.
- Wählen Sie für Microsoft Excel 2002 die Bibliothek 10.0 aus.
- Wählen Sie für Microsoft Excel 2000 die 9.0-Bibliothek aus.
- Wählen Sie für Microsoft Excel 97 die 8.0-Bibliothek aus.
Fügen Sie Form1 eine Schaltfläche hinzu, und platzieren Sie den folgenden Code im Handler für das Click-Ereignis der Schaltfläche:
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 SubFür Excel 2002 und für neuere Versionen von Excel müssen Sie den Zugriff auf das VBA-Projekt aktivieren. Wenden Sie hierzu eine der folgenden Methoden an:
- Klicken Sie in Excel 2007 auf die Microsoft Office-Schaltfläche und dann auf "Excel-Optionen". Klicken Sie auf Trust Center und dann auf Einstellungen für das Trust Center. Klicken Sie auf "Makroeinstellungen", aktivieren Sie das Kontrollkästchen "Zugriff auf das VBA-Projektobjektmodell vertrauen " und klicken Sie dann zweimal auf OK .
- Zeigen Sie in Excel 2003 und in früheren Excel-Versionen im Menü Extras auf Makro, und klicken Sie dann auf Sicherheit. Klicken Sie im Dialogfeld "Sicherheit " auf die Registerkarte "Vertrauenswürdige Quellen ", und aktivieren Sie dann das Kontrollkästchen "Zugriff auf Visual Basic Project vertrauen ".
Führen Sie das Visual Basic-Projekt aus.
Referenzmaterial
Weitere Informationen zur Automatisierung von Office gegenüber Visual Basic finden Sie auf der Office Development Support-Website unter der folgenden Adresse: