Ich habe ein relativ umfangreiches Projekt und möchte diesem eine eigene Excel-Instanz zugestehen. Dazu öffne ich es mit einem kurzen VB-Programm, welches das Kennwort zum Öffnen gleich mitgibt und die Makro-Sicherheitseinstellung übergeht (Dank nochmal an Nepumuk).
Um zu verhindern, dass aus dem Explorer fremde Excel-Dateien in der gleichen Excel-Instanz geöffnet werden, verwende ich folgenden Code:
Private Sub Workbook_Deactivate()
Dim n As String
If Workbooks.Count > 1 Then
Application.EnableEvents = False
With ActiveWorkbook
n = .FullName
.Close savechanges:=False
End With
Application.EnableEvents = True
Dim xlApp As Object
Set xlApp = CreateObject("Excel.Application")
On Error Resume Next
xlApp.Workbooks.Open Filename:=n
If Err.Number > 0 Then
xlApp.Quit
Else
xlApp.Application.Visible = True
End If
Set xlApp = Nothing
End If
End Sub
Der Code prüft beim Deaktivieren der Mappe, ob eine neue Mappe geöffnet wurde (Anzahl offener Mappen), schließt diese und öffnet sie anschließend in einer neuen Instanz. Das funktioniert soweit auch ganz gut.
Einziges Problem ist, das die evtl. vorhandene Workbook_Open()-Prozedur der fremden Mappe dabei zweimal ausgeführt wird (beim ersten Öffnen sowie beim erneuten Öffnen in einer neuen Instanz).
Nun hab ich mich ein wenig in Klassenprogrammiereung eingelesen: http://www.online-excel.de/excel/singsel_vba.php?f=51 (schon wieder ein Tip von Nepumuk in einem Thread weiter unten ;-) und frage mich nun, ob es möglich ist, das Öffnen fremder Mappen zu verhindern, ohne dass die Workbook_Open()-Prozedur der neu geöffneten Mappe ausgeführt wird.
In meinen Tests wird diese nämlich vor allen anderen Klassenevents (z.B. App_WorkbookOpen() ) ausgeführt, und somit habe ich scheinbar keine Chance, das Ausführen (ich dachte an EnableEvents = False) zu verhindern.
Weiß da vielleicht jemand Rat oder kann mir definitiv sagen: nee, vergiss es, nicht möglich?
Gruß Matthias