Office Logo VBA Klicken für Hauptseite von "The SOSCQ Page"   Klicken für Hauptseite von "The SOSCQ Page - VBA/VB-Codebeispiele" Klicken für Startseite von 'xlam - Excel and more!'

Prüfen, ob eine Datei existiert

.Beschreibung
Die nachfolgend vorgestellten Codebeispiele überprüfen, ob eine bestimmte Datei vorhanden ist.

» Im Codebeispiel #1 wird die Existenz einer Arbeitsmappendatei überprüft. Das Vorhandensein der Datei im angegebenen Verzeichnis wird mit einer entsprechenden Meldung angezeigt. Natürlich kann man anstelle einer Arbeitsmappendatei (xls-Datei) auch einen beliebigen anderen Dateityp verwenden werden.

» Das Beispiel #2 zeigt, wie der für die Überprüfung benötigte Programmcode als Funktion gekapselt werden kann. Dadurch kann man die Routine an verschiedenen Stellen im VBA-Programm aufrufen. Die Anweisung On Error Resume Next verhindert, dass innerhalb der Funktion Laufzeitfehler auftreten. Im Falle eines Fehlers gibt die Funktion generell ihren Default-Rückgabewert False zurück. Beispielsweise tritt der Laufzeitfehler 68 "Gerät nicht verfügbar" auf, wenn der angegebene Dateipfad auf ein nicht vorhandenes Laufwerk zeigt.

.VBA-Code #1
Public Sub CheckIfFileExists()
  If Dir("C:\Daten\MeineMappe.xls") <> "" Then
    MsgBox "Die Datei existiert."
  Else
    MsgBox "Die Datei existiert nicht."
  End If
End Sub

.VBA-Code #2
Public Function FileExists(ByVal strFile As String) As Boolean
  On Error Resume Next
  FileExists = IIf(Dir(strFile) <> "", True, False)
End Function

'*** Aufruf ***
Sub TestCall()
  If FileExists("C:\Daten\MeineMappe.xls") = True Then
    MsgBox "Die Datei existiert."
  Else
    MsgBox "Die Datei existiert nicht."
  End If
End Sub

.Hinweis
Die Dir-Funktion verfügt über ein Argument namens Attribute. Wird dieses Argument weggelassen, so werden verborgene Dateien nicht berücksichtigt. In diesem Fall würde die vorgenommene Existenzprüfung die Meldung "Die Datei existiert nicht" ergeben. Wenn sowohl 'gewöhnliche' als auch verborgene Dateien berücksichtigt werden sollen, muss die Konstante vbHidden angegeben werden:

  If Dir("C:\Daten\MeineMappe.xls", vbHidden) <> "" Then

Die obige Codezeile prüft korrekt die Existenz der Datei "MeineMappe.xls", welche verborgen sein könnte.

Beachten Sie bitte, dass das Pfadname-Argument der Dir-Funktion auch eine leere Zeichenfolge ("") akzeptiert. Wird eine leere Zeichenfolge übergeben, gibt Dir eine Datei des aktuellen Verzeichnisses zurück. Dieses kann mit der VBA-Funktion CurDir abgefragt und mit ChDir gewechselt werden. Liegen im aktuellen Verzeichnis mehrere Dateien, so wird der Dateiname von irgendeiner dieser Dateien zurückgegeben. Gewöhnlich ist es der Name der ersten Datei (nach Alphabet); es muss aber nicht unbedingt der Fall sein.

Das folgende Beispiel prüft, ob die im Eingabefeld TextBox1 eingetragene Datei vorhanden ist. Wenn das Eingabefeld leer ist, wird der Name einer im aktuellen Verzeichnis abgelegten Datei ausgegeben. Enthält das aktuelle Verzeichnis keine Dateien, so wird eine Meldung ohne Text angezeigt (die Variable strFileNameCheck enthält die leere Zeichenfolge "").

.VBA-Code #3
Public Sub TestFileExists()
  Dim strFileNameUser As String
  Dim strFileNameCheck As String
  strFileNameUser = TextBox1.Text
  strFileNameCheck = Dir(strFileNameUser, vbHidden)
  MsgBox strFileNameCheck
End Sub

Weitere Informationen

Bekannte Probleme in VBA: Verborgene Dateien werden von Dir ohne Attribute-Parameter nicht erkannt

VBA-Befehle und -Funktionen

 

Verwandte Codebeispiele

Prüfen, ob ein Ordner existiert

To Top


Datei öffnen-Dialog anzeigen

.Beschreibung
Es existiert eine Vielzahl verschiedener Möglichkeiten, wie man in Microsoft Excel den "Datei öffnen"-Dialog aufrufen kann. Welche Lösungsvariante man schliesslich verwendet, kommt ganz auf den Verwendungszweck der im Dialogfenster ausgewählten Datei an. Einige Lösungsvarianten öffnen automatisch die selektierte Datei, sobald der Benutzer auf die "Öffnen"-Schaltfläche klickt. Andere Lösungsvarianten dagegen liefern lediglich den Dateipfad der selektieren Datei.

 

Dialogs-Auflistung mit Konstante xlDialogOpen

Dialogs-Auflistung mit Konstante xlDialogFindFile

FindFile-Methode von Application

GetOpenFilename-Methode von Application

GetOpenFileName-Funktion

 

"Öffnen"-Dialogfenster von Microsoft Excel lässt sich komfortabel via Dialogs-Auflistung unter Verwendung der Konstante xlDialogOpen einblenden.

.VBA-Code #1
Public Sub ShowOpenDialog1()
  Application.Dialogs(xlDialogOpen).Show
End Sub

.VBA-Code #2
Public Sub ShowOpenDialog2()
  Application.Dialogs(xlDialogOpen).Show arg1:="EineMappe.xls"
End Sub

.VBA-Code #3
Public Sub ShowOpenDialog3()
  If Application.Dialogs(xlDialogOpen).Show = True Then
    MsgBox "Benutzer hat 'Öffnen' geklickt.", vbInformation
  Else
    MsgBox "Benutzer hat 'Abbrechen' geklickt.", vbInformation
  End If
End Sub

.VBA-Code #4
Public Sub ShowOpenDialog4()
  Application.Dialogs(xlDialogFindFile).Show
End Sub

.VBA-Code #5
Public Sub ShowOpenDialog5()
  Application.FindFile
End Sub

.VBA-Code #6
Public Sub ShowOpenDialog6()
  If InStr(Application.Name, "Excel") > 0 Then
    Application.Dialogs(1).Show       '1=xlDialogOpen
  ElseIf InStr(Application.Name, "Word") > 0 Then
    Application.Dialogs(80).Show      '80=wdDialogFileOpen
  End If
End Sub

.VBA-Code #7
Public Sub ShowOpenDialog7()
  MsgBox Application.GetOpenFilename
End Sub

.VBA-Code #8
'Deklarationsbereich
Type OPENFILENAME
  lStructSize As Long
  hwndOwner As Long
  hInstance As Long
  lpstrFilter As String
  lpstrCustomFilter As String
  nMaxCustFilter As Long
  nFilterIndex As Long
  lpstrFile As String
  nMaxFile As Long
  lpstrFileTitle As String
  nMaxFileTitle As Long
  lpstrInitialDir As String
  lpstrTitle As String
  flags As Long
  nFileOffset As Integer
  nFileExtension As Integer
  lpstrDefExt As String
  lCustData As Long
  lpfnHook As Long
  lpTemplateName As String
End Type

Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long

'Codemodul
Public Sub ShowOpenDialog8()
  Dim udtOFN As OPENFILENAME
  Dim lngRC As Long
  Dim strFile As String
  With udtOFN
    .lStructSize = Len(udtOFN)
    '.hwndOwner = Application.VBE.MainWindow.hwnd
    '.hwndOwner = FindWindow("xlmain", Application.Caption)
    If Int(Val(Application.Version)) = 8 Then
      .hwndOwner = FindWindow("ThunderXFrame", vbNullString)
    Else
      .hwndOwner = FindWindow("ThunderDFrame", vbNullString)
    End If
    .lpstrFile = String(255, 0)
    .nMaxFile = 255
    .lpstrFileTitle = String(255, 0)
    .nMaxFileTitle = 255
    .lpstrTitle = "Öffnen"
    '.flags = 4 'Readonly-Checkbox verbergen
    'If a <> "" Then
    ' .lpstrFilter = UCase(a) & " - Dateien (*." & a & ")" & Chr$(0) & "*." & a & "" & Chr$(0)
    'End If
    '.lpstrFilter = .lpstrFilter & "Alle Dateien (*.*)" & Chr$(0) & "*.*" & Chr$(0)
    .lpstrFilter = "Alle Dateien (*.*)" & Chr$(0) & "*.*" & Chr$(0)
    'If Right$(StartDir, 1) <> "\" Then StartDir = StartDir & "\"
    '.lpstrInitialDir = StartDir
    lngRC = GetOpenFileName(udtOFN)
    If lngRC <> 0 Then
      strFile = Left$(.lpstrFile, InStr(1, .lpstrFile, Chr(0)) - 1)
      MsgBox strFile, vbInformation
    End If
  End With
End Sub

Weitere Informationen

Excel-Objektmodell: Methoden des Application-Objektes

 

Verwandte Codebeispiele

Datei öffnen-Dialog anzeigen und Pfad/Datei vorblenden

Datei über den Öffnen-Dialog auswählen und öffnen

Mehrere Dateien im Öffnen-Dialog selektieren und öffnen

To Top


Datei öffnen-Dialog anzeigen und Pfad/Datei vorblenden

.Beschreibung
Es existieren mehrere Möglichkeiten zum Öffnen einer Arbeitsmappe bzw. einer beliebigen Datei über den "Datei öffnen"-Dialog.

» Im ersten Beispiel ShowOpenDialog1 wird der Öffnen-Dialog eingeblendet, der Datentyp-Filter auf "*.xls" gesetzt und der Dateiname "MeineMappe.xls" vorgegeben.

» Das zweite Beispiel ShowOpenDialog2 öffnet den Öffnen-Dialog anhand der Dialogs-Auflistung unter Verwendung der Konstante xlDialogOpen, wobei der Dateipfad "C:\Daten\MeineMappe" als Dateiname und der Dateityp "Tabellen (*.xls)" vorgeblendet wird.

.VBA-Code #1
Public Sub ShowOpenDialog1()
  Workbooks.Open filename:=Application.GetOpenFilename("MeineMappe.xls", "Excel-Dateien (*.xls), *.xls")
End Sub

.VBA-Code #2
Public Sub ShowOpenDialog2()
  Application.Dialogs(xlDialogOpen).Show arg1:="C:\Daten\EineMappe.xls"
End Sub

.Hinweis
Bitte beachten Sie folgende Punkte:
- Das Dialogfeld xlDialogOpen besitzt mehrere Argumente. Das erste Argument arg1 besitzt die Bezeichnung "file_text" und enthält den im Dialogfenster vorzublendenden Dateinamen.
- Informationen über die verfügbaren Dialogs-Argumente finden Sie in der Excel VBA-Referenz im Kapitel "Listen der integrierten Dialogfeldargumente".

Weitere Informationen

Excel-Objektmodell: Methoden der Workbooks-Auflistung

Excel-Objektmodell: Methoden des Application-Objektes

 

Verwandte Codebeispiele

Datei öffnen-Dialog anzeigen

Mehrere Dateien im Öffnen-Dialog selektieren und öffnen

To Top


Mehrere Dateien im Öffnen-Dialog selektieren und öffnen

.Beschreibung
Dieses Makro blendet das Öffnen-Dialogfenster ein, in welchem der Benutzer gleich mehrere Dateien markieren und anschliessend öffnen kann. Das Parameter-Argument True bei der GetOpenFilename-Methode bedeutet, dass die Möglichkeit der Mehrfachselektion MultiSelect im Datei öffnen-Dialog zu aktivieren ist.

.VBA-Code
Public Sub ChooseMultipleFiles()
  Dim intCounter As Integer

  Dim varFileNames As Variant
  varFileNames = Application.GetOpenFilename(, , , , True)
  intCounter = 1
  While intCounter <= UBound(varFileNames)
    Workbooks.Open varFileNames(intCounter)
    MsgBox varFileNames(intCounter)
    intCounter = intCounter + 1
  Wend
End Sub

Weitere Informationen

Excel-Objektmodell: Methoden des Application-Objektes

 

Verwandte Codebeispiele

Datei öffnen-Dialog anzeigen

Datei öffnen-Dialog anzeigen und Pfad/Datei vorblenden

Datei über den Öffnen-Dialog auswählen und öffnen

To Top


Datei über den Öffnen-Dialog auswählen und öffnen

.Beschreibung
Es existieren zahlreiche Möglichkeiten zum Öffnen einer Arbeitsmappe bzw. einer beliebigen Datei über den "Datei öffnen"-Dialog. Nachfolgend sechs verschiedene Varianten:

» Das erste VBA-Beispiel OpenFile1 zeigt das "Datei öffnen"-Dialogfenster, in welchem der Benutzer die zu öffnende Datei auswählen kann.

» Das zweite Beispiel OpenFile2 öffnet ebenfalls den Öffnen-Dialog, wobei der Datentyp-Filter auf "*.xls" gesetzt wird. Es wird kein Dateiname vorgeblendet.

» Im dritten Beispiel OpenFile3 wird der Öffnen-Dialog eingeblendet, der Datentyp-Filter auf "*.xls" gesetzt und der Dateiname "MeineMappe.xls" vorgegeben.

» Im vierten Beispiel OpenFile4 wird mit FindFile der Öffnen-Dialog (bzw. der Datei suchen-Dialog) angezeigt. Diese Variante sollten Sie möglichst nicht verwenden; oder nur dann, wenn Sie dem Benutzer lediglich den Öffnen-Dialog präsentieren wollen, aber nicht wissen müssen, welche Datei der Benutzer öffnet beziehungsweise ob er überhaupt eine Datei öffnet und nicht die Abbrechen-Schaltfläche des Dialogfensters klickt.

» Das fünfte Beispiel OpenFile5 öffnet den Öffnen-Dialog anhand der Dialogs-Auflistung unter Verwendung der Konstante xlDialogOpen, wobei "MeineMappe" als Dateiname vorgeblendet und der Dateityp "Tabellen (*.xls)" eingestellt wird.

» Das Codebeispiel OpenFile6 zeigt den Öffnen-Dialog (bzw. den Datei suchen-Dialog) anhand der Dialogs-Auflistung unter Verwendung der Konstante xlDialogFindFile. Beachten Sie bitte, dass beim Datei suchen-Dialogfeld keine Argumente angegeben werden können.

.VBA-Code #1
Public Sub OpenFile1()
  Workbooks.Open filename:=Application.GetOpenFilename
End Sub

.VBA-Code #2
Public Sub OpenFile2()
  Workbooks.Open filename:=Application.GetOpenFilename("Excel-Dateien (*.xls), *.xls")
End Sub

.VBA-Code #3
Public Sub OpenFile3()
  Workbooks.Open filename:=Application.GetOpenFilename("MeineMappe.xls", "Excel-Dateien (*.xls), *.xls")
End Sub

.VBA-Code #4
Public Sub OpenFile4()
  Application.FindFile
End Sub

.VBA-Code #5
Public Sub OpenFile5()
  Application.Dialogs(xlDialogOpen).Show arg1:="EineMappe.xls"
End Sub

.VBA-Code #6
Public Sub OpenFile6()
  Application.Dialogs(xlDialogFindFile).Show
End Sub

.Hinweis
Bitte beachten Sie folgende Punkte:
- Das Dialogfeld xlDialogOpen besitzt mehrere Argumente. Das erste Argument arg1 besitzt die Bezeichnung "file_text" und enthält den im Dialogfenster vorzublendenden Dateinamen.
- Das Dialogfeld xlDialogFindFile besitzt keine Argumente. Die Verwendung von "arg1:=<x>" ist daher nicht möglich.
- Informationen über die verfügbaren Dialogs-Argumente finden Sie in der Excel VBA-Referenz im Kapitel "Listen der integrierten Dialogfeldargumente".

Weitere Informationen

Excel-Objektmodell: Methoden der Workbooks-Auflistung

Excel-Objektmodell: Methoden des Application-Objektes

 

Verwandte Codebeispiele

Datei öffnen-Dialog anzeigen

Datei öffnen-Dialog anzeigen und Pfad/Datei vorblenden

Mehrere Dateien im Öffnen-Dialog selektieren und öffnen

To Top


Arbeitsmappe öffnen

.Beschreibung
Eine Arbeitsmappe wird gewöhnlich mit der Open-Methode des Workbooks-Auflistungsobjektes geöffnet. Abgesehen davon gibt es mehrere andere, ganz unterschiedliche Möglichkeiten, wie man eine Mappe öffnen kann. Nachfolgend werden sämtliche Varianten vorgestellt.

» Das Codebeispiel #1 öffnet die Arbeitsmappe "MeineMappe.xls" mit Standard-Einstellungen. Der Argumentname "Filename:=" kann auch weggelassen werden. Die Open-Methode akzeptiert auch relative Pfade, UNC-Pfade und File URLs.

» Das zweite Beispiel öffnet die Arbeitsmappe, wobei die Rückfrage "Externe Verknüpfungen aktualisieren" unterdrückt wird und durch das Setzen des UpdateLinks-Parameters auf 0 die Verknüpfungen nicht aktualisiert werden (anstelle von 0 kann man auch False angeben).

» Im dritten Beispiel OpenWorkbook3 wird die Arbeitsmappe schreibgeschützt geöffnet (read-only), was durch Setzen von ReadOnly auf True erreicht wird.

» Im Beispiel OpenWorkbook4 wird die Arbeitsmappe anhand der FollowHyperlink-Methode des Workbook-Objektes geöffnet. Der Effekt ist der gleiche wie bei der Open-Methode. Bedingung ist hier allerdings, dass es eine aktive Arbeitsmappe gibt bzw. mindestens eine Mappe geöffnet ist, wenn man Workbooks(x) verwenden möchte.

» Das Codebeispiel #5 sollte man sich gut anschauen, da es eine äusserst interessante Lösung zeigt. Es öffnet die Arbeitsmappe anhand der Run-Methode des Application-Objektes. Nach dem Dateinamen muss ein Ausrufezeichen '!' und irgend ein beliebiges Zeichen oder beliebiger Begriff stehen. Am besten verwenden Sie ein einzelnes Leerzeichen. Dieser Begriff steht eigentlich für den Namen eines Makros. Normalerweise wird Run zum Ausführen eines Makros eingesetzt, welches sich in der gleichen oder auch in einer anderen Arbeitsmappe befinden kann. Ist die angegebene Mappe (noch) nicht offen, wird sie automatisch geöffnet. Weil hier kein Makro ausgeführt werden soll und das nach dem Ausrufezeichen angegebene Makro garantiert nicht existiert (ein Leerzeichen ist als Makroname nicht erlaubt), wird die Anweisung On Error Resume Next benutzt, damit der Laufzeitfehler 1004 "Microsoft Excel kann das Makro <Datei!x> nicht finden" nicht auftritt.

Bitte beachten Sie, dass bei dieser Lösungsvariante die zu öffnende Arbeitsmappe nicht zur aktiven Mappe wird (ausser es gab vorher keine aktive Mappe). Das Arbeitsmappenfenster der zu öffnenden Mappe wird jedoch eingeblendet.

Wird nach dem Ausrufezeichen nichts angegeben (z.B. "C:\Daten\MeineMappe.xls!") oder nur der Dateiname geschrieben (z.B. "C:\Daten\MeineMappe.xls"), erscheint ebenfalls die Fehlermeldung "Microsoft Excel kann das Makro <Datei!x> nicht finden". Wenn die angegebene Datei nicht existiert, tritt der Laufzeitfehler 1004 "<Datei> wurde nicht gefunden. [...]" auf. Besitzt die angegebene Datei ein falsches Dateiformat (z.B. eine doc-Datei von Microsoft Word), dann wird der Laufzeitfehler 1004 "<Datei>: hat ein ungültiges Dateiformat" eingeblendet.

Wie oben erwähnt, wird die zu öffnende Arbeitsmappe nicht automatisch aktiviert (ausser sie ist nach dem Öffnen die einzige Arbeitsmappe mit sichtbarem Mappenfenster). Tatsächlich aber wird die Arbeitsmappe beim Öffnenvorgang kurzzeitig aktiviert und dann gleich deaktiviert. Dadurch werden die Workbook-Ereignisse ausgelöst und ausgeführt (ein Auto_Open-Makro dieser Mappe jedoch nicht). Obwohl die Arbeitsmappe schliesslich nicht die aktive Mappe ist, wird sie nach dem Öffnen kurz aktiviert und gleich wieder deaktiviert, wodurch sämtliche Ereignisse ausgelöst werden. Man kann dies verhindern, indem Ereignisse vorübergehend ausgeschaltet werden (Application.EnableEvents = False).

Beachten Sie unbedingt, dass nach Run immer etwas angegeben wird. Übergeben Sie nie eine leere Zeichenfolge oder überhaupt nichts. Microsoft Excel 97 würde in diesem Fall sofort mit einem Ausnahmefehler abstürzen (Dr. Watson lässt grüssen...). In Microsoft Excel 2000 und neuer existiert dieses Problem nicht mehr.

Weitere Informationen über Application.Run finden Sie im Codebeispiel "Arbeitsmappe öffnen ohne sie zu aktivieren".

» Codebeispiel #6: Dieser Programmcode sucht das Kombinationsfeld "Adresse" der Web-Symbolleiste. Das gesuchte Steuerelement besitzt die ID 1740. Anhand der Text-Eigenschaft wird der Dateiname der zu öffnenden Arbeitsmappe in das Feld eingetragen, wodurch die Datei automatisch geöffnet wird. Das explizite Bestätigen der Eingabe mittels Enter-Taste oder dergleichen ist nicht nötig. Der Dateipfad muss nicht zwingend als File URL angegeben werden. Die übliche Pfad-Schreibweise wird ebenfalls akzeptiert. Gewöhnliche Der VBA-Code funktioniert übrigens in allen gängigen Microsoft Office-Programmen (Excel, Word, PowerPoint etc.), und auch bei nicht eingeblendeter Web-Symbolleiste. Bitte beachten Sie, dass bei dieser Lösung der Makrovirus-Sicherheitshinweis eingeblendet wird, sofern die Einstellung "Makrovirus-Schutz" im Optionen-Dialog von Excel aktiviert (Microsoft Excel 97) beziehungsweise die Sicherheitsstufe nicht auf "Tief" eingestellt ist (ab Microsoft Excel 2000). Mehr darüber siehe Codebeispiel "Arbeitsmappe öffnen mit Anzeigen der Makrovirus-Warnmeldung".

» Bei Codebeispiel #7 wird die Arbeitsmappe anhand der GetObject-Funktion geöffnet. Da GetObject die angegebene Datei nicht automatisch als Arbeitsmappenfenster einblendet, muss dieses explizit sichtbar gemacht werden (Codezeile "wkbWorkbook.Windows(1).Visible = True"). Dadurch wird die Arbeitsmappe zudem zur aktiven Mappe.

» Das Codebeispiel #8 ist die kurze Variante von Codebeispiel #7.

Weitere Informationen über GetObject in Bezug auf Öffnen von Arbeitsmappe erhalten Sie im Codebeispiel "Arbeitsmappe mit ausgeblendetem Arbeitsmappenfenster öffnen".

.VBA-Code #1
Sub OpenWorkbook1()
  Workbooks.Open Filename:="C:\Daten\MeineMappe.xls"
End Sub

.VBA-Code #2
Sub OpenWorkbook2()
  Workbooks.Open Filename:="C:\Daten\MeineMappe.xls", UpdateLinks:=0
End Sub

.VBA-Code #3
Sub OpenWorkbook3()
  Workbooks.Open Filename:="C:\Daten\MeineMappe.xls", ReadOnly:=True
End Sub

.VBA-Code #4
Sub OpenWorkbook4()
  ActiveWorkbook.FollowHyperlink "C:\Daten\MeineMappe.xls"
End Sub

.VBA-Code #5
Sub OpenWorkbook5()
  On Error Resume Next
  Application.Run "C:\Daten\MeineMappe.xls! "
End Sub

.VBA-Code #6
Sub OpenWorkbook6()
  Application.CommandBars.FindControl(Id:=1740).Text = "file:///C:/Daten/MeineMappe.xls"
End Sub

.VBA-Code #7
Sub OpenWorkbook7()
  Dim wkbWorkbook As Workbook
  Set wkbWorkbook = GetObject("C:\Daten\MeineMappe.xls")
  wkbWorkbook.Windows(1).Visible = True
  Set wkbWorkbook = Nothing
End Sub

.VBA-Code #8
Sub OpenWorkbook8()
  GetObject("C:\Daten\MeineMappe.xls").Windows(1).Visible = True
End Sub

.Hinweis
Gemäss weit verbreiteter Meinung wird eine mit Open geöffnete Arbeitsmappe immer automatisch zur aktiven Mappe. Das stimmt wohl in den meisten Fällen, aber eben nicht immer. Wenn es sich um Mappe handelt, die in ausgeblendetem Zustand gespeichert wurde (Menübefehl Fenster/Ausblenden), so ist sie nach dem Öffnen ebenfalls wieder ausgeblendet. Eine ausgeblendete Mappe kann nie aktiv sein. Das bedeutet, dass diejenige Mappe, die vor Ausführung der "Workbooks.Open"-Anweisung aktiv war, auch danach noch aktiv ist. Das gleiche Verhalten trifft auch für Add-In-Dateien zu, die mittels Open geöffnet werden.

Wenn Sie verhindern möchten, dass die zu öffnende Arbeitsmappe automatisch zur aktiven Mappe wird, müssen Sie die Run-Methode verwenden, wie es im Codebeispiel #5 gezeigt wird.

Weitere Informationen

Excel-Objektmodell: Methoden der Workbooks-Auflistung

Hyperlinks

 

Verwandte Codebeispiele

Arbeitsmappe schreibgeschützt öffnen

Arbeitsmappe öffnen mit Anzeigen der Makrovirus-Warnmeldung

Arbeitsmappe öffnen ohne Ausführung von VBA-Code im Open-Ereignis

Arbeitsmappe öffnen ohne Ausführung des Auto_Open-Makros

Arbeitsmappe öffnen mit Ausführung des Auto_Open-Makros

Arbeitsmappe öffnen ohne sie zu aktivieren

Arbeitsmappe mit ausgeblendetem Arbeitsmappenfenster öffnen

Prüfen, ob eine Arbeitsmappe bereits geöffnet ist

Makro einer anderen Arbeitsmappe starten

To Top


Bereits geöffnete Arbeitsmappe erneut öffnen ohne "Änderungen gehen verloren"-Meldung

.Beschreibung
Eine bereits in der aktuellen Excel-Sitzung geöffnete Arbeitsmappe kann gleich wie eine geschlossene Mappe anhand der Open-Methode der Workbooks-Auflistung (erneut) geöffnet werden. Wenn Sie keine Änderungen in der geöffneten Mappe vorgenommen haben und dann diese Mappe erneut öffnen, wird automatisch die geöffnete Mappe geschlossen und neu vom Datenträger geladen. Wenn die Arbeitsmappe jedoch noch nicht gespeicherte Änderungen enthält, erscheint vor dem Öffnen die Hinweismeldung, dass die Datei bereits geöffnet sei und beim erneuten Öffnen alle Änderungen verloren gingen. Der Benutzer kann dann wählen, ob der Öffnen-Vorgang abgebrochen werden soll. Damit diese Rückfrage nicht erscheint, müssen die Systemmeldungen von Microsoft Excel anhand der Eigenschaft DisplayAlerts vorübergehend deaktiviert werden.

.VBA-Code
Sub ReopenWorkbook()
  Application.DisplayAlerts = False
  Workbooks.Open "C:\Daten\MeineMappe.xls"
  Application.DisplayAlerts = True
End Sub

To Top


Prüfen, ob eine Arbeitsmappe bereits geöffnet ist

.Beschreibung
Diese Codebeispiele zeigen, wie man überprüfen kann, ob eine Arbeitsmappe in der aktuellen Excel-Sitzung geöffnet ist.

» Die in Codebeispiel #1 vorgestellte Funktion CheckIfOpen prüft, ob eine bestimmte Arbeitsmappe bereits geöffnet ist. Dazu wird das Workbooks-Auflistungsobjekt, in welchem alle geöffneten Arbeitsmappen registriert sind, durchlaufen und jedes Element der Auflistung mit dem gesuchten Arbeitsmappennamen verglichen. Wird eine Übereinstimmung gefunden, so ist die Arbeitsmappe bereits geöffnet.

» Das Beispiel #2 zeigt einen komplett anderen Ansatz: Hier wird einfach eine Objektreferenz auf die gesuchte Mappe angelegt. Schlägt dieser Vorgang fehl, wird der Laufzeitfehler 9 ausgelöst, was bedeutet, dass die Mappe nicht in der aktuellen Excel-Sitzung geöffnet ist. Die Laufzeitfehler werden mit On Error Resume Next abgefangen und anschliessend ausgewertet.

.VBA-Code #1
Public Function CheckIfOpen(strFilename As String) As Boolean
  Dim wbkWorkbook As Workbook
  For Each wbkWorkbook In Application.Workbooks
    If UCase(wbkWorkbook.Name) = UCase(strFilename) Then
      CheckIfOpen = True
      Exit Function
    End If
  Next wbkWorkbook
  CheckIfOpen = False
End Function

'*** Aufruf ***
Sub TestCall()
  If CheckIfOpen("MeineMappe.xls") Then
    MsgBox "Die Mappe ist in dieser Excel-Sitzung geöffnet."
  Else
    MsgBox "Die Mappe ist in dieser Excel-Sitzung nicht geöffnet."
  End If
End Sub

.VBA-Code #2
Sub CheckIfBookIsOpen()
  Dim wkbWorkbook As Workbook
  On Error Resume Next
  Set wkbWorkbook = Workbooks("MeineMappe.xls")
  If Err.Number = 9 Then
    MsgBox "Die Mappe ist in dieser Excel-Sitzung nicht geöffnet."
  ElseIf Err.Number <> 0 Then
    MsgBox "Ein Fehler ist aufgetreten."
  Else
    MsgBox "Die Mappe ist in dieser Excel-Sitzung geöffnet."
    Set wkbWorkbook = Nothing
  End If
End Sub

.Hinweis
Siehe auch Microsoft Knowledge Base-Artikel:
  XL2000: For Each Loop to Determine If an Excel Workbook Is Open
  http://support.microsoft.com/?kbid=213299

Verwandte Codebeispiele

Prüfen, ob eine Arbeitsmappen-Datei bereits in Benutzung ist

 

Weitere Informationen

Excel-Objektmodell: Eigenschaften des Workbook-Objektes

To Top


Prüfen, ob eine Arbeitsmappen-Datei bereits in Benutzung ist

.Beschreibung
Dieses Beispiel stellt eine Funktion vor, mit der überprüft werden kann, ob eine Arbeitsmappendatei bereits bearbeitet wird - egal ob in der aktuellen oder einer anderen Excel-Sitzung oder in einem anderen Programm. Dazu wird die Arbeitsmappendatei (d.h. die xls-Datei) mit der Open-Anweisung exklusiv im Lesezugriff-Modus geöffnet (For Input Lock Read) und dabei kontrolliert, ob der Laufzeitfehler 70 "Zugriff verweigert" auftritt. Dieser tritt auf, wenn sich die Datei in Bearbeitung befindet.

.Autor
Microsoft Support (Grössere Anpassungen durch Philipp von Wartburg)

Siehe auch MS KB-Artikel:
  XL97: Macro Code to Check Whether a File Is Already Open
  http://support.microsoft.com/?kbid=138621
  XL2000: Macro Code to Check Whether a File Is Already Open
  http://support.microsoft.com/?kbid=213383
  XL2002: Macro Code to Check Whether a File Is Already Open
  http://support.microsoft.com/?kbid=291295

.VBA-Code
Function IsFileOpen(strFileame As String) As Boolean
  Dim intErrorNum As Integer
  On Error Resume Next
  Open strFilename For Input Lock Read As #1
  Close #1
  intErrorNum = Err.Number
  On Error GoTo 0
  Select Case intErrorNum
    Case 0

      'Kein Fehler, also ist Datei nicht geöffnet
      IsFileOpen = False
    Case 70

      'Fehler "Zugriff verweigert", also ist Datei in Bearbeitung
      IsFileOpen = True
    Case Else

      'Anderer Fehler: Fehlermeldung anzeigen
      Error intErrorNum
  End Select
End Function

'*** Aufruf ***
Sub TestCall()
  If IsFileOpen("C:\Daten\MeineMappe.xls") Then
    MsgBox "Die Datei wird momentan bearbeitet."
  Else
    MsgBox "Die Datei wird momentan nicht bearbeitet."
  End If
End Sub

Verwandte Codebeispiele 

Prüfen, ob eine Arbeitsmappe bereits geöffnet ist

 

Weitere Informationen

VBA-Befehle und -Funktionen

VBA-Spezialthema: VBA-Laufzeitfehler

To Top


Prüfen, ob eine Datei schreibgeschützt ist

.Beschreibung
Die folgenden Beispiele prüfen, ob eine Datei das Schreibgeschützt-Attribut (read-only) besitzt. Anstelle einer xls-Datei kann selbstverständlich auch eine Datei mit einem anderen Dateityp wie beispielsweise doc, txt, exe usw. verwendet werden.

» Das Beispiel #1 benutzt die Konstante vbReadOnly, die anhand des logischen Operators And mit der GetAttr-Funktion verknüpft wird (es wird eine sogenannte logische Konjunktion durchgeführt).

» Im Codebeispiel #2 wird der von GetAttr ermittelte Wert durch 2 dividiert und dann anhand des Mod-Operators geprüft, ob der Rest der Division die Zahl 1 ergibt. Diese Art der Prüfung funktioniert in jedem Fall korrekt, weil die Summe der Attributwerte bei einer schreibgeschützten Datei nie ohne Rest durch 2 teilbar ist, egal welche sonstigen Attribute die Datei besitzt (Versteckt, System, Archiv etc.).

» Das dritte Beispiel zeigt, wie die Schreibgeschützt-Abfrage in eine separate Funktion verpackt werden kann (siehe auch Beschreibung von Codebeispiel #2).

.VBA-Code #1
Public Sub CheckReadOnly1()
  'Dateiattribut "Schreibgeschützt" der Datei abfragen
  If GetAttr("C:\MeineMappe.xls") And vbReadOnly Then
    MsgBox "Die Datei ist schreibgeschützt."
  Else
    MsgBox "Die Datei ist nicht schreibgeschützt."
  End If
End Sub

.VBA-Code #2
Public Sub CheckReadOnly2()
  'Dateiattribut "Schreibgeschützt" der Datei abfragen
  If GetAttr("C:\MeineMappe.xls") Mod 2 = 1 Then
    MsgBox "Die Datei ist schreibgeschützt."
  Else
    MsgBox "Die Datei ist nicht schreibgeschützt."
  End If
End Sub

.VBA-Code #3
Public Function CheckReadOnly3(strFile As String) As Boolean
  'Dateiattribut "Schreibgeschützt" der Datei abfragen
  CheckReadOnly3 = GetAttr(strFile) And vbReadOnly

  ' - oder -
  CheckReadOnly3 = GetAttr(strFile) Mod 2 = 1
End Sub

'*** Aufruf ***
Sub TestCall()
  If CheckReadOnly3("C:\MeineMappe.xls") Then
    MsgBox "Die Datei ist schreibgeschützt."
  Else
    MsgBox "Die Datei ist nicht schreibgeschützt."
  End If
End Sub

Weitere Informationen

VBA-Befehle und -Funktionen

 

Verwandte Codebeispiele 

Prüfen, ob die aktive Arbeitsmappe schreibgeschützt geöffnet wurde

To Top


Prüfen, ob die aktive Arbeitsmappe schreibgeschützt geöffnet wurde

.Beschreibung
Wird in Microsoft Excel eine Arbeitsmappe schreibgeschützt geöffnet, so erscheint im Fenstertitel des Mappenfensters der Hinweis "[Schreibgeschützt]". In einem VBA-Programm kann man den Schreibschutz anhand der ReadOnly-Eigenschaft des Workbook-Objektes abfragen. Das nachstehende Codebeispiel zeigt, wie dies gemacht wird.

Eine Arbeitsmappe wird schreibgeschützt geöffnet, wenn man sie explizit über den Menübefehl "Schreibgeschützt öffnen" öffnet, wenn die Datei selbst schreibgeschützt ist (das Dateiattribut "Schreibgeschützt" ist aktiviert), wenn man als Benutzer nicht über die Berechtigung "Schreiben" für die Datei verfügt, wenn sie beim Excelstart mit dem Parameter "/r" geöffnet wurde oder wenn sie bereits von einem anderen Benutzer bearbeitet wird und dann im Dialog "Dateireservierung" die Schaltfläche "Schreibgeschützt" angeklickt wird.

.VBA-Code
Sub CheckIfOpenedAsReadOnly()
  If ActiveWorkbook.ReadOnly = True Then
    MsgBox "Mappe wurde schreibgeschützt geöffnet."
  Else
    MsgBox "Mappe wurde nicht schreibgeschützt geöffnet."
  End If
End Sub

Weitere Informationen

Excel-Objektmodell: Eigenschaften des Workbook-Objektes

Excel-Startparameter

 

Verwandte Codebeispiele

Prüfen, ob eine Datei schreibgeschützt ist

Prüfen, ob ein Ordner schreibgeschützt ist

Arbeitsmappe schreibgeschützt öffnen

Arbeitsmappe schreibgeschützt öffnen und in die Benachrichtigungsliste eintragen

Arbeitsmappe mit Schreibschutzkennwort öffnen

Neueste Version einer schreibgeschützt geöffneten Arbeitsmappe laden

Prüfen, ob eine Arbeitsmappe ein Schreibschutzkennwort verwendet

To Top


Arbeitsmappe öffnen ohne Ausführung von VBA-Code im Open-Ereignis

.Beschreibung
Durch das Deaktivieren der Ereignisse wird erreicht, dass beim Öffnen einer anderen Arbeitsmappe der im Workbook_Open-Ereignis der Mappe enthaltene Programmcode nicht ausgeführt wird. Beachten Sie unbedingt, dass mit der hier vorgestellten Lösung sämtliche Ereignisse deaktiviert werden. Das bedeutet, dass Programmcode, der sich in den Ereignissen der aktiven Mappe befindet (und nicht in der zu öffnenden), ebenfalls nicht abgearbeitet wird. Falls die aktive Arbeitsmappe VBA-Code in der Ereignisprozedur Workbook_Deactivate oder Workbook_WindowDeactivate enthält, so wird dieser nicht ausgeführt, wenn die andere Arbeitsmappe geöffnet wird. Diese Ereignisse enthalten bei Excel-Anwendungen vielfach Programmcode zur Steuerung beziehungsweise Sperrung der durch die Anwendung erstellten Symbolleisten und deren Schaltflächen. Bei deaktivierten Ereignissen würden diese Symbolleisten nicht korrekt behandelt, sprich sie wären trotz Öffnen und Aktivierung einer anderen Mappe weiterhin verfügbar.

.VBA-Code
Sub OpenWorkbookWithoutEvents()
  Application.EnableEvents = False
  Workbooks.Open "C:\Daten\MeineMappe.xls"
  Application.EnableEvents = True
End Sub

.Hinweis
Unmittelbar nach dem Öffnen der Arbeitsmappe sollten - wie das obige Beispiel zeigt und in der Beschreibung erläutert wurde - die Ereignisse wieder aktiviert werden.

Beachten Sie bitte, dass ein in der Arbeitsmappe enthaltenes Auto_Open-Makro nie ausgeführt wird, wenn die Mappe mittels VBA-Programmcode geöffnet wird.

Verwandte Codebeispiele

Arbeitsmappe öffnen ohne Ausführung des Auto_Open-Makros

Arbeitsmappe öffnen mit Ausführung des Auto_Open-Makros

Neue Arbeitsmappe anlegen und automatisch Open-Ereignisprozedur einfügen

To Top


Arbeitsmappe öffnen ohne Ausführung des Auto_Open-Makros

.Beschreibung
Im Gegensatz zu den Ereignis-Prozeduren in einer Arbeitsmappe wird beim Öffnen mittels VBA-Programmcode das Auto_Open-Makro nie ausgeführt. Wenn Sie also eine Arbeitsmappe öffnen möchten, ohne dass das in der Mappe enthaltene Auto_Open-Makro ausgeführt wird, können Sie ganz einfach die Open-Methode der Workbooks-Auflistung benutzen.

.VBA-Code
Sub OpenWorkbookWithoutAutoOpenMacro()
  Workbooks.Open "C:\Daten\MeineMappe.xls"
End Sub

Verwandte Codebeispiele

Arbeitsmappe öffnen mit Ausführung des Auto_Open-Makros

Arbeitsmappe öffnen ohne Ausführung von VBA-Code im Open-Ereignis

To Top


Arbeitsmappe öffnen mit Ausführung des Auto_Open-Makros

.Beschreibung
Weil beim Öffnen einer Arbeitsmappe mittels VBA-Programmcode das Auto_Open-Makro nie ausgeführt wird, muss man es explizit aufrufen. Dies geschieht mit der RunAutoMacros-Methode des Workbook-Objektes. Als Parameter wird die Konstante xlAutoOpen übergeben (oder die Zahl 1). Es tritt kein Laufzeitfehler auf, wenn die Arbeitsmappe kein Auto_Open-Makro enthält.

» Das Codebeispiel #1 stellt die einfachste Lösungsvariante dar und sollte eigentlich nicht verwendet werden. Das Beispiel soll lediglich zeigen, wie das Auto_Open-Makro aufgerufen wird. Das Problem bei diesem Programmcode ist, dass, wenn die andere Mappe zwar geöffnet werden kann aber sie nicht automatisch zur aktiven Mappe wird (zum Beispiel wenn ihr Arbeitsmappenfenster ausgeblendet ist), dass das falsche Auto_Open-Makro ausgeführt wird; nämlich dasjeniger der bisher aktiven Arbeitsmappe.

» Bei Codebeispiel #2 wird das in Beispiel #1 vorhandene Problem durch Verwenden einer Objektvariable für das Workbook-Objekt umgangen (Variable wkbWorkbook). Da RunAutoMacros nicht von ActiveWorkbook sondern von wkbWorkbook aufgerufen wird, wird das korrekte Auto_Open-Makro ausgeführt.

» Das Beispiel #3 zeigt die beste Lösung. Hier wird das Auto_Open-Makro der anderen Arbeitsmappe nur dann aufgerufen, wenn diese auch wirklich geöffnet werden konnte.

» Das Codebeispiel #4 verwendet einen ganz anderen Lösungsansatz. Die Arbeitsmappe wird nicht mit Open sondern mit der Run-Methode des Application-Objektes geöffnet. Dieser wird der vollständige Dateiname der Mappe sowie - getrennt durch ein Ausrufezeichen - der Name des auszuführenden Makros Auto_Open übergeben. Beachten Sie bitte, dass der Dateipfad zwingend in Hochkommas geschrieben werden muss. Anderenfalls tritt der Laufzeitfehler 1004 "Microsoft Excel kann das Makro <Datei!Makro> nicht finden".

- Die Mappe wird nicht zur aktiven Arbeitsmappe! Ereignisse werden ausgelöst.
- Laufzeitfehler 1004, wenn die Mappe nicht geöffnet werden konnte.

» Codebeispiel #5 ist eine erweiterte Variante von Beispiel #4.

.VBA-Code #1
Sub OpenWorkbookWithAutoOpenMacro1()
  Workbooks.Open "C:\Daten\MeineMappe.xls"

  ActiveWorkbook.RunAutoMacros xlAutoOpen
End Sub

.VBA-Code #2
Sub OpenWorkbookWithAutoOpenMacro2()
  Dim wkbWorkbook As Workbook
  Set wkbWorkbook = Workbooks.Open("C:\Daten\MeineMappe.xls")
  wkbWorkbook.RunAutoMacros xlAutoOpen
  Set wkbWorkbook = Nothing
End Sub

.VBA-Code #3
Sub OpenWorkbookWithAutoOpenMacro3()
  Dim wkbWorkbook As Workbook
  On Error Resume Next
  Set wkbWorkbook = Workbooks.Open("C:\Daten\MeineMappe.xls")
  If Err.Number = 1004 Then
    MsgBox "Die Arbeitsmappe konnte nicht geöffnet werden!", vbExclamation
  Else
    wkbWorkbook.RunAutoMacros xlAutoOpen
    Set wkbWorkbook = Nothing
  End If
End Sub

.VBA-Code #4
Sub OpenWorkbookWithAutoOpenMacro4()
  Application.Run "'C:\Daten\MeineMappe.xls'!Auto_Open"
End Sub

.VBA-Code #5
Sub OpenWorkbookWithAutoOpenMacro5()
  On Error Resume Next
  Application.Run "'C:\Daten\MeineMappe.xls'!Auto_Open"

  If Err.Number = 1004 And InStr(Err.Description, "!Auto_Open") > 0 Then
    MsgBox "Die Arbeitsmappe enthält kein Auto_Open-Makro.", vbInformation
  End If
End Sub

Verwandte Codebeispiele

Arbeitsmappe öffnen

Arbeitsmappe öffnen ohne Ausführung des Auto_Open-Makros

Arbeitsmappe öffnen ohne Ausführung von VBA-Code im Open-Ereignis

 

Weitere Informationen

Excel-Objektmodell: Methoden des Workbook-Objektes

To Top


Arbeitsmappe mit ausgeblendetem Arbeitsmappenfenster öffnen

.Beschreibung
Wenn man eine Arbeitsmappe mit der Open-Methode des Workbook-Objektes öffnet, erscheint sie in Microsoft Excel automatisch in einem Arbeitsmappenfenster. Auch andere Lösungsvarianten wie die Benutzung der FollowHyperlink-Methode verhindert die Anzeige des Fensters nicht. Trotzdem gibt es eine Möglichkeit, wie man verhindert, dass das Fenster bereits beim Öffnen der Arbeitsmappe ausgeblendet ist.

.VBA-Code #1
Sub OpenWorkbookWithHiddenWindow1()
  GetObject "C:\Daten\EineMappe.xls"
End Sub

.VBA-Code #2
Sub OpenWorkbookWithHiddenWindow2()
  Dim wkbWorkbook As Workbook
  Set wkbWorkbook = GetObject("C:\Daten\EineMappe.xls")
  Set wkbWorkbook = Nothing
End Sub

.Hinweis
Bitte beachten Sie, dass die zu öffnende Mappe nicht zur aktiven Arbeitsmappe wird. Dies, weil ausgeblendete Arbeitsmappen nie aktiv sein können.

Verwandte Codebeispiele

Arbeitsmappe öffnen

Arbeitsmappe öffnen ohne sie zu aktivieren

Arbeitsmappe öffnen mit Anzeigen der Makrovirus-Warnmeldung

To Top


Arbeitsmappe öffnen ohne sie zu aktivieren

.Beschreibung
Das Öffnen einer Arbeitsmappe hat gewöhnlich zur Folge, dass die Mappe automatisch zur aktiven Mappe wird. Einzige Ausnahme ist, wenn das Mappenfenster der Arbeitsmappe von vornerein ausgeblendet ist und dadurch beim Öffnen nicht sichtbar ist. Dazu muss die Arbeitsmappe allerdings bereits mit ausgeblendetem Fenster gespeichert worden sein, oder man verwendet die in Codebeispiel "Arbeitsmappe mit ausgeblendetem Arbeitsmappenfenster öffnen" vorgestellte Lösung. Wenn man jedoch möchte, dass die Arbeitsmappe mit eingeblendetem Fenster geöffnet wird, aber ohne die Mappe dabei zu aktivieren, kann man das hier vorgestellte Codebeispiel benutzen.

Wird nach dem Ausrufezeichen nichts angegeben (z.B. "C:\Daten\MeineMappe.xls!") oder nur der Dateiname (z.B. "C:\Daten\MeineMappe.xls") geschrieben, erscheint ebenfalls die Fehlermeldung "Microsoft Excel kann das Makro <Datei!x> nicht finden". Wenn die angegebene Datei nicht existiert, tritt der Laufzeitfehler 1004 "<Datei> wurde nicht gefunden. [...]" auf. Besitzt die angegebene Datei ein falsches Dateiformat (z.B. die doc-Datei eines Microsoft Word-Dokumentes), dann wird der Laufzeitfehler 1004 "<Datei>: hat ein ungültiges Dateiformat" eingeblendet.

Wie oben erwähnt, wird die zu öffnende Arbeitsmappe nicht automatisch aktiviert (ausser sie ist nach dem Öffnen die einzige Arbeitsmappe mit sichtbarem Mappenfenster). Tatsächlich aber wird die Arbeitsmappe beim Öffnenvorgang kurzzeitig aktiviert und dann gleich deaktiviert. Dadurch werden die Workbook-Ereignisse ausgelöst und ausgeführt (ein Auto_Open-Makro dieser Mappe jedoch nicht). Obwohl die Arbeitsmappe schlussendlich nicht die aktive Mappe ist, wird sie nach dem Öffnen kurz aktiviert und gleich wieder deaktiviert, wodurch sämtliche Ereignisse ausgelöst werden und der in den Ereignisprozeduren stehende VBA-Programmcode ausgeführt wird.

1. Open der neuen Mappe
2. WindowDeactivate der alten Mappe
3. Deactivate der alten Mappe
4. Activate der neuen Mappe
5. WindowActivate der neuen Mappe
6. WindowDeactivate der neuen Mappe
7. Deactivate der neuen Mappe
8. Activate der alten Mappe
9. WindowActivate der alten Mappe

Beachten Sie unbedingt, dass nach Run immer etwas angegeben wird. Übergeben Sie nie eine leere Zeichenfolge oder überhaupt nichts. Microsoft Excel 97 würde in diesem Fall sofort mit einem Ausnahmefehler abstürzen (Dr. Watson lässt grüssen...). In Microsoft Excel 2000 und neuer existiert dieses Problem nicht mehr.

Das Codebeispiel #2 macht das gleiche wie Beispiel #1 und soll lediglich deutlich machen, dass auch relative Pfade verwendet werden können.

.VBA-Code #1
Sub OpenWorkbookWithoutActivation1()
  Application.Run "C:\Daten\MeineMappe.xls! "
End Sub

.VBA-Code #2
Sub OpenWorkbookWithoutActivation2()
  Application.Run "..\MeineMappe.xls! "
End Sub

.Hinweis
Bitte beachten Sie, dass die zu öffnende Mappe nur dann nicht zur aktiven Arbeitsmappe wird, wenn es bereits eine andere Arbeitsmappe mit sichtbarem Mappenfenster gibt.

Verwandte Codebeispiele

Arbeitsmappe öffnen

Arbeitsmappe mit ausgeblendetem Arbeitsmappenfenster öffnen

Arbeitsmappe öffnen mit Anzeigen der Makrovirus-Warnmeldung

Makro einer anderen Arbeitsmappe starten

To Top


Ordner im Windows Explorer anzeigen

.Beschreibung
Die folgenden Codebeispiele zeigen, wie man den Windows Explorer öffnen und dabei einen bestimmten Ordner angezeigen kann.

» Das Beispiel #1 zeigt die bekannte Lösungsvariante mit der Shell-Funktion von VBA. Die Programmdatei "Explorer.exe" des Windows Explorers wird aufgerufen und in der Befehlszeile der Pfad des gewünschten Ordners angegeben.

» Das Codebeispiel #2 verwendet ebenfalls die Shell-Funktion von VBA, öffnet den Explorer aber wegen des Schalters "/e" in der Explorer-Ansicht (Verzeichnisbaum in der linken Fensterhälfte, auch Baumansicht genannt).

» Im Codebeispiel #3 wird die FollowHyperlink-Methode des Workbook-Objektes verwendet, was zum gleichen Ergebnis wie bei Beispiel #2 führt. Der Explorer zeigt also ebenfalls die Baumansicht mit dem Verzeichnisbaum auf der linken Seite.

.VBA-Code #1
Sub ShowWindowsExplorer1()
  Dim strFolder As String
  strFolder = "C:\Daten"
  Shell "Explorer.exe " & strFolder, vbNormalFocus
End Sub

.VBA-Code #2
Sub ShowWindowsExplorer2()
  Dim strFolder As String
  strFolder = "C:\Daten"
  Shell "Explorer.exe /e, " & strFolder, vbNormalFocus
End Sub

.VBA-Code #3
Sub ShowWindowsExplorer3()
  ActiveWorkbook.FollowHyperlink "C:\Daten"
End Sub

.Hinweis
Bitte beachten Sie, dass bei der Lösungsvariante mit Shell der Pfad des zu öffnenden Ordners ohne Anführungszeichen (") anzugeben ist, d.h. obwohl der Ordnername Leerzeichen enthält. Wenn der Ordner beispielsweise "C:\Meine Daten" heisst, sieht der VBA-Code wie folgt aus:

  Shell "Explorer.exe C:\Meine Daten", vbNormalFocus

Tipp! Tipp!
Viele weitere Codebeispiele zu diesem Thema gibt's unter "Windows Explorer starten".

Verwandte Codebeispiele

Windows Explorer starten

Datei im Windows Explorer anzeigen

Dateisuche des Windows Explorers anzeigen

 

Weitere Informationen

VBA-Befehle und -Funktionen

Hyperlinks

To Top


Ordner anlegen

.Beschreibung
Mit der VBA-Anweisung MkDir wird ein neues Verzeichnis bzw. ein neuer Ordner angelegt. Als Alternative kann man auch die Add-Methode von SubFolders oder die CreateFolder-Methode aus der FileSystemObject-Objektbibliothek verwenden.

» Das Beispiel #1 zeigt die üblich benutzte Variante, bei welcher der komplette Pfad des neuen Verzeichnisses bei MkDir angegeben wird.

» Im zweiten Beispiel wird nur der Verzeichnisname angegeben, wodurch das neue Verzeichnis im aktuellen Verzeichnis des aktuellen Laufwerkes angelegt wird (siehe auch Hinweis am Ende dieses Codebeispiels).

» Das Codebeispiel #3 verwendet die Add-Methode aus der FileSystemObject-Objektbibliothek zum Erstellen des neuen Ordners.

» Im Beispiel #4 wird die CreateFolder-Methode aus der FileSystemObject-Objektbibliothek benutzt.

.VBA-Code #1
Sub CreateDirectory1()
  MkDir "C:\Daten\NeuesVerzeichnis"
End Sub

.VBA-Code #2
Sub CreateDirectory2()
  MkDir "NeuesVerzeichnis"
End Sub

.VBA-Code #3
Sub CreateDirectory3()
  CreateObject("Scripting.FileSystemObject").GetFolder("C:\Daten").SubFolders.Add "NeuesVerzeichnis"
End Sub

.VBA-Code #4
Sub CreateDirectory4()
  CreateObject("Scripting.FileSystemObject").CreateFolder "C:\Daten\NeuesVerzeichnis"
End Sub

.Hinweis
Bitte beachten Sie, dass MkDir, CreateFolder und Add nicht in jeder Situation den gleichen Laufzeitfehler auslösen. Hier eine kleine Übersicht:

  Ordner existiert bereits * Mehrere Ordner angegeben * Keine Berechtigung vorhanden *
MkDir Laufzeitfehler 58
"Datei existiert bereits"
Laufzeitfehler 76
"Pfad nicht gefunden"
Laufzeitfehler 75
"Fehler beim Zugriff auf Pfad/Datei"
Add Laufzeitfehler 75
"Fehler beim Zugriff auf Pfad/Datei"
Laufzeitfehler 5
"Unzulässiger Prozeduraufruf oder ungültiges Argument"
Laufzeitfehler 70
"Zugriff verweigert"
CreateFolder Laufzeitfehler 75
"Fehler beim Zugriff auf Pfad/Datei"
Laufzeitfehler 76
"Pfad nicht gefunden"
Laufzeitfehler 70
"Zugriff verweigert"

* Erläuterungen:
  - Ordner existiert bereits: Der angegebene Ordner ist bereits vorhanden oder es existiert eine gleichnamige Datei.
  - Mehrere Ordner angegeben: Es wurde mehr als nur ein neuer Ordner angegeben (z.B. "NeuesVerzeichnis\Unterverzeichnis").
  - Keine Berechtigung vorhanden: Der Benutzer besitzt keine Berechtigung zum Erstellen eines Verzeichnis im angegebenen Pfad.

In der VBA-Referenz ist die Beschreibung der MkDir-Anweisung nicht ganz exakt. Dort steht nämlich, dass bei Weglassen des Laufwerkes das neue Verzeichnis auf dem aktuellen Laufwerk erstellt wird. Diese Aussage verleitet zur Annahme, dass beispielsweise die Codezeile

  MkDir "EinOrdner"

das Verzeichnis "EinOrdner" auf dem Laufwerk D: anlegt, falls D: das aktuelle Laufwerk ist. Dies stimmt jedoch nicht! Korrekt ist, dass das neue Verzeichnis im aktuellen Verzeichnis des aktuellen Laufwerkes erstellt wird. Die obige Codezeile erstellt das Verzeichnis "EinOrdner" beispielsweise im Verzeichnis "D:\Daten\Excel", wenn "D:\Daten\Excel" das aktuelle Verzeichnis ist, und eben nicht im Stammverzeichnis (sprich "D:\").

Mit der VBA-Funktion CurDir kann das aktuelle Verzeichnis ermittelt werden. Alternativ können Sie auch die GetAbsolutePathName-Methode des FileSystemObject-Objektes zum Herausfinden des aktuellen Verzeichnisses verwenden.

Verwandte Codebeispiele

Unterordner in einem Ordner anlegen

Ordner mit Unterordnern anlegen (Verzeichnisbaum)

 

Weitere Informationen

VBA-Befehle und -Funktionen

Relative Pfade

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Ordner mit Unterordnern anlegen (Verzeichnisbaum)

.Beschreibung
Es existieren drei verschiedene Möglichkeiten, wie man Ordner bzw. Unterordner mehrerer Ebenen in einem Arbeitsschritt anlegen kann. Die nachfolgenden fünf Codebeispiele stellen die diese drei Lösungsansätze vor.

» Codebeispiel #1: Hier wird die API-Funktion MakeSureDirectoryPathExists aus der Library "ImageHlp.dll" zum Erstellen eines einzelnen Verzeichnisses oder mehrerer Verzeichnisse (Verzeichnisbaum) benutzt. Bitte beachten Sie, dass im Pfad unbedingt ein Backslash '\' als letztes Zeichen angegeben werden muss. Anderenfalls wird der Pfad nicht angelegt (ohne Fehlermeldung).

» Codebeispiel #2: Die kleine Funktion CreateDirectoryTree verwendet ebenfalls die API-Funktion MakeSureDirectoryPathExists. Wenn die Funktion True zurückgibt, so wurde der gewünschte Pfad erfolgreich angelegt. Wenn der Pfad bereits existiert, wird ebenfalls True zurückgegeben.

» Codebeispiel #3: Diese Lösungsvariante benutzt den MS-DOS-Befehl MD (bzw. MKDIR), welcher in einem Konsolenfenster (Aufruf mit "CMD") ausgeführt wird. Dieser MS-DOS-Befehl erstellt ein Verzeichnis, wobei allfällige Zwischenverzeichnisse automatisch erzeugt werden. Der Nachteil dieser Lösung ist, dass keine Erfolgskontrolle stattfindet. Wenn beim Erstellen des Pfades ein Fehler auftritt, so erfahren Sie dies nicht.

» Codebeispiel #4: Dies ist die reine VBA-Lösung. Der zu erstellende Pfad wird in seine Einzel-Verzeichnisse aufgeteilt und diese innerhalb einer Do-Loop-Schleife anhand der MkDir-Anweisung nacheinander angelegt. Allfällige Fehler werden gemeldet. Sie erfahren jedoch nicht, ob der Pfad bereits existiert oder neu angelegt wurde.

» Codebeispiel #5: Dieses Beispiel verwendet den gleichen Ansatz wie Codebeispiel #4, nur dass hier der Programmcode als eine Funktion gekapselt ist. In der Funktion wird zusätzlich ermittelt, wie viele neue Ordner für den Pfad erstellt werden mussten. Der Funktion wird der anzulegende Pfad übergeben. Folgende Rückgabewerte werden von der Funktion zurückgegeben:
- 0, wenn ein Fehler aufgetreten ist
- -1, wenn der Pfad bereits existiert
- -2, wenn ein Ordner nicht angelegt werden konnte
- > 0, wenn der Pfad angelegt wurde (die zurückgegebene Zahl entspricht der Anzahl neu erstellter Ordner)

Der als Codebeispiel #5 vorgestellte VBA-Code stellt die beste Lösung dar, weil Sie hier erfahren, ob bzw. welche Fehler auftraten, ob der Pfad allenfalls bereits existierte und wie viele Ordner erstellt wurden (z.B. nützlich für statistische Zwecke).

.VBA-Code #1
'Deklarationsbereich
Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal DirPath As String) As Long

'Codemodul
Public Sub CreateTree()
  If MakeSureDirectoryPathExists("D:\Dir1\Dir2\Dir3\") <> 0 Then
    MsgBox "Der Pfad wurde angelegt oder existiert bereits."
  Else
    MsgBox "Der Pfad konnte nicht angelegt werden."
  End If
End Sub

.VBA-Code #2
'Deklarationsbereich
Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal DirPath As String) As Long

'Codemodul
Public Function CreateDirectoryTree(ByVal strNewPath As String) As Boolean
  If Right$(strNewPath, 1) <> "\" Then
    'Letztes Zeichen muss ein Backslash sein

    strNewPath = strNewPath & "\"
  End If
  If MakeSureDirectoryPathExists(strNewPath) <> 0 Then
    '* Kein Fehler aufgetreten *
    'Pfad existiert bereits oder wurde soeben erfolgreich angelegt
    CreateDirectoryTree = True
  Else
    '* Fehler aufgetreten *
    'Mögliche Ursachen:
    ' - Der Pfad existiert nicht, kann aber nicht angelegt werden, da der Pfad ungültige Zeichen enthält (z.B.

    '   ein Platzhalterzeichen * oder ?).
    ' - Der Pfad existiert nicht, kann aber nicht angelegt werden, da der angemeldete Benutzer nicht genügende
    '   Berechtigungen zum Anlegen von Verzeichnissen besitzt (Write/Create-Recht fehlt).
    ' - Der Pfad existiert nicht, kann aber nicht angelegt werden, da ein Verzeichnis einen Namen besitzt, der

    '   bereits von einer Datei verwendet wird.
    ' - Die Existenz des Pfades kann nicht geprüft werden, da das angegebene Gerät nicht verfügbar ist (z.B.
    '   bei unterbrochener Netzwerkverbindung).
    ' - Der Pfad ist grundsätzlich falsch (z.B. wenn ein Ausdruck angegeben wird, welcher kein Pfad
    '   repräsentiert, wie z.B. der Text "Heute ist Regenwetter").
    ' - Das im Pfad angegebene Laufwerk existiert nicht (z.B. falscher Laufwerkbuchstabe).
    ' - Das benötigte Laufwerk ist nicht bereit (z.B. Datenträger/Diskette nicht eingelegt).
    ' - Auf das angegebene Laufwerk bzw. den Datenträger kann nicht geschrieben werden (z.B. Schreibschutz
   
'   der Diskette aktiviert oder CD-ROM).
    CreateDirectoryTree = False
  End If
End Function

'*** Aufruf ***
Sub TestCall()
  If CreateDirectoryTree("C:\Dir1\Dir2\Dir3") = True Then
    MsgBox "Der Pfad wurde angelegt oder existiert bereits."
  Else
    MsgBox "Der Pfad konnte nicht angelegt werden."
  End If
End Sub

.VBA-Code #3
Public Sub CreateDirectoryTree1()
  Shell "CMD /C MD C:\Dir1\Dir2\Dir3", vbMinimizedNoFocus
End Sub

.VBA-Code #4
Public Sub CreateDirectoryTree2()
  Const Path As String = "C:\Dir1\Dir2\Dir3"
  Dim strFolder As String
  Dim intPos1 As Integer
  Dim intPos2 As Integer
  On Error GoTo ErrorHandler
  ChDrive Left$(Path, 1)
  ChDir Left$(Path, 3)
  intPos1 = InStr(Path, "\")
  If intPos1 > 0 Then
    Do
      intPos2 = InStr(intPos1 + 1, Path, "\")
      If intPos2 > 0 Then
        strFolder = Mid$(Path, intPos1 + 1, intPos2 - intPos1 - 1)
        intPos1 = intPos2
      Else
        strFolder = Mid$(Path, intPos1 + 1)
      End If
      MkDir strFolder
      DoEvents
      If intPos2 > 0 Then
        ChDir Left$(Path, intPos2 - 1)
      Else
        ChDir Path
        Exit Do
      End If
    Loop
  End If
  Exit Sub
ErrorHandler:
  If Err.Number <> 75 Then
    MsgBox "Fehler beim Anlegen/Wechseln des Ordners '" & strFolder & "'!", vbExclamation
  End If
  Resume Next
End Sub

.VBA-Code #5
Public Function CreateTree(ByVal Path As String) As Integer
  Dim strFolder As String
  Dim intPos1 As Integer
  Dim intPos2 As Integer
  Dim intMake As Integer
  Dim intError As Integer
  On Error GoTo ErrorHandler
  ChDrive Left$(Path, 1)
  ChDir Left$(Path, 3)
  intPos1 = InStr(Path, "\")
  If intPos1 > 0 Then
    Do
      intPos2 = InStr(intPos1 + 1, Path, "\")
      If intPos2 > 0 Then
        strFolder = Mid$(Path, intPos1 + 1, intPos2 - intPos1 - 1)
        intPos1 = intPos2
      Else
        strFolder = Mid$(Path, intPos1 + 1)
      End If
      MkDir strFolder
      DoEvents
      intMake = intMake + 1
      If intPos2 > 0 Then
        ChDir Left$(Path, intPos2 - 1)
      Else
        ChDir Path
        Exit Do
      End If
    Loop
  End If
  If intMake = intError Then
    'Alle Ordner existieren bereits
    '-1 für True zurückgeben

    CreateTree = -1
  Else
    'Es wurde ein oder mehrere Ordner erstellt
    'Anzahl erstellte Ordner zurückgeben

    CreateTree = intMake - intError
  End If
  Exit Function
ErrorHandler:
  If Err.Number = 75 Then
    'MkDir erzeugte einen Fehler, weil der Ordner bereits existiert
    intError = intError + 1
  ElseIf Err.Number = 76 Then
    'ChDir erzeugte einen Fehler, weil eine Datei den gleichen Namen wie der Ordner besitzt
    CreateTree = -2
    Exit Function
  Else
    'Anderer Fehler aufgetreten
    '0 für False zurückgeben
    CreateTree = 0
    Exit Function
  End If
  Resume Next
End Function

'*** Aufruf ***
Sub TestCall()
  Const strPath As String = "C:\Dir1\Dir2\Dir3"
  Dim intRC As Integer
  intRC = CreateTree(strPath)
  If intRC = 0 Then
    'Fehler aufgetreten
    MsgBox "Fehler beim Anlegen des Pfades '" & strPath & "'!"
  ElseIf intRC = -1 Then
    'Pfad bereits vorhanden
    MsgBox "Der anzulegende Pfad '" & strPath & "' existiert bereits."
  ElseIf intRC = -2 Then
    'Ordner-Erstellung fehlgeschlagen
    MsgBox "Ein Ordner des anzulegenden Pfades '" & strPath & "' konnte nicht erstellt werden."
  Else
    'Pfad wurde angelegt
    If intRC = 1 Then
      MsgBox "Der Pfad '" & strPath & "' wurde angelegt. Es wurde " & intRC & " neuer Ordner erstellt."
    Else
      MsgBox "Der Pfad '" & strPath & "' wurde angelegt. Es wurden " & intRC & " neue Ordner erstellt."
    End If
  End If
End Sub

.Hinweis
Beachten Sie bitte, dass der Pfad, der als DirPath-Parameter der API-Funktion MakeSureDirectoryPathExists übergegeben wird, unbedingt einen Backslash '\' als letztes Zeichen aufweisen muss (also zum Beispiel "C:\Dir1\Dir2\Dir3\" statt "C:\Dir1\Dir2\Dir3"). Anderenfalls wird der Pfad nicht angelegt (ohne Fehlermeldung).

Berücksichtigen Sie auch, dass es viele weitere potenzielle Fehler gibt. Unter anderem könnte der angesprochene Datenträger schreibgeschützt sein (z.B. bei einer Diskette), der Datenträger nicht beschrieben werden (z.B. bei einer CD-ROM) oder der Benutzer keine Berechtigung zum Anlegen von Verzeichnissen besitzen.

Tipp! Tipp!
Wie man die Datei/Ordner-Berechtigungen eines Benutzers abfragen kann, wird in Codebeispiel "Prüfen, ob der Benutzer genügend Berechtigungen für den Zugriff auf einen bestimmten Ordner besitzt" gezeigt.

Weitere Informationen

VBA-Befehle und -Funktionen

Relative Pfade

To Top


Kurzer Pfadname zu einem langen Pfadnamen ermitteln

.Beschreibung
Mit der Windows API-Funktion OSGetShortPathName kann die kurze Schreibweise (auch "MS-DOS-Name" genannt) eines langen Pfades abgefragt werden. Der kurze Pfad von beispielsweise "C:\Programme\Microsoft Office" lautet "C:\PROGRA~1\MICROS~1".

.VBA-Code
'Deklarationsbereich
Declare Function OSGetShortPathName Lib "kernel32" Alias _
   "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal _
   lpszShortPath As String, ByVal cchBuffer As Long) As Long

'Codemodul
Function GetShortPathName(ByVal strLongPath As String) As String
  Const cchBuffer = 300
  Dim strShortPath As String
  Dim lResult As Long
  Dim intZeroPos As Integer

  strShortPath = String(cchBuffer, Chr$(0))
  lResult = OSGetShortPathName(strLongPath, strShortPath, cchBuffer)
  If lResult = 0 Then
    MsgBox "Pfad nicht gefunden!", vbExclamation
    GetShortPathName = ""

  Else
    intZeroPos = InStr(strShortPath, Chr$(0))
    If intZeroPos > 0 Then
      GetShortPathName = Left$(strShortPath, intZeroPos - 1)
    Else
      GetShortPathName = strShortPath
    End If
  End If
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox GetShortPathName("C:\Programme\Microsoft Office")
End Sub

Verwandte Codebeispiele

Langer Pfadname zu einem kurzen Pfadnamen ermitteln

Kurzer Dateiname zu einem langen Dateinamen ermitteln

Langer Dateiname zu einem kurzen Dateinamen ermitteln

To Top


Langer Pfadname zu einem kurzen Pfadnamen ermitteln

.Beschreibung
Dieses Codebeispiel zeigt, wie man den langen Pfad eines kurzen Pfades erhält.

.VBA-Code
Function GetLongPathName(ByVal strShortName As String) As String
  Dim strLongName As String
  Dim strTemp As String
  Dim intSlashPos As Integer
  On Error Resume Next
  strShortName = strShortName & "\"
  intSlashPos = InStr(4, strShortName, "\")
  While intSlashPos
    strTemp = Dir(Left$(strShortName, intSlashPos - 1), vbNormal + vbHidden + vbSystem + vbDirectory)
    If strTemp = "" Then
      Err.Clear
      GetLongPathName = ""
      Exit Function
    End If
    strLongName = strLongName & "\" & strTemp
    intSlashPos = InStr(intSlashPos + 1, strShortName, "\")
  Wend
  GetLongPathName = Left$(strShortName, 2) & strLongName
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox GetLongPathName(
"C:\PROGRA~1\MICROS~1")
End Sub

Verwandte Codebeispiele

Kurzer Pfadname zu einem langen Pfadnamen ermitteln

Langer Dateiname zu einem kurzen Dateinamen ermitteln

Kurzer Dateiname zu einem langen Dateinamen ermitteln

To Top


Arbeitsmappe anlegen

.Beschreibung
Das Anlegen einer Arbeitsmappe mit VBA-Code ist bekanntlich sehr einfach, weil man lediglich die Add-Methode der Workbooks-Auflistung aufzurufen braucht. Add besitzt ein optionales Argument namens Template. Wird dieses weggelassen, wird eine neue Arbeitsmappe mit so vielen Arbeitsblättern erstellt, wie als Standard eingestellt ist. Die Default-Einstellung ist im Optionen-Dialog von Excel auf der Registerseite "Allgemein" zu finden, oder kann mit der SheetsInNewWorkbook-Eigenschaft gesetzt bzw. abgefragt werden.

Add ohne Template-Argument verwendet immer die Werksvorgaben für neue Mappen mit der eingestellten Anzahl Blätter. Eine allfällig vorhandene Muster-Vorlagemappe Mappe.xlt wird nicht berücksichtigt.

.VBA-Code #1
Sub AddNewWorkbook1()
  Workbooks.Add
End Sub

.VBA-Code #2
Sub AddNewWorkbook2()
  Dim wkbWorkbook As Workbook
  Set wkbWorkbook = Workbooks.Add

  'Irgendwelche VBA-Befehle...
  Set wkbWorkbook = Nothing
End Sub

Verwandte Codebeispiele

Arbeitsmappe mit einem Arbeitsblatt anlegen

Arbeitsmappe mit mehreren Arbeitsblättern anlegen

Arbeitsmappe basierend auf der Muster-Vorlagemappe (Mappe.xlt) anlegen

 

Weitere Informationen

Excel-Objektmodell: Methoden der Workbooks-Auflistung

To Top


Arbeitsmappe basierend auf der Muster-Vorlagemappe (Mappe.xlt) anlegen

.Beschreibung
Eine neue Arbeitsmappe wird mit der Add-Methode von Workbooks erstellt. Wenn man das Template-Argument von Add weglässt, verwendet Microsoft Excel immer die Werksvorgaben für neue Arbeitsmappen. Zum Anlegen einer Arbeitsmappe auf Basis der Vorlage Mappe.xlt muss man für Template den Bezeichner "Arbeitsmappe" angeben. Dann wird die Muster-Vorlagemappe Mappe.xlt berücksichtigt.

.VBA-Code #1
Sub AddNewWorkbook1()
  Workbooks.Add "Arbeitsmappe"
End Sub

.VBA-Code #2
Sub AddNewWorkbook2()
  Dim wkbWorkbook As Workbook
  Set wkbWorkbook = Workbooks.Add "Arbeitsmappe"

  'Irgendwelche VBA-Befehle...
  Set wkbWorkbook = Nothing
End Sub

Verwandte Codebeispiele

Arbeitsmappe anlegen

Arbeitsmappe mit einem Arbeitsblatt anlegen

Arbeitsmappe mit mehreren Arbeitsblättern anlegen

 

Weitere Informationen

Excel-Objektmodell: Methoden der Workbooks-Auflistung

To Top


Arbeitsmappe mit einem Arbeitsblatt anlegen

.Beschreibung
Das Anlegen einer neuen Arbeitsmappe mit einem einzelnen neuen Arbeitsblatt (genauer gesagt mit einem Tabellenblatt) wird wie gewohnt über die Add-Methode vorgenommen, wobei der Template-Parameter mit xlWBATWorksheet, der Zahl 1 oder der Zahl -4167 angegeben wird (vergleiche Codebeispiel #1).

Wenn Sie den Template-Parameter weglassen, erhält die neue Arbeitsmappe so viele Arbeitsblätter, wie in der Eigenschaft SheetsInNewWorkbook des Application-Objektes definiert ist. Damit die anzulegende Arbeitsmappe genau ein Blatt besitzt, kann man somit die SheetsInNewWorkbook-Eigenschaft auf den Wert 1 setzen (vergleiche Codebeispiel #2).

Wenn die neue Arbeitsmappe ein einzelnes Blatt basierend auf der Vorlage für Tabellenblätter (Tabelle.xlt) enthalten soll, muss man für Template den Bezeichner "Tabelle" angeben. Dann wird die Muster-Vorlagetabelle Tabelle.xlt berücksichtigt (vergleiche Codebeispiel #3).

.VBA-Code #1
Sub AddNewWorkbookWithOneSheet1()
  Workbooks.Add Template:=xlWBATWorksheet  'bzw. 1 oder -4167
End Sub

.VBA-Code #2
Sub AddNewWorkbookWithOneSheet2()
  Dim intSheets As Integer
  intSheets = Application.SheetsInNewWorkbook
  Application.SheetsInNewWorkbook = 1
  Workbooks.Add
  Application.SheetsInNewWorkbook = intSheets
End Sub

.VBA-Code #3
Sub AddNewWorkbookWithOneSheet3()
  Workbooks.Add "Tabelle"
End Sub

Weitere Informationen

Excel-Objektmodell: Methoden der Workbooks-Auflistung

 

Verwandte Codebeispiele

Arbeitsmappe anlegen

Arbeitsmappe mit mehreren Arbeitsblättern anlegen

Arbeitsmappe mit einem Diagramm-, Makro- oder Dialogblatt anlegen

Arbeitsmappe basierend auf der Muster-Vorlagemappe (Mappe.xlt) anlegen

To Top


Arbeitsmappe mit mehreren Arbeitsblättern anlegen

.Beschreibung
Wenn man mit der Codezeile "Workbooks.Add" eine neue Arbeitsmappe anlegt, so enthält die Mappe genau so viele Arbeitsblätter, wie in der Excel-Option "Blätter in neuer Arbeitsmappe" eingestellt ist (Menübefehl Extras/Optionen, Registerseite Allgemein des Optionen-Dialoges). Die Add-Methode besitzt kein Argument, mit dem man die Anzahl Blätter spezifizieren kann. Im Excel-Objektmodell entspricht die Eigenschaft SheetsInNewWorkbook des Application-Objektes der Excel-Option "Blätter in neuer Arbeitsmappe". Soll eine Mappe mit einer bestimmten Anzahl Arbeitsblätter erstellt werden, so muss vorgängig der entsprechende Wert der SheetsInNewWorkbook-Eigenschaft zugewiesen werden. Da die Änderung dieser Eigenschaft dauerhaft ist - der neue Wert wird bei Beenden von Microsoft Excel in den Windows Registry-Eintrag DefSheets geschrieben -  empfiehlt es sich, die ursprüngliche Blattanzahl in einer Variable zwischenzuspeichern.

Übrigens akzeptiert SheetsInNewWorkbook nur Werte zwischen 1 und 255. Bei anderen Werten tritt der Laufzeitfehler 1004 auf.

Im Beispiel wird eine neue Arbeitsmappe mit fünf Arbeitsblättern erstellt.

.VBA-Code
Sub AddNewWorkbookWithMultipleSheets()
  Dim intSheets As Integer
  intSheets = Application.SheetsInNewWorkbook
  Application.SheetsInNewWorkbook = 5
  Workbooks.Add
  Application.SheetsInNewWorkbook = intSheets
End Sub

Weitere Informationen

Excel-Objektmodell: Methoden der Workbooks-Auflistung

 

Verwandte Codebeispiele

Arbeitsmappe anlegen

Arbeitsmappe mit einem Arbeitsblatt anlegen

Arbeitsmappe mit einem Diagramm-, Makro- oder Dialogblatt anlegen

Arbeitsmappe basierend auf der Muster-Vorlagemappe (Mappe.xlt) anlegen

To Top


Herausfinden, welche Office-Programme installiert sind

.Beschreibung
Mit diesem VBA-Programmcode kann man herausfinden, welche Office-Programme auf dem Computer installiert sind. Überprüft wird die Existenz der Programme Word, Excel, PowerPoint und Access.

.Autor
Gijs de Jong (genauere Angaben nicht vorhanden)

Siehe auch Artikel:
  http://216.26.168.92/tips/tip90.html

.VBA-Code
'Deklarationsbereich
Declare Function RegOpenKey Lib "advapi32" Alias "RegOpenKeyA" (ByVal hKey _
   As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" _

   (ByVal hKey As Long, ByVal lpValueName As String, lpReserved As Long, _
   lptype As Long, lpData As Any, lpcbData As Long) As Long
Declare Function RegCloseKey& Lib "advapi32" (ByVal hKey&)
Const REG_SZ = 1
Const REG_EXPAND_SZ = 2
Const ERROR_SUCCESS = 0
Const HKEY_CLASSES_ROOT = &H80000000

'Codemodul
Function GetRegString(hKey As Long, strSubKey As String, strValueName As String) As String
  Dim strSetting As String
  Dim lngDataLen As Long
  Dim lngRes As Long
  If RegOpenKey(hKey, strSubKey, lngRes) = ERROR_SUCCESS Then
    strSetting = Space(255)
    lngDataLen = Len(strSetting)
    If RegQueryValueEx(lngRes, strValueName, ByVal 0, REG_EXPAND_SZ, ByVal strSetting, lngDataLen) = ERROR_SUCCESS Then
      If lngDataLen > 1 Then
        GetRegString = Left(strSetting, lngDataLen - 1)
      End If
    End If
    If RegCloseKey(lngRes) <> ERROR_SUCCESS Then
      MsgBox "RegCloseKey Failed: " & strSubKey
    End If
  End If
End Function

Function IsAppPresent(strSubKey$, strValueName$) As Boolean
  IsAppPresent = CBool(Len(GetRegString(HKEY_CLASSES_ROOT, strSubKey, strValueName)))
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox "Access installiert: " & IsAppPresent("Access.Database\CurVer", "")
  MsgBox "Excel installiert: " & IsAppPresent("Excel.Sheet\CurVer", "")
  MsgBox "PowerPoint installiert: " & IsAppPresent("PowerPoint.Slide\CurVer", "")
  MsgBox "Word installiert: " & IsAppPresent("Word.Document\CurVer", "")
End Sub

To Top


Starten eines anderen Office-Programmes

.Beschreibung
Muss aus Excel heraus ein anderes Office-Programm gestartet werden, bedient man sich häufig der Shell-Funktion. Damit die Anwendung jedoch gestartet werden kann, muss der Shell-Funktion der genaue Pfad der exe-Datei des Programmes mitgegeben werden. Solange die zu startende Anwendung aus der gleichen Office-Version wie Excel stammt, könnte man behelfsmässig den Programmpfad von Excel verwenden (abfragen mit Application.Path) und annehmen, dass die exe-Datei der anderen Anwendung im gleichen Verzeichnis wie die Datei Excel.exe steht. Sobald es sich um eine Anwendung einer anderen Office-Version handelt, weicht der Programmpfad mit hoher Wahrscheinlichkeit ab. Damit nicht in der Windows Registry nachgesehen werden muss, wie der Pfad der gesuchten Anwendung heisst, stellt Excel eine spezielle Methode zum Starten und/oder Aktivieren von anderen Office-Programmen zur Verfügung.

Konstanten für XlMSApplication
- xlMicrosoftAccess
- xlMicrosoftFoxPro
- xlMicrosoftMail
- xlMicrosoftPowerPoint
- xlMicrosoftProject
- xlMicrosoftSchedulePlus
- xlMicrosoftWord

.VBA-Code
Sub RunMicrosoftApplication()
  Application.ActivateMicrosoftApp xlMicrosoftWord
End Sub

.Hinweis
Die ActivateMicrosoftApp-Methode existiert ausschliesslich in Microsoft Excel. Die Objektmodelle der anderen Office-Programme wie Microsoft Word und Microsoft PowerPoint kennen diese Methode nicht.

In Excel 97 und Excel 2000 ist die ActivateMicrosoftApp-Methode dokumentiert. Ob sie in Excel 2002 und Excel 2003 ebenfalls existiert, ist mir nicht bekannt (wobei sie aus Kompatibilitätsgründen sehr wahrscheinlich ebenfalls vorhanden sein wird).

Weitere Informationen

Excel-Objektmodell: Methoden des Application-Objektes

VBA-Spezialthema: Starten von Programmen

 

Verwandte Codebeispiele

Starten eines anderen Windows-Programmes

To Top


Starten eines anderen Windows-Programmes

.Beschreibung
Gewöhnlich verwendet man zum Starten eines Programmes die Shell-Funktion von VBA, weil dies die für diesen Zweck von VBA bereitgestellte Standard-Funktion ist. Leider besitzt Shell drei Nachteile:
1. Das auszuführende Programm wird asynchron gestartet. Das bedeutet, dass die nachfolgenden Codezeilen im VBA-Programm abgearbeitet werden, auch wenn das andere Programm noch nicht vollständig gestartet wurde.
2. Es muss der vollständige Dateipfad der exe-Datei des auszuführenden Programmes angegeben werden, sofern sich die Programmdatei nicht zufälligerweise in einem Suchpfad (System-Umgebungsvariable "Path") oder dem gerade aktuellen Verzeichnis befindet. Die in der Windows Registry eingetragenen Programmpfade (Schlüssel "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths") werden von Shell nicht berücksichtigt.
3. Wenn man das WindowStyle-Argument nicht explizit angibt, wird das Programm standardmässig mit minimiertem Anwendungsfenster gestartet.

.VBA-Code #1
Sub RunProgram1()
  Application.ActivateMicrosoftApp xlMicrosoftWord
End Sub

 

Shell strToolEXE, vbNormalFocus

 

lngRC = ShellExecute(0&, "open", strToolEXE, vbNullString, vbNullString, vbNormalFocus)

 

CreateProcess

 

CreateObject("WScript.Shell").Run "MSPaint.exe"

Run startet das Programm synchron und standardmässig mit normaler Fenstergrösse.

 

ActiveWorkbook.FollowHyperlink "d:\winnt\system32\taskmgr.exe"

FollowHyperlink startet asynchron und mit normaler Fenstergrösse.

 

.Hinweis
Die ActivateMicrosoftApp-Methode existiert ausschliesslich in Microsoft Excel. Die Objektmodelle der anderen Office-Programme wie Microsoft Word und Microsoft PowerPoint kennen diese Methode nicht.

Verwandte Codebeispiele

Starten eines anderen Office-Programmes

Starten und Aktivieren eines Office-Programmes mit Automation

To Top


Starten und Aktivieren eines Office-Programmes mit Automation

.Beschreibung
Es gibt mehrere Lösungen zum Starten und Aktivieren eines Office-Programmes mittels Automation. Nachfolgend werden zwei unterschiedliche Varianten vorgestellt.

» Das Codebeispiel #1 startet Microsoft Word, wobei im VBA-Projekt der Verweis auf die Word-Bibliothek gesetzt sein muss (Microsoft Word x.0 Object Library, Datei "MSWordx.olb"). Durch die Deklaration von wdApp als "New Word.Application" wird ein neues Anwendungsobjekt instanziert. Die Anwendung selbst wird jedoch erst mit der Codezeile "wdApp.Visible = True" gestartet, da hier der erste Zugriff auf das Objekt stattfindet.

» Das zweite Beispiel startet Microsoft Excel, ohne dass im Projekt ein Verweis auf die Objektbibliothek von Microsoft Excel vorhanden sein muss. Dies, weil xlApp als "Object" deklariert ist. Gestartet wird die Excel-Anwendungsinstanz durch die CreateObject-Funktion. Durch Setzen von UserControl auf True wird die Kontrolle an den Benutzer übergeben.

.VBA-Code #1
Sub OpenWord()
  Dim wdApp As New Word.Application
  wdApp.Visible = True

  AppActivate "Microsoft Word"
End Sub

.VBA-Code #2
Sub OpenExcel()
  Dim xlApp As Object
  Set xlApp = CreateObject("Excel.Application")
  xlApp.Visible = True
  xlApp.UserControl = True
  Set xlApp = Nothing
End Sub

Verwandte Codebeispiele

Starten eines anderen Office-Programmes

Starten eines anderen Windows-Programmes

To Top


Excel beenden

.Beschreibung
Mit der Quit-Methode wird die aktuelle Excel-Sitzung beendet.

Beachten Sie bitte, dass bei Quit alle geöffneten Arbeitsmappen geschlossen werden, wobei
- für jede geänderte Mappe die Rückfragemeldung "Änderungen speichern?" erscheint,
- die BeforeClose-, BeforeSave-, Deactivate- und WindowDeactivate-Ereignisse ausgelöst werden und
- allfällig vorhandene Auto_Close-Makros ausgeführt werden.

Anstelle von Quit kann man auch die Tastenkombination Alt+F4 an das Excel-Anwendungsfenster senden.

.VBA-Code #1
Sub QuitExcel1()
  Application.Quit
End Sub

.VBA-Code #2
Sub QuitExcel2()
  SendKeys "%{F4}", True
End Sub

Weitere Informationen

Excel beenden mit Schliessen aller Arbeitsmappen ohne Ausführung von Auto_Close-Makros

Excel beenden mit Schliessen aller Arbeitsmappen ohne "Änderungen speichern"-Aufforderung

Excel-Objektmodell: Methoden des Application-Objektes

To Top

Excel beenden mit Schliessen aller Arbeitsmappen ohne Ausführung von Auto_Close-Makros

.Beschreibung
Wenn Sie Microsoft Excel mit der Quit-Methode beenden, werden automatisch sämtliche Auto_Close-Makros aller aktuell geöffneten Arbeitsmappen ausgeführt. Damit die Auto_Close-Makros ignoriert werden, kann man vor dem Beenden von Excel zuerst alle Arbeitsmappen mit der Close-Methode schliessen.

.VBA-Code
Sub QuitExcelWithoutAutoCloseMacros()

End Sub

Weitere Informationen

Excel beenden

Excel beenden mit Schliessen aller Arbeitsmappen ohne "Änderungen speichern"-Aufforderung

Excel-Objektmodell: Methoden des Application-Objektes

To Top


Alle laufenden Excel-Instanzen ermitteln

.Beschreibung
Mit der Prozedur GetAllExcelInstances werden alle momentan laufenden Excel-Instanzen ermittelt und deren Programm-Handles in einer öffentlichen Datenfeldvariable namens hWndArray gespeichert.

.VBA-Code
'Deklarationsbereich
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName _
   As String, ByVal lpWindowName As String) As Long
Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd _

   As Long, ByVal wFlag As Long) As Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd _

   As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Const GW_HWNDNEXT = 2

Public hWndArray() As Long

'Codemodul
Sub GetAllExcelInstances()
  Dim hwnd As Long, lRet As Long
  Dim hWndArray() As Long
  Dim i As Integer
  Dim sClassBuffer As String
  i = 0
  hwnd = FindWindow("XLMAIN", vbNullString)
  If hwnd <> 0 Then
    ReDim hWndArray(i)
    hWndArray(i) = hwnd
    Do
      hwnd = GetNextWindow(hwnd, GW_HWNDNEXT)
      If hwnd = 0 Then Exit Sub
      sClassBuffer = String(255, 0)
      lRet = GetClassName(hwnd, sClassBuffer, Len(sClassBuffer))
      sClassBuffer = Left(sClassBuffer, InStr(1, sClassBuffer, Chr(0), vbTextCompare) - 1)
      If UCase(sClassBuffer) = "XLMAIN" Then
        i = i + 1
        ReDim Preserve hWndArray(i)
        hWndArray(i) = hwnd
      End If
    Loop
  End If
End Sub

Verwandte Codebeispiele

Laufende Microsoft Excel-Anwendungen auflisten

To Top


Dateigrösse von Bytes nach Kilobytes (KB), Megabytes (MB) oder Gigabytes (GB) umrechnen

.Beschreibung
Mit der hier vorgestellten Funktion FormatKB wird eine in Bytes angegebene Dateigrösse nach Kilobytes (KB), Megabytes (MB) beziehungsweise Gigabytes (GB) umgerechnet. Die API-Funktion StrFormatByteSize erledigt nicht nur die Umrechnung sondern liefert auch gleich die für die Anzeige benötigte Masseinheit Byte, KB, MB oder GB, wobei die API-Funktion selbständig entscheidet, welche Masseinheit am ehesten geeignet ist. Wenn beispielsweise ein Bytes-Wert übergeben wird, dessen Umrechnungsresultat (Byte nach KB) grösser oder genau 1'000 KB ist, wird das KB-Resultat automatisch in MB umgerechnet. Ist dieses Resultat grösser als oder genau 1'000 MB, so erfolgt die Umrechnung von MB nach GB. Der grösste umrechenbare Bytes-Wert ist 2'147'483'647, was genau 1.99 GB entspricht. Übrigens wird das von der Funktion gelieferte Resultat automatisch formatiert, d.h. je nach Resultat auf keine, eine oder zwei Dezimalstellen gerundet.

.Autor
» Codebeispiel #1: Sam Huggill, VB-Square, www.vb-square.com
» Codebeispiel #2: Karl E. Peterson, www.mvps.org/vb

.VBA-Code #1
'Deklarationsbereich
Declare Function StrFormatByteSize Lib "shlwapi" Alias "StrFormatByteSizeA" _
   (ByVal dw As Long, ByVal pszBuf As String, ByRef cchBuf As Long) As String

'Codemodul
Function FormatKB(ByVal Amount As Long) As String
  Dim Buffer As String
  Dim Result As String
  Buffer = Space$(255)
  Result = StrFormatByteSize(Amount, Buffer, Len(Buffer))
  If InStr(Result, vbNullChar) > 1 Then
    FormatKB = Left$(Result, InStr(Result, vbNullChar) - 1)
  End If
End Function

'*** Aufruf ***
Sub TestCall()
  Dim strFileSize As String
  strFileSize = FormatKB(FileLen("C:\Daten\MeineMappe.xls"))
  MsgBox "Die Dateigrösse beträgt " & strFileSize
End Sub

.VBA-Code #2
Function FormatFileSize(ByVal Size As Long) As String
  Dim sRet As String
  Const KB& = 1024
  Const MB& = KB * KB
  If Size < KB Then
    sRet = Format(Size, "#,##0") & " Bytes"
  Else
    Select Case Size \ KB
      Case Is < 10
        sRet = Format(Size / KB, "0.00") & " KB"
      Case Is < 100
        sRet = Format(Size / KB, "0.0") & " KB"
      Case Is < 1000
        sRet = Format(Size / KB, "0") & " KB"
      Case Is < 10000
        sRet = Format(Size / MB, "0.00") & " MB"
      Case Is < 100000
        sRet = Format(Size / MB, "0.0") & " MB"
      Case Is < 1000000
        sRet = Format(Size / MB, "0") & " MB"
      Case Is < 10000000
        sRet = Format(Size / MB / KB, "0.00") & " GB"
    End Select
    sRet = sRet & " (" & Format(Size, "#,##0") & " Bytes)"
  End If
  FormatFileSize = sRet
End Function

'*** Aufruf ***
Sub TestCall()
  Dim strFileSize As String
  strFileSize = FormatFileSize(FileLen("C:\Daten\MeineMappe.xls"))
  MsgBox "Dateigrösse: " & strFileSize
End Sub

Weitere Informationen

VBA-Befehle und -Funktionen

To Top


Öffnen des VBA-Editor-Fensters verhindern

.Beschreibung
Es existiert in Microsoft Excel keine direkte Möglichkeit, den VBA-Editor auszublenden oder zu sperren. Mittels API-Aufruf kann man jedoch das Hauptfenster des VBA-Editors blockieren. Im nachstehenden Beispiel wird das VBA-Editor-Fenster beim Öffnen einer Arbeitsmappe gesperrt und beim Schliessen der Mappe wieder entsperrt.

.VBA-Code
'Deklarationsbereich
Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long

'Codemodul "Diese Arbeitsmappe"
Private Sub Workbook_Open()
  LockWindowUpdate Application.VBE.MainWindow.HWnd
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  LockWindowUpdate 0&
End Sub

Verwandte Codebeispiele

Hauptfenster des VBA-Editors öffnen

To Top


Hauptfenster des VBA-Editors öffnen

.Beschreibung
Der VBA-Editor kann programmgesteuert geöffnet werden, indem schlicht die Visible-Eigenschaft von MainWindow auf True gesetzt wird. Die zweite Codezeile im nachstehenden Beispiel bewirkt, dass das VBA-Editor-Fenster den Fokus erhält.

Sub ShowVBEWindow()
  ThisWorkbook.VBProject.VBE.MainWindow.Visible = True
  ThisWorkbook.VBProject.VBE.MainWindow.SetFocus

End Sub

Verwandte Codebeispiele

Hauptfenster des VBA-Editors schliessen

Öffnen des VBA-Editor-Fensters verhindern

To Top


Hauptfenster des VBA-Editors schliessen

.Beschreibung
Das Hauptfenster des VBA-Editors von Microsoft Excel wird geschlossen, indem man die Visible-Eigenschaft von MainWindow auf False setzt. Dies kann man entweder über das Application- oder das VBProject-Objekt einer geöffneten Arbeitsmappe vornehmen.

» Codebeispiel #3: Microsoft Word kennt eine Eigenschaft namens ShowVisualBasicEditor, mit der man die Sichtbarkeit der VBE festlegen kann.

.VBA-Code #1
Sub CloseVBEWindow1()
  ThisWorkbook.VBProject.VBE.MainWindow.Visible = False
End Sub

.VBA-Code #2
Sub CloseVBEWindow2()
  Application.VBE.MainWindow.Visible = False
End Sub

.VBA-Code #3
Sub CloseVBEWindow3()
  Application.ShowVisualBasicEditor = False
End Sub

Verwandte Codebeispiele

Hauptfenster des VBA-Editors öffnen

To Top


Prüfen, ob das VBA-Projekt einer Arbeitsmappe geschützt ist

.Beschreibung
Das Vorhandensein des Kennwortschutzes eines VBA-Programmes kann sehr einfach geprüft werden.

TODO: Diese Funktion konnte noch nicht abschliessend getestet werden! -> Protection Property nicht sinnvoller?

.VBA-Code
Function Projekt_geschützt(ByVal WB As Workbook) As Boolean
  Dim Anzahl As Integer
  On Error Resume Next
  Anzahl = WB.VBProject.VBComponents.Count
  Projekt_geschützt = Err.Number <> 0
End Function

'*** Aufruf ***
Sub TestCall()
  Dim WB As Workbook
  Set WB = Workbooks("MeineMappe.xls")
  MsgBox "Projekt geschützt: " & Projekt_geschützt(WB)

  Set WB = Nothing
End Sub

Verwandte Codebeispiele

Hauptfenster des VBA-Editors öffnen

To Top


Arbeitsmappe speichern

.Beschreibung
Das Speichern einer Arbeitsmappe ist alles andere als schwierig. Man muss dazu lediglich die Save-Methode des Workbook-Objektes aufrufen.

» Das Codebeispiel #1 zeigt, wie die aktive Arbeitsmappe gespeichert wird.

» Codebeispiel #2 speichert die codeausführende Arbeitsmappe.

.VBA-Code #1
Sub SaveWorkbook()
  ActiveWorkbook.Save
End Sub

.VBA-Code #2
Sub SaveWorkbook()
  ThisWorkbook.Save
End Sub

Verwandte Codebeispiele

Arbeitsmappe unter einem anderen Dateinamen speichern

Arbeitsmappe als Sicherungskopie speichern

Arbeitsmappe schliessen mit automatischen Speichern

Arbeitsmappe schliessen mit automatischen Speichern unter einem anderen Dateinamen

To Top

Arbeitsmappe schliessen

.Beschreibung
Mit der Close-Methode wird eine Arbeitsmappe geschlossen. Wenn die zu schliessende Mappe nicht-gespeicherte Änderungen enthält, wird dem Benutzer die Rückfrage "Sollen Ihre Änderungen in <Datei> gespeichert werden?" angezeigt.

» Codebeispiel #1: Schliesst die aktive Arbeitsmappe.

» Codebeispiel #2: Schliesst die angegebene Arbeitsmappe.

» Codebeispiel #3: Schliesst die Arbeitsmappe mit der Indexnummer 2.

» Codebeispiel #4: Schliesst die codeausführende Arbeitsmappe.

» Codebeispiel #5: Schliesst die aktive Arbeitsmappe, sofern diese nur in einem einzigen Fenster geöffnet war (was gewöhnlich der Fall ist). Anderenfalls wird das gerade aktive Arbeitsmappenfenster geschlossen und ein anderes Fenster dieser Mappe aktiviert. Die Mappe selbst wird jedoch nicht geschlossen.

» Codebeispiel #6: Schliesst das Fenster der angegebenen Arbeitsmappe.

» Codebeispiel #7: Schliesst das Fenster der aktiven Arbeitsmappe.

.VBA-Code #1
Sub CloseWorkbook1()
  ActiveWorkbook.Close
End Sub

.VBA-Code #2
Sub CloseWorkbook2()
  Application.Workbooks("MeineMappe.xls").Close
End Sub

.VBA-Code #3
Sub CloseWorkbook3()
  Application.Workbooks(2).Close
End Sub

.VBA-Code #4
Sub CloseWorkbook4()
  ThisWorkbook.Close
End Sub

.VBA-Code #5
Sub CloseWorkbook5()
  ActiveWorkbook.Windows(1).Close
End Sub

.VBA-Code #6
Sub CloseWorkbook6()
  Application.Workbooks("MeineMappe.xls").Windows(1).Close
End Sub

.VBA-Code #7
Sub CloseWorkbook7()
  Application.Windows(1).Close
End Sub

.Hinweis
Wird versucht, eine Arbeitsmappe zu schliessen, auf die im VBA-Projekt einer anderen Arbeitsmappe verwiesen wird, erscheint die Fehlermeldung "Diese Arbeitsmappe wird momentan von einer anderen Arbeitsmappe verwendet und kann nicht geschlossen werden." und die Arbeitsmappe wird nicht geschlossen. Man kann diese Fehlermeldung nicht abfangen, da es sich um eine Excel-Fehlermeldung handelt und nicht um einen VBA-Laufzeitfehler. Dieses Problem lässt nur lösen, indem zuerst die andere Arbeitsmappe geschlossen oder der Verweis im VBA-Projekt der anderen Mappe entfernt wird.

Beachten Sie, dass bei Schliessen einer Mappe mittels Close folgende Ereignisse der Arbeitsmappe in dieser Reihenfolge ausgelöst werden:
1. BeforeClose
2. (BeforeSave)
3. WindowDeactivate
4. Deactivate

Bitte beachten Sie auch, dass ein allfällig vorhandenes Auto_Close-Makro nicht ausgeführt wird, wenn man die Arbeitsmappe mit VBA-Programmcode schliesst.

Verwandte Codebeispiele

Arbeitsmappe schliessen ohne speichern

Arbeitsmappe schliessen mit automatischem Speichern

Arbeitsmappe schliessen ohne "Änderungen speichern?"-Aufforderung

Arbeitsmappe speichern

Alle Arbeitsmappen schliessen

Alle Arbeitsmappen schliessen ohne speichern und "Änderungen speichern?"-Aufforderung

Alle Arbeitsmappen ausser der aktiven Arbeitsmappe schliessen

 

Weitere Informationen

Excel-Fehlermeldungen: Arbeitsmappe wird momentan verwendet

VBA-Spezialthema: Auto-Makros

To Top

Alle Arbeitsmappen schliessen

.Beschreibung
...

.VBA-Code
Sub CloseAllWorkbooks()
  Workbooks.Close
End Sub

Verwandte Codebeispiele

Alle Arbeitsmappen schliessen ohne speichern und "Änderungen speichern?"-Aufforderung

Alle Arbeitsmappen ausser der aktiven Arbeitsmappe schliessen

Alle Arbeitsmappen schliessen mit automatischem Speichern

Arbeitsmappe schliessen

Arbeitsmappe schliessen ohne speichern

Arbeitsmappe schliessen mit automatischem Speichern

Arbeitsmappe schliessen ohne "Änderungen speichern?"-Aufforderung

To Top

Alle Arbeitsmappen ausser der aktiven Arbeitsmappe schliessen

.Beschreibung
Dieses Beispiel zeigt, wie man alle geöffneten Arbeitsmappen ausser der gerade aktiven Mappe schliessen kann.

.VBA-Code
Sub CloseWorkbooksExceptThisWorkbook()
  Dim wkbBook As Workbook
  For Each wkbBook In Workbooks
    If wkbBook.Name <> ThisWorkbook.Name Then
      wkbBook.Close
    End If
  Next wkbBook
End Sub

Verwandte Codebeispiele

Alle Arbeitsmappen schliessen

Alle Arbeitsmappen schliessen ohne speichern und "Änderungen speichern?"-Aufforderung

Alle Arbeitsmappen schliessen mit automatischem Speichern

Arbeitsmappe schliessen

Arbeitsmappe schliessen ohne speichern

Arbeitsmappe schliessen mit automatischem Speichern

Arbeitsmappe schliessen ohne "Änderungen speichern?"-Aufforderung

To Top

Alle Arbeitsmappen schliessen ohne speichern und "Änderungen speichern?"-Aufforderung

.Beschreibung
Die Rückfrage "Sollen Ihre Änderungen in <Datei> gespeichert werden?" lässt sich am einfachsten unterdrücken, indem man die DisplayAlerts-Eigenschaft auf False setzt. Wenn man anschliessend die Close-Methode von Workbooks ausführt, werden die Arbeitsmappen geschlossen und alle nicht gespeicherten Änderungen verworfen.

Interessant ist, dass die persönliche Makro-Arbeitsmappe "Personl.xls" nicht geschlossen wird.

.VBA-Code
Sub CloseWorkbooksWithoutSaving()
  Application.DisplayAlerts = False
  Workbooks.Close
  Application.DisplayAlerts = True

End Sub

Verwandte Codebeispiele

Alle Arbeitsmappen schliessen

Alle Arbeitsmappen ausser der aktiven Arbeitsmappe schliessen

Alle Arbeitsmappen schliessen mit automatischem Speichern

Arbeitsmappe schliessen

Arbeitsmappe schliessen ohne speichern

Arbeitsmappe schliessen mit automatischem Speichern

Arbeitsmappe schliessen ohne "Änderungen speichern?"-Aufforderung

To Top

Alle Arbeitsmappen schliessen mit automatischem Speichern

.Beschreibung
Es gibt eine einfache Möglichkeit, wie man alle geöffneten Arbeitsmappen schliessen kann, wobei diese automatisch gespeichert werden.

.VBA-Code
Sub CloseWorkbooksWithSaving()

End Sub

Verwandte Codebeispiele

Alle Arbeitsmappen schliessen

Alle Arbeitsmappen ausser der aktiven Arbeitsmappe schliessen

Alle Arbeitsmappen schliessen ohne speichern und "Änderungen speichern?"-Aufforderung

Arbeitsmappe schliessen

Arbeitsmappe schliessen ohne speichern

Arbeitsmappe schliessen mit automatischem Speichern

Arbeitsmappe schliessen ohne "Änderungen speichern?"-Aufforderung

To Top


Arbeitsmappe schliessen ohne "Änderungen speichern?"-Aufforderung

.Beschreibung
Die Rückfrage "Sollen Ihre Änderungen in <Datei> gespeichert werden?" erscheint immer, wenn eine Arbeitsmappe geschlossen wird, welche nicht-gespeicherte Änderungen enthält.

Das Unterdrücken dieser Meldung kann auf verschiedene Arten erreicht werden. Einerseits kommt es darauf an, ob der Programmcode in der betroffenen oder in einer anderen geöffneten Mappe stehen soll. Andererseits muss man sich entscheiden, ob die zu Arbeitsmappe automatisch ohne oder mit Speicherung geschlossen werden soll.

Hier werden vier Lösungsvarianten vorgestellt, die zum Unterdrücken der Rückfrage beim Schliessen einer Arbeitsmappe dienen.

.Autor
Microsoft Support

Siehe auch MS KB-Artikel:
  XL97/XL2000/XL2002: How to Suppress "Save Changes?" Prompt When You Close a Workbook
  http://support.microsoft.com/?kbid=213428

.VBA-Code #1
'Codemodul
Sub Auto_Close()
  ThisWorkbook.Saved = True
End Sub

.VBA-Code #2
'Diese Arbeitsmappe
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Saved = True
End Sub

.VBA-Code #3
'Codemodul
Sub CloseBook1()
  Application.DisplayAlerts = False
  ActiveWorkbook.Close
  Application.DisplayAlerts = True
End Sub

.VBA-Code #4
'Codemodul
Sub CloseBook2()
  ActiveWorkbook.Close SaveChanges:=False
End Sub

.Hinweis
Im Codebeispiel #3 werden nach der Anweisung "ActiveWorkbook.Close" die Warnmeldungen wieder aktiviert. Wenn sich der Programmcode in der aktiven Mappe befindet, wird die letzte Codezeile "Application.DisplayAlerts = True" nicht ausgeführt, da nach Schliessen der aktiven Mappe die Programmcode-Abarbeitung gestoppt ist. Aus dieser Sicht ist die Codezeile somit eigentlich überflüssig. Wenn sich der Programmcode jedoch in einer anderen Mappe (welche nicht die aktive Mappe ist) oder einem Add-In befindet, so läuft das Programm nach der Zeile "ActiveWorkbook.Close" weiter, da die aktive Mappe geschlossen wurde und nicht die Code-enthaltende Mappe (ThisWorkbook).

Verwandte Codebeispiele

Arbeitsmappe schliessen

Arbeitsmappe schliessen ohne speichern

Arbeitsmappe schliessen mit automatischem Speichern

Alle Arbeitsmappen schliessen ohne speichern und "Änderungen speichern?"-Aufforderung

Alle Arbeitsmappen schliessen

Alle Arbeitsmappen schliessen mit automatischem Speichern

To Top


Arbeitsmappe schliessen mit automatischem Speichern

.Beschreibung
Diese Codebeispiele zeigen, wie eine Arbeitsmappe beim Schliessen automatisch gespeichert wird, d.h. ohne dass die Rückfrage "Sollen Ihre Änderungen in <Datei> gespeichert werden?" erscheint.

Wenn die Arbeitsmappe keine Änderungen enthält, wird bei Ausführen der Close-Methode die Mappe immer ohne zu Speichern geschlossen. Also auch dann, wenn der SaveChanges-Parameter explizit auf True gesetzt wird. Dieser Parameter wird nur berücksichtigt, wenn die Arbeitsmappe Änderungen besitzt, die noch nicht gespeichert wurden. Dies kann man anhand der Saved-Eigenschaft herausfinden.

Siehe auch MS KB-Artikel:
  XL97/XL2000/XL2002: How to Suppress "Save Changes?" Prompt When You Close a Workbook
  http://support.microsoft.com/?kbid=213428

.VBA-Code #1
'Diese Arbeitsmappe
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  If ThisWorkbook.Saved = False Then
    ThisWorkbook.Save
  End If
End Sub

.VBA-Code #2
Sub Auto_Close()
  If ThisWorkbook.Saved = False Then
    ThisWorkbook.Save
  End If
End Sub

.VBA-Code #3
Sub CloseWorkbook1()
  If ActiveWorkbook.Saved = False Then
    ActiveWorkbook.Save
  End If

  ActiveWorkbook.Close
End Sub

.VBA-Code #4
Sub CloseWorkbook2()
  ActiveWorkbook.Saved = False
  ActiveWorkbook.Close SaveChanges:=True
End Sub

Verwandte Codebeispiele

Arbeitsmappe schliessen

Arbeitsmappe schliessen ohne speichern

Arbeitsmappe schliessen ohne "Änderungen speichern?"-Aufforderung

Arbeitsmappe speichern

To Top


Arbeitsmappe schliessen mit automatischem Speichern unter einem anderen Dateinamen

.Beschreibung
Dieses Codebeispiel erledigt folgendes:

- Die Arbeitsmappe wird geschlossen, wobei sie automatisch unter einem anderen Dateinamen gespeichert wird.

- Die Rückfrage "Sollen Ihre Änderungen in <Datei> gespeichert werden?" wird unterdrückt.

.VBA-Code #1
'Diese Arbeitsmappe
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  ThisWorkbook.SaveAs "C:\Daten\AndereMappe.xls"
End Sub

.VBA-Code #2
Sub Auto_Close()
  ThisWorkbook.SaveAs "C:\Daten\AndereMappe.xls"
End Sub

.VBA-Code #3
Sub CloseWorkbook1()
  ActiveWorkbook.SaveAs "C:\Daten\AndereMappe.xls"
  ActiveWorkbook.Close
End Sub

.VBA-Code #4
Sub CloseWorkbook2()
  ActiveWorkbook.Saved = False
  ActiveWorkbook.Close SaveChanges:=True, Filename:="C:\Daten\AndereMappe.xls"
End Sub

Verwandte Codebeispiele

Arbeitsmappe schliessen

Arbeitsmappe schliessen mit automatischem Speichern

Arbeitsmappe schliessen ohne speichern

Arbeitsmappe schliessen ohne "Änderungen speichern?"-Aufforderung

Arbeitsmappe speichern

To Top


Arbeitsmappe schliessen mit automatischem Erstellen einer Sicherungskopie

.Beschreibung
Die nachfolgenden Codebeispiele erledigen folgendes:

- Die Arbeitsmappe wird geschlossen.

- Wenn die Arbeitsmappe keine aktuellen Änderungen enthält, wird sie ohne Speichern geschlossen.

- Wenn die Arbeitsmappe nicht-gespeicherte Änderungen enthält, wird die Rückfrage "Sollen Ihre Änderungen in <Datei> gespeichert werden?" angezeigt.

- Wird die Rückfrage mit 'Ja' beantwortet, wird die Arbeitsmappe gespeichert und automatisch eine Sicherungskopie der Mappe erstellt.

- Wird die Rückfrage mit 'Nein' beantwortet, wird die Arbeitsmappe geschlossen, wodurch die Änderungen verworfen werden. Es wird keine Sicherungskopie erstellt.

.VBA-Code #1
'Diese Arbeitsmappe
Private Sub Workbook_BeforeClose(Cancel As Boolean)

End Sub

.VBA-Code #2
Sub Auto_Close()

End Sub

.VBA-Code #3
Sub CloseWorkbook1()

End Sub

.VBA-Code #4
Sub CloseWorkbook2()

End Sub

Verwandte Codebeispiele

Arbeitsmappe schliessen

Arbeitsmappe schliessen mit automatischem Speichern

Arbeitsmappe schliessen ohne speichern

Arbeitsmappe schliessen ohne "Änderungen speichern?"-Aufforderung

Arbeitsmappe speichern

To Top

Excel beenden mit Schliessen aller Arbeitsmappen ohne "Änderungen speichern"-Aufforderung

.Beschreibung
Es gibt mehrere Möglichkeiten, wie alle geöffneten Mappen geschlossen und Excel beendet werden können, ohne dass bei jeder Arbeitsmappe die Rückfrage "Änderungen speichern" erscheint. Hier die wohl kürzeste VBA-Lösung.

.VBA-Code
Sub ExitExcel()
  Application.DisplayAlerts = False
  Application.Quit
End Sub

.Hinweis
Beachten Sie, dass mit Application.Quit die in den Arbeitsmappen vorhandenen Auto_Close-Makros ausgeführt werden. Wenn diese Makros ignoriert werden sollen, muss mit der Close-Methode gearbeitet und jede Mappe einzeln geschlossen werden (beispielsweise die Anweisung Workbooks(1).Close schliesst die erste Arbeitsmappe ohne die Ausführung des in der Mappe vorhandenen Auto_Close-Makros).

Verwandte Codebeispiele

Excel beenden

Excel beenden mit Schliessen aller Arbeitsmappen ohne Ausführung von Auto_Close-Makros

 

Weitere Informationen

Excel-Objektmodell: Methoden des Application-Objektes

To Top


Speichern eines Arbeitsblattes als Bilddatei im GIF- oder JPEG-Format

.Beschreibung
Mit der Beispiel-Prozedur ExportWorksheetAsPicture wird der Inhalt des aktiven Tabellenblattes als GIF-Bilddatei im Ordner "C:\Daten" gespeichert.

.Autor
Hans W. Herber, www.herber.de (Anpassungen durch Philipp von Wartburg)

.VBA-Code
Sub ExportWorksheetAsPicture()
  Dim chtPicture As Chart
  Dim strSheetName As String
  Application.ScreenUpdating = False
  strSheetName = ActiveSheet.Name
  ActiveSheet.Range(ActiveSheet.UsedRange.Address).CopyPicture Appearance:=xlScreen, Format:=xlPicture
  Set chtPicture = Charts.Add
  chtPicture.Paste
  chtPicture.Export "C:\Daten\" & strSheetName & ".gif"
  Application.DisplayAlerts = False
  chtPicture.Delete
  Application.DisplayAlerts = True
  Set chtPicture = Nothing
  Application.ScreenUpdating = True

End Sub

Weitere Informationen

Excel-Objektmodell: Methoden des Chart-Objektes

To Top


Dateien eines Ordners mit allen Datei-Attributen auflisten

.Beschreibung
Mit der hier vorgestellten Komplettlösung wird eine Liste aller Arbeitsmappendateien (xls-Dateityp) eines einzelnen Ordners erstellt. Zu jeder Datei werden die Dateiattribute angegeben.

Damit das VBA-Programm ausgeführt werden kann, muss im VBA-Projekt ein Verweis auf die Bibliothek "Microsoft Scripting Runtime" (scrrun.dll) gesetzt werden.

.VBA-Code
Sub GetFileProperties()
  Dim objFSO As FileSystemObject
  Dim objOrdner As Scripting.Folder
  Dim objDatei As Scripting.File
  Dim varVerzeichnis As Variant
  Dim intCounter As Integer
  Dim intSheets As Integer

  varVerzeichnis = Application.InputBox(Prompt:="Bitte geben Sie einen Pfadnamen ein:", _

    Title:="Verzeichnis bestimmen", Default:=ThisWorkbook.Path, Type:=2)
  If VarType(varVerzeichnis) = vbBoolean Or Trim$(varVerzeichnis) = "" Then
    Exit Sub
  End If

  Set objFSO = New FileSystemObject
  On Error Resume Next
  Set objOrdner = objFSO.GetFolder(varVerzeichnis)
  If Err.Number = 76 Then
    MsgBox "Der eingegebene Pfadname '" & varVerzeichnis & "' existiert nicht!" & _

      vbCrLf & vbCrLf & "Dateiliste kann nicht erstellt werden.", vbExclamation
    Set objFSO = Nothing
    Exit Sub
  End If
  On Error GoTo 0

  intCounter = 9


  Application.ScreenUpdating = False
  Application.StatusBar = "Existierende Dateiliste wird geprüft..."
  For intSheets = 1 To ActiveWorkbook.Worksheets.Count
    If ActiveWorkbook.Worksheets(intSheets).Name = "Dateiliste" Then
      Application.DisplayAlerts = False
      ActiveWorkbook.Worksheets("Dateiliste").Delete
      Application.DisplayAlerts = True
      Exit For
    End If
  Next intSheets
  Application.StatusBar = "Dateiliste wird erstellt..."

  ActiveWorkbook.Worksheets.Add
  ActiveSheet.Name = "Dateiliste"

  ActiveSheet.Cells(1, 1) = "Liste der xls-Dateien"
  ActiveSheet.Cells(1, 1).Font.Bold = True
  ActiveSheet.Cells(1, 1).Font.Size = 12
  ActiveSheet.Cells(3, 1) = "Verzeichnis:"
  ActiveSheet.Cells(3, 2) = ""
  ActiveSheet.Cells(4, 1) = "Anzahl xls-Dateien:"
  ActiveSheet.Cells(4, 2) = ""
  ActiveSheet.Cells(5, 1) = "Grösse xls-Dateien:"
  ActiveSheet.Cells(5, 2) = ""
  ActiveSheet.Cells(5, 3) = "Bytes"
  ActiveSheet.Cells(6, 1) = "Anzahl aller Dateien:"
  ActiveSheet.Cells(6, 2) = objOrdner.Files.Count
  ActiveSheet.Cells(7, 1) = "Grösse aller Dateien:"
  ActiveSheet.Cells(7, 2) = objOrdner.Size
  ActiveSheet.Cells(7, 3) = "Bytes"

  ActiveSheet.Cells(intCounter, 1) = "Datei"
  ActiveSheet.Cells(intCounter, 2) = "Grösse"
  ActiveSheet.Cells(intCounter, 3) = "Pfad"
  ActiveSheet.Cells(intCounter, 4) = "Erstellt am"
  ActiveSheet.Cells(intCounter, 5) = "Geöffnet am"
  ActiveSheet.Cells(intCounter, 6) = "Geändert am"
  ActiveSheet.Cells(intCounter, 7) = "Dateityp"
  ActiveSheet.Cells(intCounter, 8) = "Dateiname kurz"
  ActiveSheet.Cells(intCounter, 9) = "Pfadname kurz"
  ActiveSheet.Cells(intCounter, 10) = "Attribute"
  With ActiveSheet.Range("A9:J9")
    .Font.Bold = True
    .Interior.ColorIndex = 15
    .Interior.Pattern = xlSolid
    .Interior.PatternColorIndex = xlAutomatic
  End With

  For Each objDatei In objOrdner.Files
    If objFSO.GetExtensionName(objDatei.Path) = "xls" Then
      intCounter = intCounter + 1
      ActiveSheet.Cells(intCounter, 1) = objDatei.Name
      ActiveSheet.Cells(intCounter, 2) = objDatei.Size
      ActiveSheet.Cells(intCounter, 3) = objDatei.Path
      ActiveSheet.Cells(intCounter, 4) = objDatei.DateCreated
      ActiveSheet.Cells(intCounter, 5) = objDatei.DateLastAccessed
      ActiveSheet.Cells(intCounter, 6) = objDatei.DateLastModified
      ActiveSheet.Cells(intCounter, 7) = objDatei.Type
      ActiveSheet.Cells(intCounter, 8) = objDatei.ShortName
      ActiveSheet.Cells(intCounter, 9) = objDatei.ShortPath
      ActiveSheet.Cells(intCounter, 10) = GetFileAttributes(objDatei.Attributes)
    End If
  Next
  ActiveSheet.Cells(4, 2) = intCounter - 9
  ActiveSheet.Cells(5, 2) = Application.WorksheetFunction.Sum(ActiveSheet.Range("B10:B" & intCounter))

  ActiveSheet.Range("B10:B" & intCounter).NumberFormat = "#,##0"
  ActiveSheet.Range("B4:B7").NumberFormat = "#,##0"
  ActiveSheet.Columns("A:J").AutoFit

  ActiveSheet.Cells(3, 2) = objOrdner.Path

  Application.ScreenUpdating = True
  Application.StatusBar = "Dateiliste wurde erstellt."
  MsgBox "Die Dateiliste von Ordner '" & varVerzeichnis & "' wurde erstellt."
  Application.StatusBar = False

  Set objOrdner = Nothing
  Set objFSO = Nothing
End Sub

Function GetFileAttributes(intAttributes) As String
  Dim strAttributesNames As String
  strAttributesNames = ""
  If intAttributes >= 2048 Then
    strAttributesNames = "Komprimiert"
    intAttributes = intAttributes - 2048
  End If
  If intAttributes >= 32 Then
    If strAttributesNames = "" Then
      strAttributesNames = "Archiv"
    Else
      strAttributesNames = strAttributesNames & ", Archiv"
    End If
    intAttributes = intAttributes - 32
  End If
  If intAttributes = 7 Then
    strAttributesNames = strAttributesNames & ", Schreibgeschützt, Verborgen, System"
  ElseIf intAttributes = 6 Then
    strAttributesNames = strAttributesNames & ", Verborgen, System"
  ElseIf intAttributes = 5 Then
    strAttributesNames = strAttributesNames & ", Schreibgeschützt, System"
  ElseIf intAttributes = 4 Then
    strAttributesNames = strAttributesNames & ", System"
  ElseIf intAttributes = 3 Then
    strAttributesNames = strAttributesNames & ", Schreibgeschützt, Verborgen"
  ElseIf intAttributes = 2 Then
    strAttributesNames = strAttributesNames & ", Verborgen"
  ElseIf intAttributes = 1 Then
    strAttributesNames = strAttributesNames & ", Schreibgeschützt"
  ElseIf intAttributes = 0 Then
    If strAttributesNames = "" Then
      strAttributesNames = "(Normal)"
    End If
  End If
  GetFileAttributes = strAttributesNames
End Function

Verwandte Codebeispiele

Datei-Attribute abfragen und als Text ausgeben

Attribute der Dateien eines Ordners zurücksetzen

 

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Attribute der Dateien eines Ordners zurücksetzen

.Beschreibung
Mit der folgenden Prozedur werden die Datei-Attribute aller Dateien eines Ordner auf 'Normal' zurückgesetzt.

Als exemplarisches Beispiel werden nur die Arbeitsmappen (xls-Dateien) des Ordners berücksichtigt, welcher als Argument (strPath) der Prozedur übergeben wurde. Die Prüfung auf Laufzeitfehler ist notwendig, da eine Datei gesperrt sein könnte (wenn sie gerade bearbeitet wird). Der Aufruf der SetAttr-Anweisung führt in diesem Fall zum Laufzeitfehler 75 "Zugriff auf Datei verweigert".

.VBA-Code
Sub ResetFilesAttributes(strPath As String)
  Dim intCounter As Integer
  Dim astrFiles() As String
  Dim strFile As String
  If Right$(strPath, 1) <> "\" Then strPath = strPath & "\"
  strFile = Dir(strPath & "*.xls")
  Do While strFile <> ""
    intCounter = intCounter + 1
    ReDim Preserve astrFiles(1 To intCounter)
    astrFiles(intCounter) = strFile
    strFile = Dir()
  Loop
  On Error Resume Next
  For intCounter = 1 To UBound(astrFiles)
    SetAttr strPath & astrFiles(intCounter), vbNormal
    If Err.Number = 75 Then
      MsgBox "Zugriff auf Datei " & strPath & astrFiles(intCounter) & " verweigert!"

      Err.Clear
    End If
  Next intCounter
End Sub

'*** Aufruf ***
Sub TestCall()
  Call ResetFilesAttributes("C:\Daten")
End Sub

Verwandte Codebeispiele

Dateien eines Ordners mit allen Datei-Attributen auflisten

 

Weitere Informationen

VBA-Befehle und -Funktionen

To Top


Dokument-Eigenschaften der Dateien eines Ordners auflisten

.Beschreibung
Mit dieser VBA-Prozedur wird eine Liste aller Dateien eines Ordners erstellt, wobei zu jeder Datei die wichtigsten Dokument-Eigenschaften aufgeführt werden. Die Eigenschaften sind:
- Autor
- Manager
- Firma
- Titel
- Thema
- Kategorie
- Stichwörter
- Kommentar

Diese Eigenschaften werden nur dann angegeben, wenn es sich bei einer Datei um ein Dokument handelt, weil nur Dokument-Dateien diese Eigenschaften besitzen.

Die Liste wird auf einem neuen Arbeitsblatt der aktiven Arbeitsmappe erstellt.

.VBA-Code
Sub ListFilesWithDocumentProperties()
  Dim objDSOReader As Object
  Dim objDSODocument As Object
  Dim wksSheet As Worksheet
  Dim intFile As Integer
  Dim astrFiles() As String
  Dim strFile As String
  Dim strPath As String

  strPath = "C:\Daten"
  If Right$(strPath, 1) = "\" Then
    strPath = Left$(strPath, Len(strPath) - 1)
  End If
  strFile = Dir(strPath & "\*.*")
  Do While strFile <> ""
    intFile = intFile + 1
    ReDim Preserve astrFiles(1 To intFile)
    astrFiles(intFile) = strFile
    strFile = Dir()
  Loop
  If intFile > 0 Then
    Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
    Set wksSheet = ActiveWorkbook.Worksheets.Add
    wksSheet.Range("A1:I1").Value = Array("Datei", "Autor", "Manager", "Firma", "Titel", "Thema", "Kategorie", "Stichwörter", "Kommentar")
    wksSheet.Range("A1:I1").Font.Bold = True
    On Error Resume Next
    For intFile = 1 To UBound(astrFiles)
      Set objDSODocument = objDSOReader.GetDocumentProperties(strPath & "\" & astrFiles(intFile))
      If Err.Number <> 0 Then
        Err.Clear
        With wksSheet
          .Cells(intFile + 1, 1).Value = astrFiles(intFile)
          .Cells(intFile + 1, 2).Value = "(Fehler aufgetreten)"
        End With
      Else
        With wksSheet
          .Cells(intFile + 1, 1).Value = astrFiles(intFile)
          .Cells(intFile + 1, 2).Value = objDSODocument.Author
          .Cells(intFile + 1, 3).Value = objDSODocument.Manager
          .Cells(intFile + 1, 4).Value = objDSODocument.Company
          .Cells(intFile + 1, 5).Value = objDSODocument.Title
          .Cells(intFile + 1, 6).Value = objDSODocument.Subject
          .Cells(intFile + 1, 7).Value = objDSODocument.Category
          .Cells(intFile + 1, 8).Value = objDSODocument.Keywords
          .Cells(intFile + 1, 9).Value = objDSODocument.Comments
        End With
      End If
      Set objDSODocument = Nothing
    Next intFile
    wksSheet.Range("A1:I1").Columns.EntireColumn.AutoFit
    Set wksSheet = Nothing
    Set objDSOReader = Nothing
  Else
    MsgBox "Keine Dateien gefunden."
  End If
End Sub

Verwandte Codebeispiele

Dateien eines Ordners mit allen Datei-Attributen auflisten

 

Weitere Informationen

VBA-Spezialthema: OLE Document Properties (DSOFile)

To Top


Arbeitsblatt als neue Arbeitsmappe speichern

.Beschreibung
Am einfachsten wird ein einzelnes Arbeitsblatt als neue Arbeitsmappe gespeichert, indem das Blatt zuerst kopiert (wodurch automatisch eine neue Mappe angelegt wird) und anschliessend wie gewohnt gespeichert wird. Im Beispiel wird das aktive Arbeitsblatt verwendet.

.VBA-Code
Sub SaveActiveSheet()
  ActiveSheet.Copy
  ActiveWorkbook.SaveAs "C:\Daten\EinzelnesBlatt.xls"

End Sub

.Hinweis
Beachten Sie unbedingt, dass durch das Kopieren des Arbeitsblattes alle Zelltexte, die mehr als 255 Zeichen lang sind, automatisch auf 255 Zeichen gekürzt werden.

Verwandte Codebeispiele

Selektierte Arbeitsblätter als neue Arbeitsmappe speichern

 

Weitere Informationen

Excel-Objektmodell: Methoden des Workbook-Objektes

To Top


Selektierte Arbeitsblätter als neue Arbeitsmappe speichern

.Beschreibung
Eine lediglich zwei Codezeilen umfassende VBA-Prozedur genügt zum Speichern der selektierten Arbeitsblätter als neue Arbeitsmappendatei. In der Prozedur werden zuerst die selektierten Blätter in eine neue, automatisch erstellte Mappe kopiert, indem auf die SelectedSheets-Eigenschaft des Window-Objektes zugegriffen und danach die Mappe gespeichert wird.

.VBA-Code
Sub SaveSelectedSheets()
  ActiveWorkbook.Windows(1).SelectedSheets.Copy
  ActiveWorkbook.SaveAs "C:\Daten\SelektierteBlätter.xls"

End Sub

.Hinweis
Beachten Sie unbedingt, dass durch das Kopieren eines Arbeitsblattes alle Zelltexte, die mehr als 255 Zeichen lang sind, automatisch auf 255 Zeichen gekürzt werden.

Weitere Informationen

Arbeitsblatt als neue Arbeitsmappe speichern

Speichern eines Arbeitsblattes ohne eingebettete Objekte, Formeln und VBA-Programmcode

Excel-Objektmodell: Methoden des Workbook-Objektes

To Top


Speichern eines Arbeitsblattes ohne eingebettete Objekte, Formeln und VBA-Programmcode

.Beschreibung
Dieses Makro speichert das aktive Arbeitsblatt als neue Arbeitsmappe (xls-Datei), wobei vorher alle eingebetteten Objekte (OLE Objekte) entfernt, alle Formelzellen in Werte umgewandelt und der dem Arbeitsblatt hinterlegte VBA-Programmcode gelöscht werden.

.Autor
Hans W. Herber, www.herber.de (Anpassungen durch Philipp von Wartburg)

.VBA-Code
Sub SaveActiveSheetDataOnly()
  Dim wkbWorkbook As Workbook
  ActiveSheet.Copy
  Set wkbWorkbook = ActiveWorkbook
  'Delete all OLE Objects
  ActiveSheet.OLEObjects.Delete
  'Convert all Formulas to their Values
  ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value
  'Delete VBA Code behind the active Sheet
  With wkbWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
    .DeleteLines 1, .CountOfLines
  End With
  ActiveWorkbook.SaveAs Application.DefaultFilePath & "\DataOnly.xls"
End Sub

.Hinweis
Beachten Sie unbedingt, dass beim Kopieren des Arbeitsblattes alle Zelltexte, welche länger als 255 Zeichen sind, automatisch auf 255 Zeichen gekürzt werden. Eine Meldung wird dabei nicht angezeigt.

To Top


Speichern einer Arbeitsmappe ohne Ausführung von VBA-Code im BeforeSave-Ereignis

.Beschreibung
Gelegentlich kommt es vor, dass man Programmcode in das BeforeSave-Ereignis der Arbeitsmappe eingefügt hat, aber nicht möchte, dass dieser Code bei jeder Speicherung der Mappe ausgeführt wird. Dieses Beispiel zeigt, wie das BeforeSave-Ereignis deaktiviert werden kann.

.VBA-Code #1
Sub SaveBookWithoutBeforeSaveEvent1()
  Application.EnableEvents = False
  ActiveWorkbook.Save
  Application.EnableEvents = True
End Sub

.VBA-Code #2
Sub SaveBookWithoutBeforeSaveEvent2()
  Application.EnableEvents = False
  Workbooks("EineMappe.xls").Save
  Application.EnableEvents = True
End Sub

.Hinweis
Beachten Sie bitte, dass nach dem Speichern die Ereignisse wieder aktiviert werden sollten.

To Top


Neue Arbeitsmappe anlegen und automatisch Open-Ereignisprozedur einfügen

.Beschreibung
Das folgende Beispiel zeigt, wie man eine neue Arbeitsmappe erstellen kann, in die automatisch VBA-Programmcode in die Ereignisprozedur Workbook_Open eingefügt wird.

.Autor
Hans W. Herber, www.herber.de (Anpassungen durch Philipp von Wartburg)

.VBA-Code
Sub OpenProzedurAnlegen()
  Dim wbkWorkbook As Workbook
  Dim objModule As Object
  Set wbkWorkbook = Workbooks.Add
  Set objModule = wbkWorkbook.VBProject.VBComponents("DieseArbeitsmappe")
  With objModule.CodeModule
    .InsertLines 3, "Private Sub Workbook_Open()"
    .InsertLines 4, "  MsgBox ""Ich befinde mich in Workbook_Open"""
    .InsertLines 5, "End Sub"
  End With
  Set objModule = Nothing

  Set wbkWorkbook = Nothing
End Sub

To Top


Kurzer Dateiname zu einem langen Dateinamen ermitteln

.Beschreibung
Hier wird vorgestellt, wie man den kurzen Datei- bzw. Pfadnamen einer Datei anhand ihres langen Namens erhält. In Windows wird die kurze Schreibweise oft auch "MS-DOS-Name" genannt.

» Die in Beispiel #1 vorgestellte Funktion GetShortName gibt den kurzen Datei- und Pfadnamen einer Datei zurück, indem die Windows API-Funktion GetShortPathName aufgerufen wird. Diese ermittelt die korrekte Schreibweise des kurzen Namens.

» Das Beispiel #2 verwendet das FileSystemObject-Objekt, welches über eine spezielle Eigenschaft ShortPath (Eigenschaft des File-Objektes) zum Ermitteln des kurzen Datei- und Pfadnamens verfügt. Da man ein File-Objekt direkt über die Methode GetFile erhält, wird lediglich eine einzige Programmzeile benötigt.

.Autor
» VBA-Code #1: Microsoft Support
Siehe auch MS KB-Artikel:
  HOWTO: Get a Short Filename from a Long Filename
  http://support.microsoft.com/?kbid=175512

» VBA-Code #2: Philipp von Wartburg

.VBA-Code #1
'Deklarationsbereich
Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" _
  (ByVal lpszLongPath As String, ByVal lpszShortPath As String, _
  ByVal cchBuffer As Long) As Long

'Codemodul
Public Function GetShortName(ByVal sLongFileName As String) As String
  Dim lRetVal As Long

  Dim sShortPathName As String
  Dim iLen As Integer
  sShortPathName = Space(255)
  iLen = Len(sShortPathName)
  lRetVal = GetShortPathName(sLongFileName, sShortPathName, iLen)
  GetShortName = Left(sShortPathName, lRetVal)
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox GetShortName("C:\Meine Excel-Daten\Mappe mit langem Namen.xls")
End Sub

.VBA-Code #2
Sub GetShortFilePath
  MsgBox CreateObject("Scripting.FileSystemObject").GetFile("C:\Meine Excel-Daten\Mappe mit langem Namen.xls").ShortPath
End Sub

Verwandte Codebeispiele

Langer Dateiname zu einem kurzen Dateinamen ermitteln

Kurzer Pfadname zu einem langen Pfadnamen ermitteln

 

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Langer Dateiname zu einem kurzen Dateinamen ermitteln

.Beschreibung
Manchmal besitzen Sie nur den kurzen Namen einer Datei (den so genannten "MS-DOS-Name"), möchten aber den langen Dateinamen wissen. Die Funktion GetLongName gibt den langen Datei- und Pfadnamen einer Datei zurück.

.Autor
Microsoft Support (Anpassungen durch Philipp von Wartburg)

Siehe auch MS KB-Artikel:
  HOWTO: Get a Long Filename from a Short Filename
  http://support.microsoft.com/?kbid=154822

.VBA-Code
Function GetLongName(ByVal sShortName As String) As String
  Dim sLongName As String
  Dim sTemp As String
  Dim iSlashPos As Integer
  'Zeichen "\" hinzufügen, damit InStr in jedem Fall ein Pfadtrennzeichen findet
  sShortName = sShortName & "\"
  'Ab der vierten Position suchen, damit das Laufwerk nicht berücksichtigt wird ("[Laufwerk]:\")
  iSlashPos = InStr(4, sShortName, "\")
  'Zeichenfolgen zwischen den "\"-Zeichen umwandeln
  While iSlashPos
    sTemp = Dir(Left$(sShortName, iSlashPos - 1), vbNormal + vbHidden + vbSystem + vbDirectory)
    If sTemp = "" Then
      'Die Datei bzw. der Ordner ist nicht vorhanden
      GetLongName = ""
      Exit Function
    End If
    sLongName = sLongName & "\" & sTemp
    iSlashPos = InStr(iSlashPos + 1, sShortName, "\")
  Wend
  'Laufwerk voranstellen
  GetLongName = Left$(sShortName, 2) & sLongName
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox GetLongName("C:\PROGRA~1\MICROS~1\VORLAGEN\MUSTER~1.XLT")
End Sub

.Hinweis
Die Dir-Funktion zeigt hier eine ziemlich erstaunliche Fähigkeit: Sie akzeptiert auch kurze Dateinamen und gibt den langen Dateinamen zurück. Zum Beispiel liefert die Anweisung

  MsgBox Dir("Muster~1.xls")

das Ergebnis "Mustermappe.xls".

Das Ganze funktioniert auch mit Verzeichnispfaden, wobei jedoch nur der letzte Ordner des Pfades zurückgegeben wird. Beispielsweise die Anweisung

  MsgBox Dir("D:\PROGRA~1\MICROS~1", vbDirectory)

gibt den langen Ordnernamen "Microsoft Office" aus.

Verwandte Codebeispiele

Kurzer Dateiname zu einem langen Dateinamen ermitteln

Kurzer Pfadname zu einem langen Pfadnamen ermitteln

 

Weitere Informationen

VBA-Befehle und -Funktionen

To Top


UNC-Pfad eines Netzlaufwerkes ermitteln

.Beschreibung
Durch eine netzwerkweit einheitliche Namensvergabe erleichtern UNC-Pfade den Zugriff auf Dateien, die zum Beispiel auf dem Netzwerkserver gespeichert sind. So finden Sie dasselbe Dokument nicht einmal auf Laufwerk Z: und ein anderes Mal auf Laufwerk M: sondern immer unter einer einheitlichen Pfadangabe wie beispielsweise "\\SERVER\Dokumente\MeineMappe.xls".

Den UNC-Pfad eines Serverlaufwerkes kann mittels API-Funktion ermittelt werden. Das folgende Codebeispiel zeigt eine Funktion namens GetUNCPath, welche den API-Aufruf vornimmt. Übergeben Sie der Funktion den Laufwerkbuchstaben eines gemappten Laufwerkes inklusive Doppelpunkt (z.B. "M:").

.Autor
Unbekannt (der VBA-Code stammt aus einem Newsletter von Smarttools, www.smarttools.de; Anpassungen durch Philipp von Wartburg)

.VBA-Code
'Deklarationsbereich
Declare Function WNetGetConnection Lib "mpr.dll" Alias "WNetGetConnectionA" (ByVal lpszLocalName _
   As String, ByVal lpszRemoteNameAs String, cbRemoteName As Long) As Long
Const NO_ERROR As Long = 0

'Codemodul
Function GetUNCPath(ByVal strDriveLetter As String) As String
  Dim lpszLocalName As String
  Dim lpszRemoteName As String
  Dim cbRemoteName As Long
  Dim lRetval As Long
  On Error GoTo ErrorHandler
  lpszLocalName = strDriveLetter
  lpszRemoteName = Space(255)
  cbRemoteName = Len(lpszRemoteName)
  lRetval = WNetGetConnection(lpszLocalName, lpszRemoteName, cbRemoteName)
  If lRetval = NO_ERROR Then
    GetUNCPath = RTrim(lpszRemoteName)
  Else
    GetUNCPath = ""
  End If
  Exit Function
ErrorHandler:
  GetUNCPath = ""
  Exit Function
End Function

'*** Aufruf ***
Sub TestCall()
  Dim strUNCPath As String
  strUNCPath = GetUNCPath("Z:")
  If strUNCPath <> "" Then
    MsgBox "Der UNC-Pfad lautet " & strUNCPath & "."
  Else
    MsgBox "Der UNC-Pfad konnte nicht ermittelt werden."
  End If
End Sub

Wenn Sie beispielsweise den UNC-Pfad der aktiven Arbeitsmappe herausfinden möchten, übergeben Sie der obigen Funktion die ersten beiden Zeichen des Arbeitsmappenpfades:

  MsgBox GetUNCPath(Left(ActiveWorkbook.Path, 2))

Voraussetzung dafür ist, dass sich die aktive Arbeitsmappe auf einem verbundenem Netzwerklaufwerk befindet, welchem ein Laufwerk-Buchstabe zugeordnet wurde.

Verwandte Codebeispiele

Prüfen, ob ein Pfadname ein UNC-Pfad ist

Laufwerk aus einem UNC-Pfad extrahieren

Share-Name (Freigabename) eines Laufwerkes abfragen

To Top


Verknüpfungen beim Öffnen einer Arbeitsmappe nicht aktualisieren

.Beschreibung
Es existiert keine direkte Möglichkeit, die automatischen Verknüpfungen beim Öffnen einer Arbeitsmappe nicht zu aktualisieren. Die einzige Umgehungslösung besteht darin, zuerst eine andere Arbeitsmappe zu öffnen (eine Art Hilfsmappe), in derer Auto_Open-Makro dann die eigentliche Mappe anhand der Open-Methode unter Angabe des UpdateLinks-Argumentes zu öffnen und zum Schluss die Hilfsmappe zu schliessen.

.VBA-Code
Sub Auto_Open()
  Workbooks.Open "C:\Daten\MeineMappe.xls", UpdateLinks:=0
  ThisWorkbook.Close False
End Sub

.Hinweis
Wenn das Argument UpdateLinks weggelassen wird, erscheint die Rückfragemeldung "Automatische Verknüpfungen aktualisieren?", sofern die Option "Aktualisieren von automatischen Verknüpfungen bestätigen" eingeschaltet ist. Diese Option ist in Microsoft Excel standardmässig aktiviert und kann im Optionen-Dialog (Menübefehl Extras/Optionen) oder anhand der Eigenschaft AskToUpdateLinks des Application-Objektes geändert werden.

Verwandte Codebeispiele

Arbeitsmappe öffnen

Rückfrage "Verknüpfungen aktualisieren" beim Öffnen einer Arbeitsmappe unterdrücken

To Top


Rückfrage "Verknüpfungen aktualisieren" beim Öffnen einer Arbeitsmappe unterdrücken

.Beschreibung
Wenn Sie eine Arbeitsmappe öffnen, die automatische Verknüpfungen enthält, erscheint oft die Rückfragemeldung "Automatische Verknüpfungen aktualisieren?". Ob die Meldung erscheint, hängt von der Einstellung der für die gesamte Excel-Sitzung geltenden Option "Aktualisieren von automatischen Verknüpfungen bestätigen" ab. Erfahrungsgemäss ist diese Option gewöhnlich aktiviert, sodass die Rückfrage eingeblendet wird. Indem die Eigenschaft AskToUpdateLinks auf False gesetzt wird, lässt sich die Anzeige der Rückfrage unterbinden.

.VBA-Code
Sub OpenWorkbook()
  Application.AskToUpdateLinks = False
  Workbooks.Open "C:\Daten\MeineMappe.xls"
End Sub

.Hinweis
Beachten Sie, dass dadurch die in der Arbeitsmappe enthaltenen Verknüpfungen aktualisiert werden.

Verwandte Codebeispiele

Verknüpfungen beim Öffnen einer Arbeitsmappe nicht aktualisieren

To Top


Speichern-Befehl für eine Arbeitsmappe sperren

.Beschreibung
Man kann die Speichern-Möglichkeit für eine Arbeitsmappe unterbinden, indem man den Cancel-Parameter im Workbook_BeforeSave-Ereignis auf True setzt, sofern das Ereignis nicht über den Speichern unter-Befehl in Excel ausgelöst wurde (SaveAsUI enthält False).

.VBA-Code
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  If Not SaveAsUI Then Cancel = True
End Sub

.Hinweis
Wenn sowohl Speichern als auch Speichern unter gesperrt werden sollen, ist die Prüfung von SaveAsUI zu entfernen:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  Cancel = True
End Sub

Verwandte Codebeispiele

Speichern unter-Befehl für eine Arbeitsmappe sperren

To Top


Speichern unter-Befehl für eine Arbeitsmappe sperren

.Beschreibung
Ähnlich wie beim Unterbinden der Speichern-Funktionalität kann man auch den Speichern unter-Menübefehl sperren. Genau genommen wird nicht der Menübefehl gesperrt sondern die dahinterstehende Aktion ignoriert. Der Befehl kann weiterhin im Menü angeklickt werden; nur passiert nichts.

.VBA-Code
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  If SaveAsUI Then Cancel = True
End Sub

.Hinweis
Wenn sowohl die Menübefehle Speichern als auch Speichern unter gesperrt werden sollen, ist die Überprüfung des SaveAsUI-Parameters zu entfernen:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  Cancel = True
End Sub

Verwandte Codebeispiele

Speichern-Befehl für eine Arbeitsmappe sperren

To Top


Eigene Excel-Startparameter definieren

.Beschreibung
Microsoft Excel besitzt mehrere Schalter und Parameter, mit denen man die Programmausführung steuern kann. Wenn man beispielsweise in der Befehlszeile nach dem Namen der Programmdatei Excel.exe eine Arbeitsmappendatei angibt, so wird diese Datei beim Programmstart geöffnet. Oder mit dem Startparameter "/e" kann man festlegen, dass das Startfenster nicht eingeblendet und keine leere Mappe geöffnet wird. Der Startparameter "/e" kann für eigene Zwecke 'missbraucht' werden, da er der einzige Parameter ist, bei dem Excel es zulässt, dass nach dem Parametername (d.h. dem Buchstabe "e") eine beliebige Zeichenfolge mitgegeben wird.

Die zum Starten eines Windows-Programmes benutzte Befehlszeile kann anhand der API-Funktion GetCommandLine ausgelesen werden. Bei Microsoft Excel funktioniert dies ebenfalls. Die Abfrage der Befehlszeile erfolgt vorzugsweise in der Workbook_Open-Ereignisprozedur einer Arbeitsmappe, damit beim Öffnen der Arbeitsmappe auf allfällig mitgegebene Parameter reagiert werden kann. Die Funktion StringFromPointer ist eine Hilfsfunktion und wird verwendet, um den auf die Befehlszeile zeigenden Pointer in eine Zeichenfolge umzuwandeln.

Fügen Sie den gesamten VBA-Code in das Modul "DieseArbeitsmappe" und speichern Sie die Mappe. Der Code wird aufgerufen, indem Sie Excel mit der Befehlszeile
  <Programmdatei> <Arbeitsmappendatei> /e/<Zeichenfolge>
ausführen.

Beispiel einer Befehlszeile:
  "C:\Programme\Microsoft Office\Excel.exe" "C:\Daten\MeineMappe.xls" /e/Philipp

Anstelle der Anweisung
  MsgBox "Es wurde die Zeichenfolge '" & strCommandLine & "' übergeben."
können Sie natürlich auch die Zeichenfolge auswerten und je nach Inhalt entsprechend reagieren. Zum Beispiel so:
  If strCommandLine = "Philipp" Then
    Call SubPhilipp
  Else
    Call SubNotPhilipp
  End If

.Autor
Michael Schwimmer, http://schwimmer.bei.t-online.de/index.htm (Grössere Anpassungen durch Philipp von Wartburg)

.VBA-Code
'Deklarationsbereich von Modul 'DieseArbeitsmappe'
Private Declare Function GetCommandLine& Lib "kernel32" Alias "GetCommandLineA" ()
Private Declare Function lstrlen Lib "kernel32" (ByVal str As Long) As Long
Private Declare Function lstrcpy Lib "kernel32" (ByVal dest As String, ByVal src As Long) As Long

'Modul 'DieseArbeitsmappe'

Private Sub Workbook_Open()
  Dim strCommandLine As String

  Dim intPosition As Integer
  'Befehlszeile auslesen
  strCommandLine = StringFromPointer(GetCommandLine())
  'Prüfen, ob "/e/" in der Befehlszeile enthalten ist
  intPosition = InStr(LCase(strCommandLine), "/e/")
  If intPosition > 0 Then
    '"/e/" wurde gefunden, daher Text nach "/e/" ausgeben

    strCommandLine = Mid$(strCommandLine, intPosition + 3)
    MsgBox "Es wurde die Zeichenfolge '" & strCommandLine & "' übergeben."
  Else
    '"/e/" wurde nicht gefunden

    MsgBox "Es wurde keine Zeichenfolge übergeben."
  End If
End Sub

'Modul 'DieseArbeitsmappe'

Private Function StringFromPointer(plngString As Long) As String
  Dim strResult As String

  Dim lngNumber As Long
  lngNumber = lstrlen(plngString)
  strResult = String(lngNumber, 0)
  lstrcpy strResult, plngString
  If InStr(strResult, Chr(0)) <> 0 Then
    strResult = Left$(strResult, InStr(strResult, Chr(0)) - 1)
  End If
  StringFromPointer = strResult
End Function

.Hinweis
Wenn Sie die übergebene Zeichenfolge dazu benutzen möchten, ein bestimmtes Arbeitsblatt zu aktivieren, so sollten Sie den obigen Programmcode nicht in die Ereignisprozedur Workbook_Open sondern in ein Makro namens Auto_Open einfügen. Vor allem dann, wenn die Möglichkeit besteht, dass die Arbeitsmappe mit Microsoft Excel 97 geöffnet wird. Excel 97 besitzt einen Bug, der verhindert, dass im Workbook_Open-Ereignis ein bestimmtes Arbeitsblatt aktiviert werden kann.

Mehr über dieses Problem erfahren Sie hier:
  XL97: Open Event Macro May Not Activate a Worksheet
  http://support.microsoft.com/?scid=kb;en-us;174319

Weitere Informationen

Excel-Startparameter (Übersicht und Beschreibung)

Fragen und Antworten: Kann man eigene Excel-Startparameter definieren?

To Top


Prüfen, ob ein Verzeichnis Dateien enthält

.Beschreibung
Mit der als Codebeispiel 1 vorgestellten Funktion kann getestet werden, ob ein bestimmtes Verzeichnis Dateien enthält oder leer ist. Das Codebeispiel 2 verwendet statt der Dir-Funktion von VBA die Count-Eigenschaft des Files- bzw. SubFolders-Objektes aus der FileSystemObject-Bibliothek. Der Vorteil dieser Lösung ist, dass sowohl die Anzahl Dateien als auch die Anzahl Unterverzeichnisse kontrolliert wird. Dadurch kann zuverlässig ermittelt werden, ob der angegebene Ordner tatsächlich komplett leer ist.

.Autor
Codebeispiel 1: Rob Bovey
Codebeispiel 2: Philipp von Wartburg

.VBA-Code #1
Public Function IsFolderEmpty(ByVal strPath As String) As Boolean
  Dim bolReturn As Boolean
  Dim strFiles As String
  bolReturn = True
  If Right$(strPath, 1) <> "\" Then strPath = strPath & "\"
  strFiles = Dir$(strPath & "*.*")
  If strFiles <> "" Then bolReturn = False
  IsFolderEmpty = bolReturn
End Function

'*** Aufruf ***
Sub TestCall()
  If IsFolderEmpty("C:\Daten") Then
    MsgBox "Das Verzeichnis ist leer (oder existiert nicht)."
  Else
    MsgBox "Das Verzeichnis ist nicht leer."
  End If
End Sub

.VBA-Code #2
Public Sub IsFolderEmpty2()
  Dim strFolder As String
  strFolder = "C:\Daten"
  If CreateObject("Scripting.FileSystemObject").GetFolder(strFolder).Files.Count = 0 And _
      CreateObject("Scripting.FileSystemObject").GetFolder(strFolder).SubFolders.Count = 0 Then
    MsgBox "Der Ordner " & strFolder & " ist leer."
  Else
    MsgBox "Der Ordner " & strFolder & " ist nicht leer."
  End If

End Sub

Weitere Informationen

VBA-Befehle und -Funktionen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Ordner löschen

.Beschreibung
Mit der VBA-Anweisung RmDir kann ein Ordner gelöscht werden, der allerdings keine Dateien oder Unterordner enthalten darf.

.VBA-Code
Sub RemoveDirectory()
  RmDir "C:\Daten\AlterOrdner"
End Sub

.Hinweis
Mit RmDir kann ein Ordner nur dann gelöscht werden, wenn er komplett leer ist. Der Ordner darf ausserdem nicht schreibgeschützt sein. Ein versteckter Ordner dagegen kann mit RmDir problemlos gelöscht werden. Die RmDir-Anweisung berücksichtigt jedoch keine Benutzerrechte. Das bedeutet, dass ein Ordner auch dann gelöscht werden kann, wenn der Benutzer keine Lösch- und/oder Schreib-Rechte besitzt.

RmDir akzeptiert auch relative Pfade. Wenn Sie beispielsweise das Unterverzeichnis "AlterOrdner" desjenigen Verzeichnisses löschen möchten, in welchem Sie sich gerade befinden (entspricht dem aktuellen Verzeichnis, das mit CurDir ermittelt werden kann), dann können Sie auch einfach

  RmDir "AlterOrdner"

schreiben, sprich nur den Ordnernamen ohne den gesamten Pfad. Der Vorteil ist, dass weder der Laufwerksbuchstabe, noch der Name des aktuellen Verzeichnisses, noch der Name von einem allfällig vorhandenen übergeordneten Verzeichnis (Parent Folder) bekannt sein muss. Befindet sich der Ordner auf der gleichen Ebene wie das aktuelle Verzeichnis, so funktioniert die Codezeile

  RmDir "../AlterOrdner"

ohne Probleme.

Ist der zu löschende Ordner nicht vorhanden oder ist der relative Pfad in Bezug auf das aktuelle Verzeichnis fehlerhaft, so erscheint der Laufzeitfehler 76 "Pfad nicht gefunden". Ist der Ordner nicht leer oder schreibgeschützt, erscheint der Laufzeitfehler 75 "Fehler bei Zugriff auf Pfad/Datei". Folglich müssen Sie mindestens diese beiden Laufzeitfehler abfangen. Oder Sie müssen vor dem Löschen überprüfen, ob der Ordner existiert und alle oben beschreibenen Voraussetzungen für das Löschen erfüllt sind.

Weitere Informationen

VBA-Befehle und -Funktionen

Relative Pfade

VBA-Spezialthema: VBA-Laufzeitfehler

 

Verwandte Codebeispiele

Ordner mit allen Unterordnern und Dateien löschen

Ordnerinhalt löschen (nur Dateien)

Prüfen, ob ein Ordner existiert

To Top


Ordner mit allen Unterordnern und Dateien löschen

.Beschreibung
Das Löschen eines gesamten Ordners mit allen enthaltenen Dateien und Unterordnern ist äusserst einfach, wenn man die DeleteFolder-Methode aus der FileSystemObject-Bibliothek benutzt. Man muss nur den zu löschenden Ordner angeben, und schon wird er samt Inhalt komplett entfernt.

Mit dieser Prozedur wird ein kompletter Ordner mit sämtlichen enthaltenen Dateien und Unterverzeichnissen gelöscht.

.Autor
Codebeispiel 1: Philipp von Wartburg
Codebeispiel 2: Philipp von Wartburg
Codebeispiel 3: Jim Rech (genauere Angaben nicht vorhanden)

.VBA-Code #1
Sub DeleteFolders1()
  CreateObject("Scripting.FileSystemObject").DeleteFolder "C:\AlteDaten"
End Sub

.VBA-Code #2
Sub DeleteFolders2()
  CreateObject("Scripting.FileSystemObject").DeleteFolder "C:\Daten\Monat*"
End Sub

.VBA-Code #3
ACHTUNG! Dieses Codebeispiel wurde noch nicht abschliessend getestet! Benutzung auf eigene Gefahr.

'Deklarationsbereich
Const FO_DELETE = &h3&
Const FOF_NOCONFIRMATION = &h10&

Private Type SHFILEOPSTRUCT
  hwnd As Long
  wFunc As Long
  pFrom As String
  pTo As String
  fFlags As Integer
  fAnyOperationsAborted As Long
  hNameMappings As Long
  lpszProgressTitle As String
End Type

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
   (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Private Declare Function SHFileOperation Lib "Shell32.dll" Alias _

   "SHFileOperationA" (lpFileOp As Any) As Long

'Codemodul
Sub DeleteFolder3(SrcFile As String)
  Dim result As Long
  Dim lenFileop As Long
  Dim foBuf() As Integer
  Dim fileop As SHFILEOPSTRUCT
  lenFileop = LenB(fileop)
  ReDim foBuf(1 To lenFileop)
  With fileop
    .hwnd = 0
    .wFunc = FO_DELETE
    .pFrom = SrcFile & Chr(0) & Chr(0)
    .fFlags = FOF_NOCONFIRMATION
    .lpszProgressTitle = "" & Chr(0) & Chr(0)
  End With
  Call CopyMemory(foBuf(1), fileop, lenFileop)
  Call CopyMemory(foBuf(19), foBuf(21), 12)
  result = SHFileOperation(foBuf(1))
End Sub

'*** Aufruf ***
Sub TestCall()
  DeleteFolder3 "C:\AlterOrdner"
End Sub

Verwandte Codebeispiele

Ordner löschen

Ordnerinhalt löschen (nur Dateien)

To Top


Ordnerinhalt löschen (nur Dateien)

.Beschreibung
In diesem Beispiel wird vorgestellt, wie die in einem Ordner vorhandenen Dateien gelöscht werden können. Allfällig vorhandene Unterverzeichnisse dieses Ordners und die dort enthaltenen Dateien werden hierbei nicht gelöscht.

.VBA-Code
Sub DeleteFolderFiles()
  Kill "C:\Alte Dateien\*.*"
End Sub

.Hinweis
Beachten Sie bitte folgende Punkte:
- Die Kill-Anweisung löscht den Ordnerinhalt (d.h. die enthaltenen Dateien) endgültig, d.h. verschiebt ihn nicht in den Windows-Papierkorb.
- Die im zu löschenden Ordner liegenden Unterverzeichnisse sowie deren Dateien werden mit Kill nicht gelöscht.
- Besitzt eine Datei des angegebenen Ordners das Schreibgeschützt-Attribut, so werden gar keine Dateien gelöscht, da die schreibgeschützte Datei nicht gelöscht und somit die Löschung des Verzeichnisinhaltes als Ganzes betrachtet nicht ordnungsgemäss durchgeführt werden kann (Laufzeitfehler 75 "Fehler beim Zugriff auf Pfad/Datei" erscheint).
- Versteckte Dateien werden von Kill nicht berücksichtigt, d.h. dass sich diese - mit dem Hidden-Attribut versehenen - Dateien auch nach erfolgreicher Ordnerinhalt-Löschung weiterhin im Ordner befinden.
- Beim Versuch den Inhalt eines bereits leeren Ordners zu löschen, oder eines Ordners, in welchem ausschliesslich versteckte Dateien liegen, erscheint der Laufzeitfehler 53 "Datei nicht gefunden", da Kill keine Dateien findet.

Weitere Informationen

VBA-Probleme: Verborgene Dateien werden von "Dir" nicht erkannt

VBA-Befehle und -Funktionen

VBA-Spezialthema: VBA-Laufzeitfehler

 

Verwandte Codebeispiele

Ordner löschen

Ordner mit allen Unterordnern und Dateien löschen

To Top


Prüfen, ob ein Ordner existiert

.Beschreibung
Mit der Dir-Funktion von VBA kann man nebst der Existenz von Dateien auch die von Ordnern überprüfen. In bestimmten Situationen ist allerdings die GetAttr-Funktion besser geeignet (siehe zweites Codebeispiel).

» Das Codebeispiel #1 zeigt die üblich verwendete Überprüfung anhand der Dir-Funktion von VBA. Beachten Sie bitte, dass bei dieser Lösung bekannt sein muss, ob das zu prüfende Objekt (im Beispiel "C:\Daten") tatsächlich ein Ordner und nicht etwa eine Datei ist. "Daten" könnte nämlich durchaus eine Datei sein, obwohl keine Dateinamenerweiterung benutzt wird. Wenn Sie nicht sicher sind, sollten Sie vorsichtshalber die als Codebeispiel #2 vorgestellte Lösung verwenden. Die Dir-Funktion gibt nämlich erstaunlicherweise auch dann "Daten" als Resultat zurück, wenn es sich bei "C:\Daten" um eine existierende Datei handelt - obwohl die Konstante vbDirectory angegeben ist.

» Im Beispiel #2 wird die GetAttr-Funktion benutzt, was besser ist, falls man nicht sicher ist, ob "Daten" ein Ordner oder eine Datei ist. Im Gegensatz zum Codebeispiel mit Dir prüft die mittels And-Operator durchgeführte logische Konjunktion von GetAttr und vbDirectory zuverlässig, ob das angegebene Objekt tatsächlich ein Ordner ist und somit existiert oder nicht.

» Das Codebeispiel #3 verwendet eine völlig anderen Ansatz: Hier wird versucht, mittels ChDrive und anschliessendem ChDir auf das zu überprüfende Verzeichnis zu wechseln. Wenn kein Fehler auftritt, dann existiert der Ordner offensichtlich. Wenn der Laufzeitfehler 68 oder 76 auftritt, so existiert der Ordner nicht, weil das verwendete Laufwerk und/oder der Verzeichnispfad nicht vorhanden ist. Bei Auftreten des Laufzeitfehlers 75 "Fehler beim Zugriff auf Pfad/Datei" ist es nicht möglich, die Existenz des Ordners abschliessend festzustellen (siehe Programmcode).

.VBA-Code #1
Public Sub CheckIfFolderExists1()
  If Dir("C:\Daten", vbDirectory) <> "" Then

    MsgBox "Der angegebene Ordner existiert."
  Else
    MsgBox "Der angegebene Ordner existiert nicht."
  End If
End Sub

.VBA-Code #2
Public Sub CheckIfFolderExists2()
  If Val(GetAttr("C:\Daten") And vbDirectory) <> 0 Then

    MsgBox "Das angegebene Objekt ist ein Ordner."
  Else

    MsgBox "Das angegebene Objekt ist eine Datei."
  End If
End Sub

.VBA-Code #3
Public Sub CheckIfFolderExists3()
  On Error Resume Next
  ChDrive "C:\Daten"
  ChDir "C:\Daten"
  If Err.Number = 0 Then

    MsgBox "Der angegebene Ordner existiert."
  ElseIf Err.Number = 68 Or Err.Number = 76 Then
    MsgBox "Der angegebene Ordner existiert nicht."
  ElseIf Err.Number = 75 Then
    MsgBox "Die Existenz des angegebenen Ordners kann nicht festgestellt werden." & vbCrLf & vbCrLf & _
        "Er könnte existieren, aber Sie besitzen keine Leseberechtigung für diesen Ordner, oder " &
        "er könnte nicht existieren, weil das Laufwerk/der Datenträger nicht bereit ist."
  End If
  On Error GoTo 0
End Sub

.Hinweis
Beachten Sie in diesem Zusammenhang, dass die Dir-Funktion standardmässig versteckte Dateien/Ordner nicht berücksichtigt. Die im ersten Codebeispiel gezeigte Prüfung würde den versteckten Ordner "C:\Daten" als nicht vorhanden betrachten. Die Programmzeile mit der Dir-Funktion müsste für versteckte Ordner folgendermassen lauten:

  If Dir("C:\Daten", vbDirectory Or vbHidden) <> "" Then

Durch die so genannte logische Disjunktion von vbDirectory und vbHidden mittels Or-Operator werden sowohl versteckte als auch nicht versteckte Ordner erkannt.

Im Gegensatz zur Dir-Funktion berücksichtigt GetAttr standardmässig auch versteckte Dateien/Ordner. Das oben abgebildete Beispiel #2 muss somit nicht angepasst werden, d.h. die vbHidden-Konstante darf weggelassen werden.

Bitte beachten Sie auch, dass beim Codebeispiel #2 der Laufzeitfehler 53 "Datei nicht gefunden" auftritt, wenn es sich bei dem angegebenen Objekt weder um eine Datei noch um einen Ordner handelt - sprich das Objekt beispielsweise gar nicht existiert.

Laufzeitfehler 68 "Gerät nicht verfügbar"

Laufzeitfehler 76 "Pfad nicht gefunden"

 

Weitere Informationen

Prüfen, ob eine Datei existiert

VBA-Probleme: Verborgene Dateien werden von "Dir" nicht erkannt

VBA-Befehle und -Funktionen

VBA-Spezialthema: VBA-Laufzeitfehler

To Top


Ordner/Verzeichnis umbenennen

.Beschreibung
Mit der Name-Anweisung von VBA wird ein Ordner umbenannt. Im Codebeispiel erhält der Ordner "AlteDaten" den neuen Namen "NeueDaten".

.VBA-Code
Sub RenameFolder()
  Name "C:\AlteDaten" As "C:\NeueDaten"

End Sub

.Hinweis
Beachten Sie bitte, dass das Umbenennen eines Verzeichnisses in einer seltenen Situation nicht funktioniert. Mehr dazu erfahren Sie auf den unter "Weitere Informationen" aufgeführten Themenseiten.

Weitere Informationen

Datei umbenennen

Ordner verschieben

Ordner kopieren

VBA-Probleme: Verwendung von "Dir" und "Name" führt zu Problemen

VBA-Befehle und -Funktionen

To Top


Ordner kopieren

.Beschreibung
Die Programmiersprache VBA stellt keine Anweisung zum Kopieren eines ganzen Ordners zur Verfügung. Eine Lösung, die ausschliesslich mit Standard VBA-Anweisungen auskommt, ist ziemlich aufwändig, da unter anderem der VBA FileCopy-Befehl keine Platzhalter unterstützt. Man müsste somit zuerst den neuen Ordner mittels MkDir anlegen, dann sämtliche im Quellordner enthaltene Dateien mit der Dir-Funktion auslesen und in eine Datenfeldvariable ablegen und zuletzt jede einzelne dieser Dateien mit dem FileCopy-Befehl in den neuen Ordner kopieren.

Erheblich einfacher geht es mit der CopyFolder-Methode des FileSystemObject-Objektes (FSO), wie im folgenden Beispiel gezeigt wird.

.VBA-Code
Sub CopyFolder()
  Dim fsoObject As Object
  Set fsoObject = CreateObject("Scripting.FileSystemObject")
  fsoObject.CopyFolder "D:\Daten", "D:\Backup"
  Set fsoObject = Nothing

End Sub

.Hinweis
Im Gegensatz zum Kopieren existiert für das Verschieben eines Ordners samt den enthaltenen Dateien und Unterverzeichnissen ein VBA-Befehl. Es handelt sich um die Name-Anweisung, die von vielen Programmierern umterschätzt wird, da sie gewöhnlich nur zum Umbenennen von Dateien benutzt wird.

Weitere Informationen

Ordner verschieben

VBA-Befehle und -Funktionen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Ordner verschieben

.Beschreibung
Ein Ordner kann mit der Name-Anweisung von VBA verschoben werden. Dabei werden sämtliche im Ordner enthaltenen Dateien und Unterverzeichnisse verschoben. Das nachfolgende Codebeispiel verschiebt den Ordner "MeinOrdner" samt Inhalt von "C:\AlterOrdner" nach "C:\NeuerOrdner".

Der Ordner kann gleichzeitig umbenannt werden. Im Beispiel #2 wird der Ordner "MeinOrdner" verschoben und dabei in "AndererOrdner" umbenannt.

.VBA-Code #1
Sub MoveFolder1()
  Name "C:\AlterOrdner\MeinOrdner" As "C:\NeuerOrdner\MeinOrdner"

End Sub

.VBA-Code #2
Sub MoveFolder2()
  Name "C:\AlterOrdner\MeinOrdner" As "C:\NeuerOrdner\AndererOrdner"

End Sub

.Hinweis
Beachten Sie bitte, dass das Verschieben eines Ordners nur innerhalb des gleichen Laufwerkes möglich ist. Das Verschieben beispielsweise von Laufwerk "C:" nach Laufwerk "D:" funktioniert nicht.

Verwandte Codebeispiele

Ordner kopieren

Mehrere Ordner verschieben

Ordner verschieben mit Fortschrittsanzeige

Mehrere bestimmte Ordner verschieben

 

Weitere Informationen

VBA-Probleme: Verwendung von "Dir" und "Name" führt zu Problemen

VBA-Befehle und -Funktionen

To Top


Anwendung starten und Makroausführung anhalten

.Beschreibung
In diesen Codebeispielen wird eine Anwendung gestartet und so lange mit der weiteren Ausführung des Makros gewartet, bis die gestartete Anwendung beendet worden ist. In den beiden Beispielen wird exemplarisch das Windows-Programm Notepad/Notizblock (Editor) verwendet.

» Das erste Beispiel verwendet zwei Windows API-Funktionen. Auf die Programmbeendigung gewartet wird anhand einer Do-Loop-Schleife, in welcher der Ausführungsstatus des gestarteten Programmes laufend abgefragt wird.

» Im zweiten Beispiel wird die Run-Methode des Shell-Objektes aus der Bibliothek "Windows Script Host Object Model" benutzt. Ausgesprochen nützlich ist hier der dritte Parameter, welcher gemäss Objektmodell mit pvarWaitOnReturn benannt ist. Gibt man als Argument den Wert True mit, so wartet das System so lange, bis die gestartete Anwendung beendet worden ist (Der Anwendungsname ist der erste Parameter von Run).

» Das Beispiel #3 verwendet ebenfalls die Run-Methode des Shell-Objektes, wobei der Rückgabewert von Run weiterverarbeitet wird.

.Autor
Beispiel 1: Hans W. Herber, www.herber.de (Anpassungen durch Philipp von Wartburg)
Beispiel 2: Philipp von Wartburg
Beispiel 3: Philipp von Wartburg

.VBA-Code #1
'Deklarationsbereich
Public Const PROCESS_QUERY_INFORMATION = &H400
Public Const WAIT_TIMEOUT = &H102&

Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _
  ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _

  ByVal dwMilliseconds As Long) As Long

'Codemodul
Public Sub WaitUntilFinished(ProgEXE As String)
  Dim ProcessID As Long
  Dim hProcess As Long
  Dim RetVal As Long

  ProcessID = Shell(ProgEXE, vbNormalFocus)
  hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessID)
  Do
    DoEvents
    RetVal = WaitForSingleObject(hProcess, 50)
  Loop Until RetVal <> WAIT_TIMEOUT
End Sub

'*** Aufruf ***
Sub TestCall()
  Call WaitUntilFinished("Notepad.exe")
  MsgBox "Der Editor wurde beendet."
End Sub

.VBA-Code #2
Sub RunProgramAndWait()
  CreateObject("WScript.Shell").Run "Notepad.exe", , True
  MsgBox "Der Editor wurde beendet."
End Sub

.VBA-Code #3
Sub ShowProgramCloseMode()
  Dim lngCloseMode As Long
  lngCloseMode = CreateObject("WScript.Shell").Run("Notepad.exe", , True)
  If lngCloseMode = 0 Then 
    MsgBox "Der Editor wurde normal beendet."
  Else     '- oder "ElseIf lngCloseMode = 1 Then"
    MsgBox "Der Prozess des Editors wurde beendet."
  End If
End Sub

.Hinweis
Interessant ist der Rückgabewert der Run-Methode. Beträgt dieser 0, so wurde das gestartete Programm normal beendet (Menübefehl Datei/Beenden der Anwendung, Anwendungsfenster schliessen oder "Task beenden" im Windows Task-Manager). Wird jedoch der Wert 1 zurückgegeben, so wurde der Prozess der Anwendung beendet (Schaltfläche "Prozess beenden" im Windows Task-Manager oder Programmabsturz), und nicht die Anwendung als solches bzw. der Task der Anwendung. Da Anwendungsprozesse im Normalfall nicht oder nur in Ausnahmefällen durch Benutzer beendet werden, spricht man gewöhnlich von "Prozess abschiessen".

Verwandte Codebeispiele

Programm starten und warten, bis es beendet wurde

Programm starten und warten, bis es beendet oder die Esc-Taste gedrückt wurde

 

Weitere Informationen

VBA-Spezialthema: Windows Script Host (WSH)

To Top


Registriertes Programm starten

.Beschreibung
Wenn Sie mit VBA ein Programm starten möchten, welches sich nicht in einem Windows-Verzeichnis oder in einem in der Path-Systemvariable angegebenen Suchpfad befindet, stossen Sie an die Grenzen der Shell-Funktion von VBA. Shell kann nämlich nur Programme ausführen, die sich in einem der oben genannten Verzeichnisse befinden. Mit einer API-Funktion oder der Run-Methode des Shell-Objektes - ein Objekt aus der Bibliothek "Windows Script Host Object Model" (Windows Script Host) - kann diese Einschränkung umgangen werden.

.VBA-Code #1
'Deklarationsbereich
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
  (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As _
  String, ByVal lpParameters As String, ByVal lpDirectory As String, _
  ByVal nShowCmd As Long) As Long

'Codemodul
Sub RunReisteredProgram1()
  ShellExecute 0&, "open", "ACDSee.exe", vbNullString, vbNullString, vbNormalFocus
End Sub

.VBA-Code #2
Sub RunRegistredProgram2()
  CreateObject("WScript.Shell").Run "ACDSee.exe", vbNormalFocus

End Sub

Weitere Informationen

VBA-Spezialthema: Windows Script Host (WSH)

To Top


Arbeitsmappe aus dem Internet oder Intranet öffnen

.Beschreibung
Dieses Codebeispiel zeigt, wie eine Arbeitsmappe aus dem Internet oder Intranet in Microsoft Excel geöffnet und anschliessend auf einer lokalen Festplatte gespeichert wird.

.Autor
Microsoft Support

Siehe auch MS KB-Artikel:
  XL97: Visual Basic Macro to Open a Workbook on the Internet
  http://support.microsoft.com/?kbid=155841

.VBA-Code
Public Sub OpenInternetFile()
  'Arbeitsmappe öffnen
  Workbooks.Open FileName:= "http://www.Internet.com/MeineMappe.xls"
  'Fenster der Arbeitsmappe ausblenden
  ActiveWindow.Visible = True
  'Arbeitsmappe einblenden (Set the workbook to visible, or else the file containing the macro
  'will be saved under the new name)
  Windows("MeineMappe.xls:// www.Internet.com/MeineMappe.xls").Visible = True
  'Arbeitsmappe auf die lokale Festplatte speichern
  ActiveWorkbook.SaveAs FileName:="C:\Daten\LokaleMappe.xls", FileFormat:=xlExcel5, _

    Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False
End Sub

To Top


HTML-Dokument in Excel öffnen

.Beschreibung
Dieses VBA-Beispiel zeigt, wie ein HTML-Dokument mit VBA in Excel geöffnet wird, sodass es anschliessend in Excel bearbeitet werden kann. Sie werden feststellen, dass eine HTML-Datei genau gleich wie eine gewöhnliche Arbeitsmappe (Dateityp 'xls') mittels der Open-Methode geöffnet wird.

.VBA-Code
Sub OpenHTMLDocument()
  Workbooks.Open Filename:="C:\Daten\HTML-Datei.htm"
End Sub

.Hinweis
Wenn die anhand des Filename-Parameters angegebene HTML-Datei nach Ausführen von Open nicht angezeigt wird, könnte es unter anderem daran liegen, dass die HTML-Datei Frames verwendet. Microsoft Excel ist nicht in der Lage, HMTL-Dateien mit Frames darzustellen. Es erscheint keine Fehlermeldung; die Datei wird ganz einfach nicht geöffnet.

Verwandte Codebeispiele

Arbeitsmappe als Webseite speichern

To Top


Arbeitsmappe als Webseite speichern

.Beschreibung
Eine Arbeitsmappe wird als Webseite gespeichert, indem man lediglich bei der SaveAs-Methode das Dateiformat xlHTML angibt.

.VBA-Code
Sub SaveBookAsWebpage()
  ActiveWorkbook.SaveAs Filename:="C:\Daten\Webseite.htm", FileFormat:=xlHTML
End Sub

.Hinweis
Das Speichern von Mappen im HTML-Format steht seit Excel 2000 als Basis-Funktionalität zur Verfügung. Das Öffnen von HTML-Dateien dagegen wird schon in Excel 97 unterstützt. In Excel 97 kann eine Arbeitsmappe anhand des Internet Assistenten (so lautet der offizielle Name des Add-Ins 'HTML.xla') im HTML-Dateiformat gespeichert werden. Beachten Sie hierbei, dass lediglich eine rudimentäre HTML-Datei erstellt wird, d.h. dass unter anderem VBA-Code und eingebettete ActiveX-Controls verloren gehen. In Excel 2000 und später wird eine vollständige Webseite generiert, mit anderen Worten sämtliche Informationen der Arbeitsmappe erhalten bleiben, also unter anderem auch der enthaltene VBA-Programmcode.

Bitte beachten Sie, dass beim Speichern als Webseite Microsoft Excel automatisch eine vollständige Neuberechnung der gesamten Arbeitsmappe durchführt; und zwar ungeachtet der aktuellen Berechnen-Einstellung ('Automatisch' oder 'Manuell'). Es existiert keine Möglichkeit zum Verhindern der Neuberechnung. Es kann daher durchaus vorkommen, dass eine im xls-Dateiformat gespeicherte Arbeitsmappe nicht die gleichen Daten enthält wie exakt dieselbe, jedoch als HTML-Datei gespeicherte Mappe.

Wenn Sie Microsoft Excel 2002 einsetzen, müssen Sie unbedingt das Microsoft Office 2002 Service Pack 2 installieren. Ohne Service Pack 2 speichert Excel blattübergreifende Hyperlinks (Cross Sheet Links) mit einer fehlerhaften Syntax. Dadurch funktionieren diese Hyperlinks nicht, wenn Sie die als HTML-Datei gespeicherte Arbeitsmappe in einem Webbrowser öffnen und dann auf einen Hyperlink klicken.

Verwandte Codebeispiele

Arbeitsblatt mit dem Internet Assistent als HTML-Datei speichern

Zellbereich oder Diagrammobjekt mit dem Internet Assistent als HTML-Datei speichern

 

Weitere Informationen

Excel-Funktionen und -Features: Internet Assistent

To Top


Arbeitsblatt mit dem Internet Assistent als HTML-Datei speichern

.Beschreibung
Ein Arbeitsblatt kann mit Hilfe des Internet Assistenten sehr einfach als HTML-Datei gespeichert werden. Bei Microsoft Excel 97 steht der Internet Assistent als separates Add-In zur Verfügung. Ab Microsoft Excel 2000 gehört er zur Basis-Funktionalität. Der Internet Assistent kann nicht nur in der Anwendung Excel aufgerufen werden sondern auch mit VBA. Dazu muss unter Microsoft Excel 97 im VBA-Projekt ein Verweis auf das Add-In "Internet Assistent" ("html") gesetzt werden. Bei Microsoft Excel 2000 und neuer wird der Verweis auf das Add-In "Internet Assistent VBA" gesetzt. Sobald der Verweis angelegt wurde, kann die Funktion HTMLConvert aufgerufen werden, die zum Generieren der HTML-Datei zuständig ist.

.VBA-Code
Sub CreateWebPage()
  Dim objToConvert(0) As Variant
  Dim intResult As Integer
  Set objToConvert(0) = Sheets("Tabelle1").UsedRange
  'Internet Assistent Add-In laden
  AddIns("Internet-Assistent").Installed = True
  'HTML-Seite generieren
  intResult = htmlconvert(rangeandcharttoconvert:=objToConvert, _
    useexistingfile:=False, usefrontpageforexistingfile:=False, _
    addtofrontpageweb:=False, codepage:=1252, _
    htmlfilepath:="Test.htm", headerfullpage:="Test Page", _
    linebeforetablefullpage:=True, namefullpage:="MyName")
  If intResult = htmlconvert_success Then
    MsgBox "Die Webseite wurde erfolgreich erstellt"
  Else
    MsgBox "Fehler aufgetreten"
  End If
End Sub

Verwandte Codebeispiele

Zellbereich oder Diagrammobjekt mit dem Internet Assistent als HTML-Datei speichern

Arbeitsmappe als Webseite speichern

 

Weitere Informationen

Excel-Funktionen und -Features: Internet Assistent

To Top


Zellbereich oder Diagrammobjekt mit dem Internet Assistent als HTML-Datei speichern

.Beschreibung
Mit Hilfe des Internet Assistenten kann man einen Zellbereich (oder auch mehrere) und auch Diagramme sehr einfach als HTML-Datei speichern. Bei Microsoft Excel 97 steht der Internet Assistent als separates Add-In zur Verfügung. Ab Microsoft Excel 2000 gehört er zur Basis-Funktionalität. Der Internet Assistent kann nicht nur in der Anwendung Excel aufgerufen werden sondern auch mit VBA. Dazu muss unter Microsoft Excel 97 im VBA-Projekt ein Verweis auf das Add-In "Internet Assistent" ("html") gesetzt werden. Bei Microsoft Excel 2000 und neuer wird der Verweis auf das Add-In "Internet Assistent VBA" gesetzt. Sobald der Verweis angelegt wurde, kann die Funktion HTMLConvert aufgerufen werden, die zum Generieren der HTML-Datei zuständig ist.

.VBA-Code
Sub CreateWebPage()
  Dim objToConvert(2) As Variant
  Dim intResult As Integer
  'Array objToConvert mit den gewünschten Zellbereichen und Diagrammen füllen
  Set objToConvert(0) = Sheets("Tabelle1").Range("A1:A5")
  Set objToConvert(1) = Sheets("Tabelle1").ChartObjects("Diagramm 1")
  Set objToConvert(2) = Sheets("Tabelle1").Range("A7:A10")
  'Internet Assistent Add-In laden
  AddIns("Internet-Assistent").Installed = True
  'HTML-Seite generieren
  intResult = htmlconvert(rangeandcharttoconvert:=objToConvert, _
    useexistingfile:=False, usefrontpageforexistingfile:=False, _
    addtofrontpageweb:=False, codepage:=1252, _
    htmlfilepath:="Test.htm", headerfullpage:="Test Page", _
    linebeforetablefullpage:=True, namefullpage:="MyName")
  If intResult = htmlconvert_success Then
    MsgBox "Die Webseite wurde erfolgreich erstellt"
  Else
    MsgBox "Fehler aufgetreten"
  End If
End Sub

Verwandte Codebeispiele

Arbeitsblatt mit dem Internet Assistent als HTML-Datei speichern

Arbeitsmappe als Webseite speichern

 

Weitere Informationen

Excel-Funktionen und -Features: Internet Assistent

To Top


Zuletzt verwendete Arbeitsmappe öffnen

.Beschreibung
Über die RecentFiles-Auflistung erhält man Zugriff auf die Dateinamen der zuletzt geöffneten Arbeitsmappen. Die neueste zuletzt geöffnete Datei besitzt immer den Index 1 innerhalb der RecentFiles-Auflistung. Je nach eingestellter Anzahl Einträge für zuletzt geöffnete Dateien enthält die Auflistung maximal 9 Dateinamen (die Einstellung bezüglich Anzahl der zuletzt geöffneten Dateien befindet sich im Excel Optionen-Dialog auf der Registerseite "Allgemein").

Beachten Sie bitte, dass die beiden RecentFiles-Eigenschaften Count und Maximum wichtige Informationen enthalten. Auf jeden Fall sollte, wie im Codebeispiel zu sehen ist, die Eigenschaft Count abgefragt werden. Dadurchdamit festgestellt werden kann, ob die Auflistung mindestens einen Eintrag enthält.

.VBA-Code
Sub OpenLastUsedFile()
  If Application.RecentFiles.Count > 0 Then

    Workbooks.Open Application.RecentFiles(1).Path
  End If
End Sub

.Hinweis
Bitte beachten Sie, dass eine in RecentFiles eingetragene Datei mit Workbooks.Open geöffnet werden sollte. RecentFiles besitzt zwar ebenfalls eine Open-Methode zum Öffnen der Dateien; von der Verwendung dieser Methode rate ich jedoch ab.

Diese Variante sollte daher nicht benutzt werden:

Sub OpenLastUsedFile()
  Application.RecentFiles(1).Open
End Sub

Der Grund liegt am fehlerhaften Verhalten von Microsoft Excel beim Öffnen von CSV-Dateien. Trotz korrekt eingestelltem Listentrennzeichen in den Windows-Ländereinstellungen und angepasstem Registry-Eintrag für das DDE-Kommando 'Open' wird der Inhalt einer CSV-Datei beim Öffnen nicht auf die Tabellenspalten verteilt.

Verwandte Codebeispiele

Zuletzt verwendete Dateien auflisten

Liste der zuletzt verwendeten Dateien löschen

 

Weitere Informationen

Excel-Objektmodell: Eigenschaften des Application-Objektes

Relative Pfade

To Top


Zuletzt verwendete Dateien auflisten

.Beschreibung
Über die RecentFiles-Auflistung erhält man die Dateinamen und -pfade der zuletzt in Microsoft Excel geöffneten Dateien. Gewöhnlich sind dies Arbeitsmappen. Das hier vorgestellte Codebeispiel zeigt eine Komplettlösung: Es wird ein neues Arbeitsblatt in der aktiven Arbeitsmappe eingefügt, in die Zelle A1 der Titel "Zuletzt verwendete Dateien" und in die Zellen A3 und A4 die Spaltenüberschriften "Datei" bzw. "Pfad" eingetragen. Ab Zeile 4 werden die Namen und Pfade der zuletzt verwendeten Dateien aufgelistet.

.VBA-Code
Sub ListRecentFiles()
  Dim objRecentFiles As RecentFiles
  Dim objRecentFile As RecentFile
  Dim lngRow As Long
  ActiveWorkbook.Worksheets.Add After:=Worksheets(Worksheets.Count)
  With ActiveSheet
    .Range("A1").Value = "Zuletzt verwendete Dateien"
    .Range("A1").Font.Size = 12
    .Range("A1").Font.Bold = True
    .Range("A3").Value = "Datei"
    .Range("B3").Value = "Pfad"
    .Range("A3:B3").Font.Bold = True
  End With
  lngRow = 4
  Set objRecentFiles = Application.RecentFiles
  For Each objRecentFile In objRecentFiles
    ActiveSheet.Cells(lngRow, 1).Value = objRecentFile.Name
    ActiveSheet.Cells(lngRow, 2).Value = objRecentFile.Path
    lngRow = lngRow + 1
  Next
  ActiveSheet.Range("A:B").EntireColumn.AutoFit
  Set objRecentFiles = Nothing
End Sub

Verwandte Codebeispiele

Zuletzt verwendete Arbeitsmappe öffnen

Liste der zuletzt verwendeten Dateien löschen

 

Weitere Informationen

Excel-Objektmodell: Eigenschaften des Application-Objektes

To Top


Arbeitsmappe schliessen ohne zu speichern

.Beschreibung
Es existieren mehrere Möglichkeiten, wie eine Arbeitsmappe geschlossen werden kann, ohne dabei die Mappe zu speichern.

.Autor
Microsoft Support (Anpassungen durch Philipp von Wartburg)

Siehe auch MS KB-Artikel:
  XL: Using Saved Property to Determine If Workbook Has Changed
  http://support.microsoft.com/?kbid=213634

.VBA-Code #1
Macro to Display Message If Active Workbook Has Unsaved Changes

Sub TestForUnsavedChanges()
  If ActiveWorkbook.Saved = False Then
    MsgBox "Diese Mappe enthält nicht gespeicherte Änderungen."
  End If
End Sub

.VBA-Code #2
Macro to Close Workbook and Discard Changes

This macro closes the workbook that contains the sample code and discards any changes to the workbook by setting the Saved property to True:

Sub CloseWithoutChanges()
  ThisWorkbook.Saved = True
  ThisWorkbook.Close
End Sub

.VBA-Code #3
Another Macro to Close Workbook and Discard Changes

Sub CloseWithoutChanges()
  ThisWorkbook.Close SaveChanges:=False
End Sub

Weitere Informationen

Excel-Objektmodell: Methoden des Workbook-Objektes

To Top


Andere Anwendung beenden

.Beschreibung
Die Objektbibliothek von Microsoft Excel bietet keine direkte Möglichkeit zum Beenden einer anderen Anwendung. Es bleibt daher nur die Variante, mittels geeigneten API-Funktionen von Windows der anderen Anwendung eine Aufforderung zu schicken, sie solle sich beenden. Als Alternative kann man die Möglichkeiten der Microsoft Word-Objektbibliothek einsetzen. Beide Lösungsvarianten besitzen Vor- und Nachteile:

API-Funktionen:
- Vorteil: Microsoft Office bzw. Word muss nicht installiert sein.
- Vorteil: Schnelle Programmcodeausführung.
- Nachteil: Der genaue Fenstertitel muss bekannt sein.
- Nachteil: Eher komplizierter Programmcode wegen API-Deklarationen.

Word-VBA:
- Vorteil: Einfacher Programmcode in Word.
- Vorteil: Der genaue Fenstertitel muss nicht bekannt sein.
- Nachteil: Bei Automation relativ langsam.
- Nachteil: Microsoft Office bzw. Word muss installiert sein.

» Im ersten Beispiel wird der Windows-Taschenrechner beendet, indem das Fenster mit dem Titel "Rechner" gesucht wird und diesem mittels PostMessage ein WM_CLOSE-Befehl gesendet wird.

» Das zweite Codebeispiel beendet ebenfalls den Taschenrechner. Im Gegensatz zu Microsoft Excel existiert in der Objektbibliothek von Microsoft Word eine Tasks-Auflistung sowie ein Task-Objekt mit mehreren interessanten Methoden und Eigenschaften. Wenn Sie also in einem Word VBA-Programm oder mittels Automation eine andere Anwendung beenden wollen, sollten Sie das Task-Objekt anstelle der Windows API-Funktionen von Codebeispiel #1 verwenden.

» Das Codebeispiel #3 beendet den Taschenrechner, wobei der Programmcode im VBA-Projekt eines Word-Dokumentes ausgeführt werden muss.

.Autor
» Codebeispiel #1: Sam Huggill, VB-Square, www.vb-square.com (Anpassungen durch Philipp von Wartburg)
» Codebeispiel #2: Philipp von Wartburg
» Codebeispiel #3: Philipp von Wartburg

.VBA-Code #1
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _
   ByVal lpWindowName As String) As Long
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, _

  ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WM_CLOSE = &H10

Public Sub CloseTask1()
  Dim lngHwnd As Long
  lngHwnd = FindWindow(vbNullString, "Rechner")
  If lngHwnd <> 0 Then
    If PostMessage(lngHwnd, WM_CLOSE, 0&, 0&) = 0 Then
      MsgBox "Fehler beim Beenden von 'Rechner' aufgetreten!", vbExclamation
    End If
  Else
    MsgBox "'Rechner' existiert nicht!", vbExclamation
  End If
End Sub

.VBA-Code #2
Public Sub CloseTask2()
  Const TaskName As String = "Rechner"
  Dim objWord As Object
  Set objWord = CreateObject("Word.Application")
  On Error Resume Next
  objWord.Tasks(TaskName).Close
  If Err.Number = 5491 Then
    MsgBox "Der Task '" & TaskName & "' existiert nicht!", vbExclamation
  ElseIf Err.Number <> 0 Then
    MsgBox "Beim Beenden des Tasks '" & TaskName & "' ist ein Fehler aufgetreten!", vbExclamation
  End If
  On Error GoTo 0
  objWord.Quit
  Set objWord = Nothing
End Sub

.VBA-Code #3
Public Sub CloseTask3()
  Application.Tasks("Rechner").Close
End Sub

.Hinweis
Bei beiden Lösungsvarianten wird der Anwendungstask beendet und nicht einfach der Prozess abgeschossen. Wenn Sie beispielsweise den Windows Editor (Notepad.exe) beenden, so erscheint eine Rückfrage ...

TODO

Verwandte Codebeispiele

Prozess abschiessen (Anwendungs- und Systemprozess)

Laufende Anwendungstasks auflisten

Sichtbare Anwendungstasks auflisten

To Top


Sicherungskopie einzelner Arbeitsblätter anlegen

.Beschreibung
Dieses Makro erstellt eine Sicherungskopie von bestimmten Arbeitsblättern in Form einer neuen Arbeitsmappe. Im Beispiel wird exemplarisch das erste und dritte Arbeitsblatt der aktiven Arbeitsmappe als Backup-Datei (Name der aktiven Arbeitsmappe mit angehängter Dateinamenerweiterung 'bak') gesichert.

.Autor
Hans W. Herber, www.herber.de (Anpassungen durch Philipp von Wartburg)

.VBA-Code
Sub SaveAndBackupSheets()
  Dim wkbSource As Workbook

  Dim wkbBackUp As Workbook
  Dim strPath As String

  Dim strFile As String
  Application.ScreenUpdating = True
  strPath = "C:\Temp\"
  Set wkbSource = ActiveWorkbook
  strFile = Left(wkbSource.Name, Len(wkbSource.Name) - 3) & "bak"
  wkbSource.Save
  wkbSource.Worksheets(1).Copy
  Set wkbBackUp = ActiveWorkbook
  wkbSource.Worksheets(3).Copy after:=wkbBackUp.Worksheets(1)
  wkbBackUp.SaveAs strPath & strFile
  wkbBackUp.Close savechanges:=False
  Application.ScreenUpdating = False
End Sub

Verwandte Codebeispiele

Arbeitsblatt als neue Arbeitsmappe speichern

Speichern eines Arbeitsblattes ohne eingebettete Objekte, Formeln und VBA-Programmcode

 

Weitere Informationen

Excel-Objektmodell: Methoden des Workbook-Objektes

To Top


Eingabe eines gültigen Dateinamens im Speichern unter-Dialog erzwingen

.Beschreibung
Anhand einer Do-Loop-Schleife kann man einen Benutzer dazu zwingen, einen gültigen Dateinamen im Speichern unter-Dialog einzugeben.

.VBA-Code #1
Sub GetFilenameForSave1()
  Dim strFilename As String
  Do
    strFilename = Application.GetSaveAsFilename("NeueMappe.xls", "Excel-Arbeitsmappen (*.xls),*.xls")
    If strFilename <> "Falsch" And strFilename <> "False" Then
      If Dir(strFilename, vbNormal + vbHidden) = "" Then
        Exit Do
      Else
        MsgBox "Eine Datei mit dem Namen '" & strFilename & "' existiert bereits!"
      End If
    Else
      Exit Sub
    End If
  Loop

  ActiveWorkbook.SaveAs strFilename
End Sub

.VBA-Code #2
Sub GetFilenameForSave2()
  Dim strFilename As String
  Do
    strFilename = Application.GetSaveAsFilename("NeueMappe.xls", "Excel-Arbeitsmappen (*.xls),*.xls")
    If strFilename <> "Falsch" And strFilename <> "False" Then
      If Dir(strFilename, vbNormal + vbHidden) = "" Then
        Exit Do
      Else
        MsgBox "Eine Datei mit dem Namen '" & strFilename & "' existiert bereits!"
      End If
    End If
  Loop

  ActiveWorkbook.SaveAs strFilename
End Sub

Weitere Informationen

Excel-Objektmodell: Methoden des Workbook-Objektes

To Top


Arbeitsmappe nach 30 Sekunden speichern, sofern Benutzer nicht interveniert

.Beschreibung
Beschreibung folgt...

.VBA-Code
'Modul 'DieseArbeitsmappe'
Private Sub Workbook_Open()
  Application.OnTime Now + TimeSerial(0, 0, 30), "AutomatischSpeichern"
  dblOeffnenZeit = Timer
                 'Open-TimeStamp merken
  bolAbbruch = False                      'Abbruch-Flag initialisieren
End Sub

'Deklarationsbereich eines Codemoduls
Public bolAbbruch As Boolean              'Variable für Abbruch Ja/Nein
Public dblOeffnenZeit As Double
          'Variable für Open-TimeStamp

'Codemodul
Public Sub AutomatischSpeichern()
  If bolAbbruch = False Then
             'Kein Abbruch durch Benutzer
    ThisWorkbook.Close savechanges:=True
  End If
End Sub

Public Sub SpeichernAbbrechen()
  If Timer - dblOeffnenZeit <= 20 Then
    'Wenn <= 20 Sek. vergangen sind, dann Abbruch erlaubt

    bolAbbruch = True
  Else
    If bolAbbruch = True Then
             'Falls Abbruch, dann Abbruch zurücksetzen (siehe Hinweis)
      bolAbbruch = False
    End If
  End If
End Sub

.Hinweis
Die Codezeile "If bolAbbruch = True Then" gibt dem Benutzer die Möglichkeit, eine innerhalb von 20 Sekunden deaktivierte Auto-Speicherung neu zu aktivieren. Dazu hat er genau 10 Sekunden Zeit (zwischen 20 und 30 Sekunden seit Öffnen der Datei).

To Top


Arbeitsmappe mit dem Dateiformat "prn" speichern

.Beschreibung
Microsoft Excel stellt als Dateiformat unter anderem den Dateityp "Formatierter Text (Leerzeichen getrennt)" zur Verfügung, welcher im Speichern unter-Dialog von Excel ausgewählt werden kann. Mit diesem Dateiformat gespeicherte Dateien erhalten standardmässig die Dateinamenerweiterung "prn". Dieses Beispiel zeigt, wie automatisiert der Speichern unter-Dialog geöffnet, der Dateityp "Formatierter Text" eingestellt und das aktive Arbeitsblatt als prn-Datei gespeichert wird.

.VBA-Code
Public Sub SaveFileAsPRN()
  'Wenn die Prozedur im VBA-Editor ausgeführt wird, zuerst Excel aktivieren:

  'AppActivate "Microsoft Excel"
  SendKeys "MeineDatei{tab}{down}{home}{down 2}+{tab}"   'Siehe Hinweis
  SendKeys "{enter}"
  Application.CommandBars.FindControl(Id:=748).Execute
   '748 = Speichern unter-Schaltfläche
End Sub

.Hinweis
Das Wort "MeineDatei" in der SendKeys-Zeichenfolge muss mit dem zu gewünschten Dateinamen für die prn-Datei ersetzt werden.

To Top


Arbeitsmappe in Datei drucken (Ausdruck in Datei umleiten)

.Beschreibung
Der Ausdruck einer Arbeitsmappe kann, anstatt auf dem Drucker auszugeben, auch problemlos in eine Datei umgeleitet werden. Das ist insofern problemlos, weil es sich bei dieser Umleitungsmöglichkeit um eine Funktionalität handelt, die standardmässig in Windows zur Verfügung steht. Auf dem Drucken-Dialog von Microsoft Excel ist die Option "Ausdruck in Datei umleiten" zu finden, welche in eingeschaltetem Zustand die Umleitung aktiviert. Wird bei eingeschalteter Option der Druckvorgang gestartet, erscheint das Dialogfenster "Drucken in Dateien", worauf der Benutzer den Namen für die Druckdatei eingeben muss.

.VBA-Code
Sub PrintIntoFile()
  'AppActivate "Microsoft Excel"  <--- Diese Zeile einschalten, wenn Prozedur im VBA-Editor ausgeführt wird
  SendKeys "C:\Ausdruck.txt{enter}"
  ActiveWorkbook.PrintOut Copies:=1, PrintToFile:=True, Collate:=True
End Sub

.Hinweis
Berücksichtigen Sie, dass der in die Datei umgeleitete Ausdruck nebst dem Inhalt der Arbeitsmappe auch Steuerzeichen für den Drucker enthält. Das Dokument wird in einem Format gespeichert, das von Ihrem Druckgerät gelesen werden kann, und nicht von der Anwendung, aus der Sie drucken.

To Top


Arbeitsmappe als PDF-Datei speichern

.Beschreibung
Wenn Sie den Adobe Acrobat PDFWriter® installiert haben, können Sie eine Arbeitsmappe (oder beliebige Teile davon) als PDF-Datei speichern. Eigentlich wird das Excel-Dokument nicht gespeichert sondern vielmehr in eine PDF-formatierte Datei gedruckt.

.VBA-Code
Sub PrintAsPDFFile()
  'AppActivate "Microsoft Excel"  <--- Diese Zeile einschalten, wenn Prozedur im VBA-Editor ausgeführt wird
  Dim strPDFName As String
  Dim strCurrentPrinter As String
  strPDFName = "C:\Daten\MeineMappe.pdf"
  strCurrentPrinter = Application.ActivePrinter
  SendKeys strPDFName & "{enter}"
  ActiveWorkbook.PrintOut Copies:=1, ActivePrinter:="Acrobat PDFWriter auf LPT1:"
  Application.ActivePrinter = strCurrentPrinter

End Sub

.Hinweis
Wenn der Druckertreiber "Acrobat PDFWriter" nicht mit dem Anschluss LPT1 verbunden ist, muss die Bezeichnung bei "ActivePrinter:=" entsprechend angepasst werden.

To Top


Arbeiten mit einer lokalen Kopie der Arbeitsmappe

.Beschreibung
Bei langsamen Netzwerkverbindungen empfiehlt Microsoft die Verwendung von lokalen Arbeitsmappen-Kopien.

.Autor
Microsoft Support (Anpassungen durch Philipp von Wartburg)

Siehe auch MS KB-Artikel:
  XL97/XL2000: Workbooks Containing User Forms Take Excessively Long Time to Save Across WAN Connections
  http://support.microsoft.com/?kbid=254733

.VBA-Code
Private Const TEMPFILE As String = "C:\LokaleMappe.xls"
Private Const TEMPFILE2 As String = "C:\LokaleMappe2.xls"
Private strOriginalName As String
Public bSaving As Boolean

Public Sub SaveLocalThenCopy()
  Dim wbk As Workbook, wbk2 As Workbook
  Set wbk = ThisWorkbook
  If UCase(ThisWorkbook.FullName) <> UCase(TEMPFILE) Then _

    strOriginalName = ThisWorkbook.FullName
  If Dir(TEMPFILE) <> "" Then Kill TEMPFILE
  If Dir(TEMPFILE2) <> "" Then Kill TEMPFILE2
  ThisWorkbook.SaveAs TEMPFILE
  ThisWorkbook.SaveAs TEMPFILE2
  FileCopy TEMPFILE, strOriginalName
  Set wbk2 = Workbooks.Open(strOriginalName)
  bSaving = False
  wbk.Close False
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  If bSaving Then Cancel = False: Exit Sub
  Dim iAns As Integer
  iAns = MsgBox("Do you wish to Save As...?", vbYesNoCancel, "Save")
  Select Case iAns
    Case vbYes
      Cancel = True
      bSaving = True
      Application.Dialogs(xlDialogSaveAs).Show
      bSaving = False
      Exit Sub
    Case vbNo
      'Do normal - local save.
    Case vbCancel
      Cancel = True
      Exit Sub
  End Select
  bSaving = True
  Cancel = True
  Application.OnTime Now + TimeValue("00:00:01"), "SaveLocalThenCopy"
End Sub

To Top


Datei mit verknüpftem Programm öffnen

.Beschreibung
Anhand der Windows API-Funktion ShellExecute lässt sich eine Datei mit der über den Dateityp referenzierten Anwendung öffnen. Es können sämtliche in Windows registrierten Dateitypen verwendet werden, wie beispielsweise GIF-, PDF-, TXT- oder HLP-Dateien. Im Gegensatz zu ShellExecute kann die VBA-Funktion Shell nur ausführbare Programme öffnen bzw. starten. Eine weitere Möglichkeit ist die Benutzung der FollowHyperlink-Methode des Workbook-Objektes von Microsoft Excel. Letztere Lösungsmöglichkeit ist wesentlich kürzer als die ShellExecute-Lösung, kann allerdings nur in Excel-VBA verwendet werden. ShellExecute kann in allen VBA- und auch in VB-Programmen verwendet werden.

» Das Beispiel #1 verwendet die API-Funktion ShellExecute.

Argumente von ShellExecute
Diese Argumente werden von der API-Funktion verwendet:

Argument Beschreibung
hwnd Window Handle (immer 0&)
lpOperation DDE Command
lpFile Pfad- und Dateiname
lpParameters Befehlszeilen-Parameter
lpDirectory Arbeitsverzeichnis
nShowCmd Fensterstil

» Das zweite Beispiel verwendet ebenfalls die API-Funktion ShellExecute, wobei zusätzlich der Rückgabewert der Funktion ausgewertet wird.

» Im dritten Beispiel wird die Lösungsvariante mit der FollowHyperlink-Methode vorgestellt.

.VBA-Code #1
'Deklarationsbereich
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
  (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As _
  String, ByVal lpParameters As String, ByVal lpDirectory As String, _
  ByVal nShowCmd As Long) As Long

'Codemodul
Sub OpenFileWithAssociatedProgram1()
  ShellExecute 0&, "open", "C:\EineDatei.pdf", vbNullString, vbNullString, vbNormalFocus
End Sub

.VBA-Code #2
'Deklarationsbereich
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
  (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As _
  String, ByVal lpParameters As String, ByVal lpDirectory As String, _
  ByVal nShowCmd As Long) As Long

'Codemodul
Sub OpenFileWithAssociatedProgram2()
  Dim lngRetCode As Long

  lngRetCode = ShellExecute(0&, "open", "C:\EineDatei.pdf", vbNullString, vbNullString, vbNormalFocus)
  If lngRetCode = 42 Then
    'Kein Fehler aufgetreten
  ElseIf lngRetCode = 2 Then
    MsgBox "Datei nicht gefunden."
  ElseIf lngRetCode = 31 Then
    MsgBox "Kein verknüpftes Programm definiert oder DDE-Vorgang fehlerhaft."

  Else
    MsgBox "Nicht näher bekannter Fehler aufgetreten."
  End If
End Sub

.VBA-Code #3
'Codemodul
Sub OpenFileWithAssociatedProgram3()
  ActiveWorkbook.FollowHyperlink "C:\Daten\Bild.gif"

End Sub

.Hinweis
Es können auch die in Datei-Verknüpfungen hinterlegten Zieldateien mit ShellExecute geöffnet werden. Der Name der Verknüpfungsdatei kann dabei mit oder ohne Dateinamenerweiterung 'lnk' angegeben werden. Beispielsweise "C:\Verknüpfung mit Mappe1.xls.lnk" und "C:\Verknüpfung mit Mappe1.xls" funktionieren beide.

Weitere Informationen

VBA-Befehle und -Funktionen

Hyperlinks

To Top


Zieldatei aus einer Datei-Verknüpfung (lnk-Datei) ermitteln

.Beschreibung
Mit der hier vorgestellten Funktion wird der Dateiname der in einer Verknüpfung (lnk-Datei) angegebenen Zieldatei ermittelt.

.VBA-Code
TODO: Programmcode

Verwandte Codebeispiele

Datei-Verknüpfung erstellen

Ordner-Verknüpfung erstellen

To Top


Verzeichnis über Ordnerauswahl-Dialog auswählen

.Beschreibung
Zum Auswählen eines Verzeichnisses anhand des Ordnerauswahl-Dialoges existieren zwei verschiedene Musterlösungen. Die eine Lösung ist für Office 97, die andere für Office 2000 und Office XP geeignet. Die Variante 2 kann nicht in einem VBA-Programm unter Office 97 verwendet werden, da die Programmiersprache VBA von Office 97 (VBA Version 5.0) den AddressOf-Operator nicht kennt.

TODO: Lösung 2!

.Autor
Philipp von Wartburg
Hans W. Herber, www.herber.de

.VBA-Code
'Deklarationsbereich
Public Type BROWSEINFO
  hOwner As Long
  pidlRoot As Long
  pszDisplayName As String
  lpszTitle As String
  ulFlags As Long
  lpfn As Long
  lParam As Long
  iImage As Long
End Type
Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias _

  "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
Declare Function SHBrowseForFolder Lib "shell32.dll" Alias _

  "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long

'Codemodul
Function GetDirectory(Optional msg) As String
  Dim bInfo As BROWSEINFO
  Dim Path As String
  Dim r As Long, x As Long, pos As Integer
  bInfo.pidlRoot = 0&
  If IsMissing(msg) Then
    bInfo.lpszTitle = "Wählen Sie bitte einen Ordner aus."
  Else
    bInfo.lpszTitle = msg
  End If
  bInfo.ulFlags = &H1
  x = SHBrowseForFolder(bInfo)
  Path = Space$(512)
  r = SHGetPathFromIDList(ByVal x, ByVal Path)
  If r Then
    pos = InStr(Path, Chr$(0))
    GetDirectory = Left(Path, pos - 1)
  Else
    GetDirectory = ""
  End If
End Function

'*** Aufruf ***
Sub TestCall()
  Dim sMsg As String, sPath As String
  sMsg = "Wählen Sie bitte einen Ordner aus:"
  sPath = GetDirectory(sMsg)
  If sPath <> "" Then MsgBox sPath
End Sub

To Top


Datei in einem Ordner und allen Unterordnern suchen (erste Fundstelle anzeigen)

.Beschreibung
Mit der hier vorgestellten Funktion SearchFileInFolders wird eine Datei in einem Ordner und allen Unterordnern gesucht. Beachten Sie, dass nur die erste gefundene Datei zurückgegeben wird. Beachten Sie zudem, dass die Platzhalterzeichen '*' und '?' nicht verwendet werden können. Übrigens ist die API-Funktion überaus schnell, insbesondere bei der zweiten und allen weiteren Ausführungen der Dateisuche (siehe auch Hinweis am Ende des Codebeispiels).

Im nachstehenden Beispiel wird die Datei "EineMappe.xls" im Ordner "C:\Daten" und allen Unterverzeichnissen gesucht.

.Autor
KPD-Team 2000, www.allapi.net (Anpassungen durch Philipp von Wartburg)
Eine nahezu identische Lösung stammt von Michael Schwimmer, http://schwimmer.bei.t-online.de/index.htm

.VBA-Code
'Deklarationsbereich
Declare Function SearchTreeForFile Lib "imagehlp" (ByVal RootPath As String, _
  ByVal InputPathName As String, ByVal OutputPathBuffer As String) As Long
Const MAX_PATH = 260

'Codemodul
Function SearchFileInFolders(strRootFolder As String, strFile As String) As String
  Dim strDummy As String
  Dim lngRetCode As Long
  strDummy = String(MAX_PATH, 0)
  lngRetCode = SearchTreeForFile(strRootFolder, strFile, strDummy)
  If lngRetCode <> 0 Then
    SearchFileInFolders = Left$(strDummy, InStr(1, strDummy, Chr$(0)) - 1)
  Else
    SearchFileInFolders = ""
  End If
End Function
'*** Aufruf ***
Sub TestCall()
  Dim strLocation As String
  strLocation = SearchFileInFolders("C:\Daten", "EineMappe.xls")
  If strLocation <> "" Then
    MsgBox "Datei gefunden: " & strLocation
  Else
    MsgBox "Datei nicht gefunden"
  End If
End Sub

.Hinweis
Die API-Funktion SearchTreeForFile betreibt ein vorzügliches Caching, d.h. dass Informationen über durchsuchte Ordner für weitere Suchläufe im Speicher erhalten bleiben. Dadurch verkürzt sich die Suchdauer bei der nächsten Dateisuche erheblich, da praktisch keine Festplattenzugriffe mehr erfolgen; und zwar ganz egal, nach welcher Datei gesucht wird! Suchen Sie beispielsweise zuerst nach einer Datei "Textdatei.txt", die sich irgendwo auf der Festplatte befindet (was aber nicht zwingend der Fall sein muss), und suchen Sie anschliessend - ebenfalls nur als Beispiel - die Datei "Windows.hlp" (die sich üblicherweise im Windows System-Verzeichnis befindet), so wird die Datei "Windows.hlp" in Rekordzeit gefunden. Je mehr Ordner-Informationen sich im Cache befinden desto schneller wird die Suche ablaufen. Bei meiner etwa 25'000 Dateien umfassenden Test-Festplatte dauerte die Suche - nachdem bereits ein paar wenige Suchläufe durchgeführt wurden - nach einer beliebigen Datei nur noch ca. 2 Sekunden!

Trotz hoher Geschwindigkeit sollten Sie bedenken, dass die Suche gänzlich innerhalb der API-Funktion abläuft. Beim Aufruf dieser Funktion wird die Programmkontrolle übergeben. Das bedeutet, dass der VBA-Code erst weiterläuft, wenn die Suche vollständig ausgeführt wurde. Sie besitzen somit keine Möglichkeit, die Suche abzubrechen bzw. zu unterbrechen.

Verwandte Codebeispiele

Datei über ein gesamtes Laufwerk suchen

Datei in einem Ordner und allen Unterordnern suchen (alle Fundstellen anzeigen)

Grösste/Kleinste Datei einer bestimmten Datei in mehreren Ordnern suchen

To Top


Datei über ein gesamtes Laufwerk suchen

.Beschreibung
Mit der Funktion SearchFileOnDrive kann eine Datei über ein gesamtes Laufwerk gesucht werden. Es wird nur die erste gefundene Übereinstimmung zurückgegeben. Beachten Sie, dass die Platzhalter '*' und '?' nicht verwendet werden können.

Im nachstehenden Beispiel wird die Datei "EineMappe.xls" auf dem Laufwerk "C:" gesucht.

.Autor
KPD-Team 2000, www.allapi.net (Anpassungen durch Philipp von Wartburg)
Eine nahezu identische Lösung stammt von Michael Schwimmer, http://schwimmer.bei.t-online.de/index.htm

.VBA-Code
'Deklarationsbereich
Declare Function SearchTreeForFile Lib "imagehlp" (ByVal RootPath As String, _
  ByVal InputPathName As String, ByVal OutputPathBuffer As String) As Long
Const MAX_PATH = 260

'Codemodul
Function SearchFileOnDrive(strDrive As String, strFile As String) As String
  Dim strDummy As String
  Dim lngRetCode As Long
  strDummy = String(MAX_PATH, 0)
  lngRetCode = SearchTreeForFile(strDrive, strFile, strDummy)
  If lngRetCode <> 0 Then
    SearchFileOnDrive = Left$(strDummy, InStr(1, strDummy, Chr$(0)) - 1)
  Else
    SearchFileOnDrive = ""
  End If
End Function
'*** Aufruf ***
Sub TestCall()
  Dim strLocation As String
  strLocation = SearchFileOnDrive("C:", "EineMappe.xls")
  If strLocation <> "" Then
    MsgBox "Datei gefunden in Verzeichnis " & strLocation
  Else
    MsgBox "Datei nicht gefunden"
  End If
End Sub

.Hinweis
Die API-Funktion SearchTreeForFile betreibt ein vorzügliches Caching, d.h. dass Informationen über durchsuchte Ordner für weitere Suchläufe im Speicher erhalten bleiben. Dadurch verkürzt sich die Suchdauer bei der nächsten Dateisuche erheblich, da praktisch keine Festplattenzugriffe mehr erfolgen; und zwar ganz egal, nach welcher Datei gesucht wird! Suchen Sie beispielsweise zuerst nach einer Datei "Textdatei.txt", die sich irgendwo auf der Festplatte befindet (was aber nicht zwingend der Fall sein muss), und suchen Sie anschliessend - ebenfalls nur als Beispiel - die Datei "Windows.hlp" (die sich üblicherweise im Windows System-Verzeichnis befindet), so wird die Datei "Windows.hlp" in Rekordzeit gefunden. Je mehr Ordner-Informationen sich im Cache befinden desto schneller wird die Suche ablaufen. Bei meiner etwa 25'000 Dateien umfassenden Test-Festplatte dauerte die Suche - nachdem bereits ein paar wenige Suchläufe durchgeführt wurden - nach einer beliebigen Datei nur noch ca. 2 Sekunden!

Trotz hoher Geschwindigkeit sollten Sie bedenken, dass die Suche gänzlich innerhalb der API-Funktion abläuft. Beim Aufruf dieser Funktion wird die Programmkontrolle übergeben. Das bedeutet, dass der VBA-Code erst weiterläuft, wenn die Suche vollständig ausgeführt wurde. Sie besitzen somit keine Möglichkeit, die Suche abzubrechen bzw. zu unterbrechen.

Verwandte Codebeispiele

Datei in einem Ordner und allen Unterordnern suchen (erste Fundstelle anzeigen)

Datei in einem Ordner und allen Unterordnern suchen (alle Fundstellen anzeigen)

Datei in mehreren Ordnern suchen (alle Fundstellen anzeigen)

Grösste/Kleinste Datei einer bestimmten Datei in mehreren Ordnern suchen

To Top


Unterordner eines Ordners auflisten

.Beschreibung
Es existieren mehrere Möglichkeiten zum Auflisten der direkten Unterordner eines bestimmten Ordners. Hier werden zwei Lösungen vorgestellt:

» Das Beispiel #1 verwendet das FileSystemObject-Objekt. Hier wird die SubFolders-Auflistung des Folder-Objektes durchlaufen und alle dadurch ermittelten Ordner in der Spalte B eines neuen Arbeitsblattes in der aktiven Arbeitsmappe aufgelistet. Der Programmcode muss in einem VBA-Projekt von Microsoft Excel ablaufen.

» Im Beispiel #2 werden die VBA-Funktionen Dir und GetAttr eingesetzt. Beim Aufruf der vorgestellten Prozedur wird das Verzeichnis mitgegeben, dessen Unterverzeichnisse in einem Meldungsdialog (MsgBox) angezeigt werden sollen. Der Programmcode kann in einem VBA-Projekt eines beliebigen Microsoft Office-Programmes oder auch in einem VB-Projekt ablaufen.

.VBA-Code #1
Public Sub GetSubFolders1()
  Dim lngRow As Long
  Dim strPath As String
  Dim objFSO As Object
  Dim objSubfolders As Object
  Dim objFolder As Object
  lngRow = 1
  strPath = "C:\Daten"
  ActiveWorkbook.Worksheets.Add Type:=xlWorksheet

  Set objFSO = CreateObject("Scripting.FileSystemObject")
  Set objSubfolders = objFSO.GetFolder(strPath).SubFolders
  ActiveSheet.Range("A1").Value = strPath

  For Each objFolder In objSubfolders
    ActiveSheet.Range("B" & lngRow).Value = objFolder.Name
    lngRow = lngRow + 1
  Next

  Set objSubfolders = Nothing
  Set objFSO = Nothing
End Sub

.VBA-Code #2
Public Sub GetSubFolders2(ByVal strDir As String)
  Dim strItem As String
  On Error Resume Next
  If Right$(strDir, 1) <> "\" Then
    strDir = strDir & "\"
  End If
  strItem = Dir(strDir & "*", vbDirectory)
  Do While strItem <> ""
    If strItem <> "." And strItem <> ".." Then
      If (GetAttr(strDir & strItem) And vbDirectory) = vbDirectory Then
        If Err.Number = 0 Then
          MsgBox strItem
        Else
          Err.Clear
        End If
      End If
    End If
  strItem = Dir
  Loop
End Sub

.Hinweis
Die Laufzeitfehler-Abfrage (siehe Codezeile "If Err.Number = 0 Then") ist notwendig, weil sich die GetAttr-Funktion nicht mit allen Dateien und Ordnern verträgt. Eine derartige Datei ist unter anderem die Windows-Speicherauslagerungsdatei pagefile.sys, die permanent von einem Windows-Prozess benutzt wird und somit kein anderer Prozess - in unserem Fall VBA bzw. das VBA-Programm - auf diese Datei zugreifen kann. Bei Verwendung von GetAttr mit der Datei "pagefile.sys" tritt der Laufzeitfehler 5 "Unzulässiger Prozeduraufruf oder ungültiges Argument" auf.

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

VBA-Befehle und -Funktionen

 

Verwandte Codebeispiele

Ordner mit allen Unterordnern auflisten

Ordner suchen (erste Fundstelle anzeigen)

Ordner suchen (alle Fundstellen anzeigen)

To Top


Spezialordner mit Pfad auflisten

.Beschreibung
Es gibt verschiedene Möglichkeiten zum Ermitteln der Windows-Spezialordner. Wenn Sie eine Liste auf einem Arbeitsblatt einer Microsoft Excel-Arbeitsmappe erstellen möchten, empfiehlt sich die Verwendung des SpecialFolders-Objektes aus der Windows Script Host-Objektbibliothek.

.VBA-Code
Public Sub ListSpecialFolders()
  Dim intCounter As Integer
  Dim objFolders As Object
  Set objFolders = CreateObject("WScript.Shell").SpecialFolders
  For intCounter = 0 To objFolders.Count - 1
    ActiveSheet.Cells(intCounter + 1, 1).Value = objFolders(intCounter)
  Next intCounter
  Set objFolders = Nothing
End Sub

.Hinweis
Die VBA-Prozedur liest die objFolders-Objektvariable (ein Auflistungsobjekt) aus und schreibt die Namen der Spezialordner in die Zellen A1 bis A18 des aktiven Arbeitsblattes. Beachten Sie bitte, dass der Index nullbasiert ist (d.h. 0 bis 17). Je nach Betriebssystem kann das Objekt unterschiedlich viele Elemente enthalten.

Diese Ordnernamen werden aufgelistet:
- D:\WINNT\Profiles\All Users\Desktop
- D:\WINNT\Profiles\All Users\Startmenü
- D:\WINNT\Profiles\All Users\Startmenü\Programme
- D:\WINNT\Profiles\All Users\Startmenü\Programme\Autostart
- D:\WINNT\Profiles\Administrator\Desktop
- D:\WINNT\Profiles\Administrator\Anwendungsdaten
- D:\WINNT\Profiles\Administrator\Druckumgebung
- D:\WINNT\ShellNew
- D:\WINNT\Fonts
- D:\WINNT\Profiles\Administrator\Netzwerkumgebung
- D:\WINNT\Profiles\Administrator\Desktop
- D:\WINNT\Profiles\Administrator\Startmenü
- D:\WINNT\Profiles\Administrator\SendTo
- D:\WINNT\Profiles\Administrator\Recent
- D:\WINNT\Profiles\Administrator\Startmenü\Programme\Autostart
- D:\WINNT\Profiles\Administrator\Favoriten
- D:\WINNT\Profiles\Administrator\Eigene Dateien
- D:\WINNT\Profiles\Administrator\Startmenü\Programme

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

VBA-Spezialthema: Windows Script Host (WSH)

VBA-Befehle und -Funktionen

 

Verwandte Codebeispiele

Spezialordner auflisten

Pfad eines Spezialordners ermitteln

To Top


Laufwerke auflisten

.Beschreibung
Hier ein Codebeispiel für das Auflisten der verfügbaren Laufwerke unter Verwendung des FileSystemObject-Objektes. Zu jedem Laufwerk wird die Datenträger-Bezeichnung (Volume) angezeigt, ausser bei Netzwerk-Laufwerken. Bei diesen Laufwerkstypen wird der Freigabename (Share) ausgegeben.

.Autor
Microsoft Excel VBA-Referenz (Anpassungen durch Philipp von Wartburg)

.VBA-Code
Public Sub ShowDriveList
  Dim fs, d, dc, s, n
  Set fs = CreateObject("Scripting.FileSystemObject")
  Set dc = fs.Drives
  For Each d in dc
    s = s & d.DriveLetter & " - "
    If d.DriveType = 3 Then    'Typ 3 bedeutet Netzwerk-Laufwerk
      n = d.ShareName
    Else
      n = d.VolumeName
    End If
    s = s & n & vbCrLf
  Next
  MsgBox s
End Sub

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Mehrere Arbeitsmappendateien zu einer Arbeitsmappe zusammenführen

.Beschreibung
Diese Prozedur führt die Arbeitsblätter mehrerer Exceldateien in einer neuen Arbeitsmappe zusammen. Im Beispiel werden exemplarisch die Blätter von zwei Arbeitsmappen (xls-Dateien) sowie die Blätter einer Vorlagemappe (xlt-Datei) zu einer einzigen neuen Mappe mit der Bezeichnung "KonsolidierteMappe.xls" zusammengefügt. Das Beispiel verwendet Office Automation; der Programmcode kann somit in einem beliebigen Office-Programm ausgeführt werden (Microsoft Excel muss allerdings installiert sein).

.VBA-Code
Public Sub CollectSheets()
  Dim appExcel As Object
  Set appExcel = CreateObject("Excel.Application")
  With appExcel
    .Visible = True
    .DisplayAlerts = False
    .Workbooks.Add Template:=1
    With .Workbooks(1).Sheets
      .Add Type:="D:\Meine Daten\Mappe_XYZ.xls"
      .Add Type:="D:\Diverses\A1.xls"
      .Add Type:="C:\Vorlagen\Excel\VorlageMappe.xlt"
    End With
    .Workbooks(1).Sheets(.Workbooks(1).Sheets.Count).Delete
    .DisplayAlerts = True

    .Workbooks(1).SaveAs "C:\Daten\KonsolidierteMappe.xls"
    .UserControl = True
  End With
  Set appExcel = Nothing
End Sub

.Hinweis
Die Codezeile ".DisplayAlerts = False" ist wichtig, da ansonsten die Meldung "Ausgewählte Blätter werden endgültig gelöscht" beim Löschen des Arbeitsblattes erscheint (siehe Codezeile ".Workbooks(1).Sheets(.Workbooks(1).Sheets.Count).Delete").

To Top


Dateiformat einer geöffneten Arbeitsmappe abfragen

.Beschreibung
Durch Abfragen der FileFormat-Eigenschaft lässt sich das Dateiformat der Arbeitsmappe ermitteln. Bei einer neuen, d.h. noch nicht gespeicherten Mappe wird das Dateiformat der aktuell verwendeten Excelversion zurückgegeben; unabhängig davon, welches Standard-Dateiformat eingestellt ist. Das Standard-Dateiformat lässt sich anhand der Eigenschaft DefaultSaveFormat des Application-Objektes bzw. über die Einstellung "Standard-Dateityp" im Excel Optionen-Dialog (Menübefehl Extras/Optionen) festlegen.

.VBA-Code
Public Sub GetFileFormat()
  MsgBox ActiveWorkbook.FileFormat
End Sub

Weitere Informationen

Excel-Objektmodell: Eigenschaften des Workbook-Objektes

 

Verwandte Codebeispiele

Dateiformat einer geschlossenen Arbeitsmappe abfragen

To Top


Dateiformat einer geschlossenen Arbeitsmappe abfragen

.Beschreibung
Das Format einer geschlossenen Arbeitsmappendatei lässt sich nicht ganz so einfach ermitteln. Es existiert zwar schon eine Möglichkeit, mit VBA das Dateiformat herauszufinden - und zwar ohne dass dabei die Arbeitsmappe mit Microsoft Excel geöffnet werden muss. Dazu wird allerdings eine von Microsoft Developer Support entwickelte DLL-Datei namens "dsofile.dll" benötigt, die den Zugriff auf die Dokument-Eigenschaften der Datei ermöglicht.

Das nachfolgende VBA-Codebeispiel zeigt, wie man die Dateiformatversion einer Excel-Arbeitsmappe herausfindet, ohne dass die Datei geöffnet werden muss - weder mit Microsoft Excel noch mit einem anderen Programm. Die in der DLL bereitgestellten Funktionen sind so implementiert, dass nur auf einen bestimmten Teil der Datei zugegriffen wird (auf den 'SummaryInformation'-Stream bzw. 'DocumentSummaryInformation'-Stream des OLE2 Structured File Formates).

.VBA-Code
Public Sub GetFileFormatVersion()
  Dim objDSOReader As Object
  Dim objDSODocument As Object
  Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
  Set objDSODocument = objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")
  MsgBox "Dateiformatversion der Datei: " & objDSODocument.Version
  Set objDSODocument = Nothing
  Set objDSOReader = Nothing
End Sub

.Hinweis
Die bei GetDocumentProperties angegebene Datei darf zum Zeitpunkt der Codeausführung nicht in Bearbeitung sein, weil GetDocumentProperties immer einen exklusiven Dateizugriff durchführt. Wenn die Datei nicht verfügbar ist, sprich geöffnet ist, erscheint der Laufzeitfehler 3 "The file is currently open and cannot be read". Auf der anderen Seite wird mit obigem Programmcode die Datei so lange gesperrt, bis die Codezeile "Set objDSODocument = Nothing" ausgeführt wird.

Weitere Informationen

Excel-Dateiformat

VBA-Spezialthema: OLE Document Properties (DSOFile)

 

Verwandte Codebeispiele

Dateiformat einer geöffneten Arbeitsmappe abfragen

To Top


Datei-Attribut abfragen

.Beschreibung
Datei-Attribute können mit der GetAttr-Funktion von VBA abgefragt werden.

.VBA-Code
Sub GetFileAttribute()
  MsgBox GetAttr("C:\Daten\MeineMappe.xls")
End Sub

.Hinweis
Als Alternative zu GetAttr kann auch die Attributes-Eigenschaft von File des FileSystemObject-Objektes verwendet werden.

Weitere Informationen

VBA-Befehle und -Funktionen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Datei verschieben

.Beschreibung
Die unscheinbare VBA-Anweisung Name kann nicht nur Dateien umbenennen sondern auch verschieben oder sogar gleichzeitig umbenennen und verschieben. Das Verschieben funktioniert allerdings nur wenn sich das Zielverzeichnis (also der Ort, wohin die Datei verschoben werden soll) auf dem gleichen Laufwerk befindet wie das Quellverzeichnis der Datei. Das Verschieben einer Datei beispielsweise von Laufwerk C: nach Laufwerk D: kann mit der Name-Anweisung somit nicht durchgeführt werden. Das laufwerkübergreifende Verschieben lässt sich nur mit dem FileSystemObject-Objekt oder mit der Windows API-Funktion MoveFile bewerkstelligen.

» Das Codebeispiel #1 zeigt die Lösungsvariante mit dem VBA-Befehl Name zum Verschieben einer Datei. Wenn im Zielverzeichnis bereits eine gleichnamige Datei existiert, tritt der Laufzeitfehler 58 "Datei existiert bereits" auf.

» Das Beispiel #2 verwendet ebenfalls den Befehl Name, wobei die Datei verschoben und gleichzeitig umbenannt wird. Auch hier tritt bei bereits vorhandener Datei der Laufzeitfehler 58 "Datei existiert bereits" auf.

» Das dritte Beispiel verwendet die API-Funktion MoveFile. Wenn im Zielverzeichnis bereits eine gleichnamige Datei existiert, gibt die Funktion den Wert 0 zurück. Die Datei wird in diesem Fall nicht verschoben.

» Im Beispiel #4 wird eine Datei anhand der API-Funktion MoveFile verschoben und umbenannt. Wenn im Zielverzeichnis die Datei bereits existiert, gibt die Funktion den Wert 0 zurück. Die Datei wird in diesem Fall nicht verschoben und umbenannt.

» Das fünfte Beispiel zeigt die Verwendung der MoveFile-Methode des FileSystemObject-Objektes.

.VBA-Code #1
Sub MoveFile1()
  Name "C:\AlteDateien\EineDatei.xls" As "C:\NeueDateien\EineDatei.xls"
End Sub

.VBA-Code #2
Sub MoveFile2()
  Name "C:\AlteDateien\AlterDateiname.xls" As "C:\NeueDateien\NeuerDateiname.xls"
End Sub

.VBA-Code #3
Declare Function MoveFile Lib "kernel32" Alias "MoveFileA" (ByVal _
  lpExistingFileName As String, ByVal lpNewFileName As String) As Long

Sub MoveFile3()
  Dim lngRetVal As Long

  lngRetVal = MoveFile("C:\AlteDateien\EineDatei.xls", "C:\NeueDateien\EineDatei.xls")
  If lngRetVal = 0 Then
    MsgBox "Fehler beim Verschieben der Datei."
  End If
End Sub

.VBA-Code #4
Declare Function MoveFile Lib "kernel32" Alias "MoveFileA" (ByVal _
  lpExistingFileName As String, ByVal lpNewFileName As String) As Long

Sub MoveFile4()
  Dim lngRetVal As Long

  lngRetVal = MoveFile("C:\AlteDateien\AlterDateiname.xls", "C:\NeueDateien\NeuerDateiname.xls")
  If lngRetVal = 0 Then
    MsgBox "Fehler beim Verschieben und Umbenennen der Datei."
  End If
End Sub

.VBA-Code #5
Sub MoveFile5()
  CreateObject("Scripting.FileSystemObject").MoveFile "C:\AlteDateien\EineDatei.xls", "C:\NeueDateien\EineDatei.xls"

End Sub

.Hinweis
Beachten Sie bitte, dass bei keiner Lösungvariante Platzhalterzeichen (? und *) erlaubt sind. Weder Name, noch die MoveFile-Methode noch die API-Funktion MoveFile unterstützen Platzhalter. Es kann daher immer nur eine einzelne Datei verschoben/umbenannt werden.

Weitere Informationen

VBA-Befehle und -Funktionen

VBA-Spezialthema: FileSystemObject (FSO)

 

Verwandte Codebeispiele

Mehrere Dateien verschieben

To Top


Neue Arbeitsmappe basierend auf dem aktiven Arbeitsblatt erstellen

.Beschreibung
Wenn Sie bei der Copy-Methode von Worksheets weder den After- noch Before-Parameter angeben, kopiert Microsoft Excel das Arbeitsblatt in eine neue Arbeitsmappe. Im Codebeispiel wird das aktive Arbeitsblatt kopiert.

.VBA-Code
Sub CreateNewBook
  ActiveSheet.Copy
Sub End

.Hinweis
Probieren Sie bitte auf keinen Fall, ein ausgeblendetes Arbeitsblatt in eine neue Arbeitsmappe zu kopieren. Excel versucht nämlich, dass Arbeitsblatt mit sämtlichen Einstellungen in die neue Mappe zu übertragen, sprich die aktuellen Blatt-Eigenschaften auch in der neuen Arbeitsmappe unverändert anzuwenden. Da bekanntlich eine Arbeitsmappe grundsätzlich mindestens ein sichtbares Arbeitsblatt enthalten muss, das kopierte Blatt (welches das einzige in der neuen Mappe ist) jedoch ausgeblendet ist, gerät Excel aus der Fassung. Excel versucht, die an sich korrekt verwendete Copy-Methode vollständig auszuführen, was aber nicht funktioniert. Die Folge ist ein Programm-Absturz von Microsoft Excel.

To Top


Seriennummer eines Laufwerkes abfragen

.Beschreibung
Am einfachsten lässt sich die Seriennummer eines Laufwerkes anhand der SerialNumber-Eigenschaft des Drive-Objektes aus der FileSystemObject-Objektbibliothek ermitteln. Die SerialNumber-Eigenschaft enthält allerdings die Seriennummer nur als Dezimalzahl. Wenn Sie die Information in Hex-Schreibweise benötigen (unter Windows und MS-DOS ist eigentlich die Hex-Darstellung gebräuchlich), so muss die Dezimalzahl umgewandelt werden.

.Autor
Microsoft Excel VBA-Referenz (Anpassungen durch Philipp von Wartburg)

.VBA-Code
Public Sub ShowDriveInfo()
  Dim fs, d, s, t, dr
  dr = "E:\Daten"
  Set fs = CreateObject("Scripting.FileSystemObject")
  Set d = fs.GetDrive(fs.GetDriveName(fs.GetAbsolutePathName(dr)))
  Select Case d.DriveType
    Case 0: t = "Unbekannt"
    Case 1: t = "Austauschbar"
    Case 2: t = "Fest"
    Case 3: t = "Netzwerk"
    Case 4: t = "CD-ROM"
    Case 5: t = "RAM Disk"
  End Select
  MsgBox "Laufwerk " & d.DriveLetter & ": - " & t & vbCrLf & "Seriennummer: " & d.SerialNumber
End Sub

.Hinweis
7DD-0B76

131926902

924914921

3721-14E9

2022265388

7889-522C

CreateObject("Scripting.FileSystemObject").GetDrive("C:").SerialNumber

 

Function SerialNumberHex(ByVal lngSerialNumber As Long) As String
  Dim strHex As String
  strHex = Val("&H" & lngSerialNumber)
  strHex = Format$(strHex, "&&&&-@@@@")
  strHex = String$(9 - Len(strHex), "0") & strHex

  SerialNumberHex = xx
End Function

 

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Prüfen, ob eine geöffnete Arbeitsmappe ein Dateikennwort verwendet

.Beschreibung
Die Eigenschaft HasPassword des Workbook-Objektes gibt an, ob eine geöffnete Arbeitsmappe ein Dateikennwort (d.h. ein Lese-/Schreibkennwort) verwendet. Im Codebeispiel wird die aktive Mappe überprüft.

.VBA-Code
Public Sub CheckFilePassword()
  If ActiveWorkbook.HasPassword = True Then
    MsgBox "Die Arbeitsmappe besitzt ein Dateikennwort."
  End If
End Sub

Verwandte Codebeispiele

Prüfen, ob eine geschlossene Arbeitsmappe ein Dateikennwort verwendet

 

Weitere Informationen

Excel-Objektmodell: Eigenschaften des Workbook-Objektes

Fragen und Antworten: Herausfinden, ob ein Dateikennwort verwendet wird, ohne die Mappe in Excel zu öffnen

To Top


Prüfen, ob eine geschlossene Arbeitsmappe ein Dateikennwort verwendet

.Beschreibung
Bei einer geschlossenen Arbeitsmappendatei ist es schwierig herauszufinden, ob die Mappe ein Dateikennwort verwendet; es ist aber nicht unmöglich. Mit reinem VBA ist diese Aufgabe allerdings nur ziemlich aufwändig und umständlich lösbar. Einfacher geht es mit Hilfe von geeigneten DLLs (z.B. der DLL "dsofile.dll" von Microsoft Developer Support und Utilities (z.B. dem Freeware Tool "FileFox"). Trotz allen Schwierigkeiten hier eine Lösungsvariante mit VBA. Zuerst aber ein kurzer Blick auf die angesprochenen Schwierigkeiten:

Damit herausgefunden werden kann, ob eine Arbeitsmappe ein Dateikennwort besitzt, muss auf die Arbeitsmappendatei (xls-Datei) zugegriffen werden; und zwar wird die Datei mit dem Binär-Lese-Zugriffsmodus geöffnet und in den Arbeitsspeicher eingelesen (Binary Access Read), wobei die Arbeitsmappe nicht im eigentlichen Sinne geöffnet wird, da sie weder bearbeitet werden kann (sie ist mit Read geöffnet) noch für Excel-Benutzer gesperrt ist (sie ist nicht mit Lock geöffnet).

- Die erste Schwierigkeit tritt beim xls-Dateiformat für Arbeitsmappen auf: Damit in der Datei nachgesehen werden kann, ob ein Kennwort verwendet wird, muss man sich mit dem Excel-Dateiformat BIFF (BIFF steht für Binary Interchange File Format) gut auskennen. Man muss einiges über das Structured Storage Format der Datei, die enthaltenen Storages, die Streams und die Recordtypen wissen, damit man die Information "Dateikennwort ja oder nein" am richtigen Ort sucht. Und da wären wir bereits bei der zweiten Schwierigkeit.

- Die Daten einer Arbeitsmappe stehen nicht immer am gleichen Ort in der xls-Datei. Schon der Record mit der BOF-Markierung (BOF=Begin Of File) muss nicht zwangsläufig am Anfang der Datei stehen.

- Die dritte Schwierigkeit betrifft die Version der Dateiformate: Excel 97, 2000, 2002 und 2003 verwenden das Format BIFF8, Excel 95 das Format BIFF7 und Excel 5.0 das Format BIFF5. Die Unterschiede dieser Formatversionen müssen im VBA-Code berücksichtigt werden. So ist unter anderem der BOF-Record von BIFF5/BIFF7 exakt um 8 Bytes kürzer als der BOF-Record von BIFF8.

TODO

Das Objekt DocumentProperties besitzt eine Eigenschaft namens LocaleInfo, die in der Objektbibliothek ausgeblendet ist. Dieses Property enthält gewöhnlich den Länder-/Gebietsschema-Code bzw. Länder-/Gebietsschema-Name des Dokumentes. Wenn LocaleInfo aber lediglich ein einzelnes Fragezeichen '?' enthält, dann bedeutet dies, dass das Dokument mittels Kennwort geschützt ist. Das ist jedoch nur bei Excel-Dokumentdateien der Fall.

.VBA-Code
Public Sub CheckPassword()
  Dim objDSOReader As Object
  Dim objDSODocument As Object
  Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
  Set objDSODocument = objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")

  If objDSODocument.LocaleInfo = "?" Then
    MsgBox "Die Arbeitsmappe ist mit einem Kennwort geschützt."
  Else
    MsgBox "Die Arbeitsmappe ist nicht geschützt."
  End If
  Set objDSODocument = Nothing
  Set objDSOReader = Nothing

End Sub

Weitere Informationen

Excel-Dateiformat

VBA-Spezialthema: OLE Document Properties (DSOFile)

Fragen und Antworten: Herausfinden, ob ein Dateikennwort verwendet wird, ohne die Mappe in Excel zu öffnen

 

Verwandte Codebeispiele

Prüfen, ob eine geöffnete Arbeitsmappe ein Dateikennwort verwendet

To Top


Prüfen, ob eine Arbeitsmappe ein Auto_Open-Makro enthält

.Beschreibung
Mit der folgenden Funktion kann überprüft werden, ob sich im VBA-Projekt einer geöffneten Arbeitsmappe ein Auto_Open-Makro befindet. Wenn das Makro Auto_Open existiert, wird der Name des Codemoduls zurückgeben, in dem das Makro vorgefunden wurde.

.VBA-Code
Function CheckIfSubExists(strSubName As String) As String
  Dim lngLineCounter As Long
  Dim strSubNamePublic As String
  Dim objComponent As VBComponent
  strSubName = UCase("Sub " & strSubName & "()")
  strSubNamePublic = UCase("Public " & strSubName)
  For Each objComponent In Workbooks("MeineMappe.xls").VBProject.VBComponents
    With objComponent.CodeModule
      For lngLineCounter = 1 To .CountOfLines
        If UCase(.Lines(lngLineCounter, 1)) = strSubName Or _

            UCase(.Lines(lngLineCounter, 1)) = strSubNamePublic Then
          CheckIfSubExists = objComponent.CodeModule
          Exit Function
        End If
      Next lngLineCounter
    End With
  Next objComponent
  CheckIfSubExists = ""
End Function

'*** Aufruf ***
Sub TestCall()
  Dim strModule As String
  strModule = CheckIfSubExists("Auto_Open")
  If strModule <> "" Then
    MsgBox "Prozedur gefunden in " & strModule & "."
  Else
    MsgBox "Prozedur nicht gefunden."
  End If
End Sub

.Hinweis
Abgesehen von der Prozedur Auto_Open kann natürlich auch das Auto_Close-Makro überprüft werden, indem der Funktionsaufruf entsprechend angepasst wird (siehe Prozedur TestCall).

Der oben vorgestellte VBA-Programmcode funktioniert nur, wenn das VBA-Projekt nicht mit einem Kennwort geschützt ist. Wie Sie herausfinden können, ob ein geschütztes Projekt ein Auto_Open-Makro enthält, lesen Sie hier:

Weitere Informationen

VBA-Spezialthema: Auto-Makros

 

Verwandte Codebeispiele

Prüfen, ob eine Dokument-Datei Makros enthält

To Top


Prüfen, ob eine Dokument-Datei Makros enthält

.Beschreibung
Es gibt eine interessante Möglichkeit, wie man herausfinden kann, ob sich in einer Excel-Arbeitsmappe oder einem Word-Dokument Makros befinden. Dazu bedient man sich der HasMacros-Eigenschaft aus der Bibliothek "OLE Document Properties Reader" (Datei "DSOFile.dll").

Bei der HasMacros-Eigenschaft muss beachtet werden, dass sie nur dann einen korrekten Wert liefert, wenn die Datei eine Microsoft Excel- oder eine Microsoft Word-Datei ist. Ob die Excel-Datei eine Arbeitsmappe (Dateinamenerweiterung xls), eine Vorlagemappe (xlt), ein Add-In (xla) oder eine Sicherungskopie (xlk) ist, ist jedoch nicht von Bedeutung, da alle diese Dateien intern gleich strukturiert sind (bei Word-Dateien verhält es sich gleich). Wenn Sie HasMacros bei einem anderen Dokumentdateityp abfragen, beispielsweise bei einer PowerPoint-Präsentation, einem Microsoft Projekt-Projektplan oder einem Crystal Reports-Bericht, so erscheint der Laufzeitfehler -2147220988 (&H80040204) "This property can only be called on Word or Excel documents". Dieser Fehler ist im hier vorgestellten Codebeispiel abgefangen.

.VBA-Code
Public Sub CheckIfHasMacros()
  Dim objDSOReader As Object
  Dim objDSODocument As Object

  Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
  Set objDSODocument = objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")

  On Error Resume Next
  strMacros = CStr(objDSODocument.HasMacros)
  If Err.Number = &H80040204 Then
    MsgBox "Die Existenz von Makros kann für diesen Dokumenttyp nicht abgefragt werden."
  Else
    If strMacros = "True" Then
      MsgBox "Das Dokument enthält Makros."
    Else
      MsgBox "Das Dokument enthält keine Makros."
    End If
  End If
  Set objDSODocument = Nothing
  Set objDSOReader = Nothing

End Sub

.Hinweis
HasMacros verwendet ein 'pessimistisches' Verfahren zum Ermitteln, ob ein Dokument Makros enthält. Überprüft wird nicht die tatsächliche Existenz eines Makros, sondern das blosse Vorhandensein des VBA-Projektes. Auch wenn das VBA-Projekt keinerlei Programmcode enthält, gibt HasMacros Wahr/True zurück, weil die Projektstruktur vorhanden ist und somit VBA-Code aufnehmen könnte. In Excel-Arbeitsmappen ist die Projektstruktur in einem Storage mit der Bezeichnung "_VBA_PROJECT_CUR" gespeichert (bei Excel 5.0/95-Mappen im Storage "_VBA_PROJECT"). HasMacros prüft lediglich, ob dieser Storage existiert. Wenn also HasMacros die Existenz von Makros meldet, so bedeutet dies nicht zwingend, dass tatsächlich Makros in Form von ausführbarem VBA-Code vorhanden sind.

Weitere Informationen

VBA-Spezialthema: OLE Document Properties (DSOFile)

To Top


Datei löschen

.Beschreibung
Mit der VBA-Anweisung Kill lässt sich eine einzelne Datei löschen. Die Datei wird dabei unwiederherstellbar gelöscht, d.h. nicht in den Papierkorb von Windows verschoben.

Nebenbei erwähnt können mit Kill auch mehrere Dateien auf einen Schlag gelöscht werden. Siehe dazu das unter "Verwandte Codebeispiele" angegebene Beispiel.

.VBA-Code #1
Public Sub DeleteFile1()
  Kill "C:\Daten\MeineMappe.xls"
End Sub

.Hinweis
Da beim Versuch, eine nicht vorhandene Datei zu löschen, der Laufzeitfehler 53 "Datei nicht gefunden" auftritt, sollte dieser Laufzeitfehler mit einer Fehlerbehandlungsroutine abgefangen werden. Wird versucht, eine momentan gesperrte Datei zu löschen, so erscheint der Laufzeitfehler 70 "Zugriff verweigert". Der durch eine Fehlerbehandlung erweiterte VBA-Code sieht so aus:

.VBA-Code #2
Public Sub DeleteFile2()
  On Error Resume Next
  Kill "C:\Daten\MeineMappe.xls"
  If Err.Number = 53 Then
    MsgBox "Die Datei ist nicht vorhanden."
  ElseIf Err.Number = 70 Then
    MsgBox "Die Datei ist gesperrt."
  ElseIf Err.Number <> 0 Then
    MsgBox "Ein Fehler ist aufgetreten."
  End If
  On Error Goto 0
End Sub

Grundsätzlich sollte man bei Dateioperationen alle potenziellen Laufzeitfehler abfangen und behandeln. Angenommen, der im obigen Beispiel angegebene Dateipfad "C:\Daten\MeineMappe.xls" würde auf ein Laufwerk verweisen, welches nicht verfügbar ist (z.B. ein nicht verbundenes Netzlaufwerk oder eine defekte Festplatte), so würde der Laufzeitfehler 68 "Gerät nicht verfügbar" erscheinen.

Detaillierte Informationen mit Empfehlungen bezüglich korrekter Behandlung von Datei- und Pfad-Laufzeitfehlern erhalten Sie hier:

Weitere Informationen

VBA-Spezialthema: VBA-Laufzeitfehler

VBA-Befehle und -Funktionen

 

Verwandte Codebeispiele

Datei über den Löschen-Dialog löschen

Mehrere Dateien löschen

To Top


Datei über den Löschen-Dialog löschen

.Beschreibung
Kaum ein Excel-Programmierer weiss, dass Microsoft Excel ein spezielles Dialogfenster zum Löschen von Dateien besitzt. Es gleicht dem Öffnen-Dialogfenster, ausser dass es mit "Löschen" betitelt und anstelle der Öffnen-Schaltfläche eine mit "Löschen" beschriftete Schaltfläche zu sehen ist.

.VBA-Code #1
Public Sub DeleteFileWithDialog()
  Application.Dialogs(xlDialogFileDelete).Show
End Sub

.VBA-Code #2
Public Sub DeleteFileWithDialog2()
  Dim bolReturnCode As Boolean
  bolReturnCode = Application.Dialogs(xlDialogFileDelete).Show
End Sub

.Hinweis
Sobald eine Datei über die Löschen-Schaltfläche des Dialogfensters gelöscht wird, erscheint die Rückfragemeldung, ob die Datei wirklich gelöscht werden soll. Damit diese Rückfrage nicht angezeigt wird, werden Sie als versierter VBA-Programmierer vermutlich versuchen, mit der Codezeile "Application.DisplayAlerts = False" die Meldung auszuschalten. Sie können die DisplayAlerts-Codezeile ruhig weglassen, denn sie funktioniert beim Löschen-Dialog nicht wie erwartet. Die Löschen-Rückfrage wird zwar korrekt unterdrückt; die selektierte Datei jedoch wird bei Anklicken der Löschen-Schaltfläche nicht gelöscht. Mit anderen Worten: Es passiert nichts.

Weitere Informationen

Fragen und Antworten: Wie kann man mit VBA einen Dateidialog zum Löschen einer Datei programmieren?

 

Verwandte Codebeispiele

Datei löschen

Datei löschen-Dialog anzeigen

Mehrere Dateien löschen

To Top


Datei löschen-Dialog anzeigen

.Beschreibung
Kaum ein Excel-Programmierer weiss, dass Microsoft Excel ein integriertes Dialogfenster zum Löschen von Dateien besitzt. Es kann mit VBA über die Dialogs-Auflistung aufgerufen werden.

» Das Beispiel #1 öffnet den Löschen-Dialog, wobei das aktuelle Arbeitsverzeichnis (Current Directory; CurDir) angezeigt und der Dateityp-Filter auf "Alle Dateien (*.*)" eingestellt werden.

» Das Beispiel #2 öffnet den Löschen-Dialog, wobei das aktuelle Arbeitsverzeichnis (Current Directory; CurDir) angezeigt, der Dateiname "MeineMappe.xls" vorgeblendet und der Dateityp-Filter auf "Tabellen (*.xls)" eingestellt werden.

» Das Beispiel #3 öffnet den Löschen-Dialog, wobei das Verzeichnis "C:\Daten" angezeigt, der Dateiname "MeineMappe.xls" vorgeblendet und der Dateityp-Filter auf "Tabellen (*.xls)" eingestellt werden.

» Das Beispiel #4 öffnet den Löschen-Dialog, wobei das Verzeichnis "C:\Daten" angezeigt und der Dateityp-Filter auf "Alle Dateien (*.*)" eingestellt werden.

» Das Beispiel #5 öffnet den Löschen-Dialog, wobei das Verzeichnis "C:\Daten" angezeigt, der Dateityp-Filter auf "Tabellen (*.xls)" eingestellt und alle mit der Zeichenfolge "Meine" beginnenden xls-Dateien angezeigt werden.

» Das Beispiel #6 öffnet den Löschen-Dialog, wobei das Verzeichnis "C:\Daten" angezeigt, der Dateityp-Filter auf "Alle Dateien (*.*)" eingestellt und alle mit der Zeichenfolge "Mappe" endenden csv-Dateien angezeigt werden. Excel stellt automatisch den Dateityp "Alle Dateien (*.*)" und nicht "CSV (*.csv)" ein, da es im Löschen-Dialog für csv-Dateien keinen separaten Eintrag in der Dateityp-Auswahlliste gibt.

.VBA-Code #1
Sub ShowFileDeleteDialog1()
  Application.Dialogs(xlDialogFileDelete).Show
End Sub

.VBA-Code #2
Sub ShowFileDeleteDialog2()
  Application.Dialogs(xlDialogFileDelete).Show "MeineMappe.xls"
End Sub

.VBA-Code #3
Sub ShowFileDeleteDialog3()
  Application.Dialogs(xlDialogFileDelete).Show "C:\Daten\MeineMappe.xls"
End Sub

.VBA-Code #4
Sub ShowFileDeleteDialog4()
  Application.Dialogs(xlDialogFileDelete).Show "C:\Daten"
End Sub

.VBA-Code #5
Sub ShowFileDeleteDialog5()
  Application.Dialogs(xlDialogFileDelete).Show "C:\Daten\Meine*.xls"
End Sub

.VBA-Code #6
Sub ShowFileDeleteDialog6()
  Application.Dialogs(xlDialogFileDelete).Show "C:\Daten\*Mappe.csv"
End Sub

.Hinweis
Sobald eine Datei über die Löschen-Schaltfläche des Dialogfensters gelöscht wird, erscheint die Rückfragemeldung, ob die Datei wirklich gelöscht werden soll. Damit diese Rückfrage nicht angezeigt wird, werden Sie als versierter VBA-Programmierer vermutlich versuchen, mit der Codezeile "Application.DisplayAlerts = False" die Meldung auszuschalten. Sie können die DisplayAlerts-Codezeile ruhig weglassen, denn sie funktioniert beim Löschen-Dialog nicht wie erwartet. Die Löschen-Rückfrage wird zwar korrekt unterdrückt; die selektierte Datei jedoch wird bei Anklicken der Löschen-Schaltfläche nicht gelöscht. Mit anderen Worten: Es passiert nichts.

Weitere Informationen

Fragen und Antworten: Wie kann man mit VBA einen Dateidialog zum Löschen einer Datei programmieren?

 

Verwandte Codebeispiele

Datei löschen

Datei über den Löschen-Dialog löschen

Mehrere Dateien löschen

To Top


Datei in den Papierkorb verschieben

.Beschreibung
Mit der API-Funktion SHFileOperation kann man eine beliebige Datei in den Windows-Papierkorb verschieben. Auf diese Weise wird die Datei zwar gelöscht, ist aber im Papierkorb noch vorhanden und kann somit bei Bedarf wiederhergestellt werden.

Das folgende Codebeispiel zeigt eine Musterlösung. Der Zugriff auf die SHFileOperation-API-Funktion wurde in der Funktion MoveFileToRecycleBin gekapselt und verschiedene Kontrollabfragen eingebaut.

.VBA-Code
'Deklarationsbereich
Public Type SHFILEOPSTRUCT
  hwnd As Long
  wFunc As Long
  pFrom As String
  pTo As String
  fFlags As Integer
  fAnyOperationsAborted As Long
  hNameMappings As Long
  lpszProgressTitle As Long
End Type
Public Declare Function SHFileOperation Lib "shell32.dll" Alias _

  "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
Public Const FO_DELETE = &H3
Public Const FOF_ALLOWUNDO = &H40

Public Const FOF_NOCONFIRMATION = &H10

'Codemodul
Public Function MoveFileToRecycleBin(ByVal Filename As String, Optional Confirm As Boolean = False) As Long
  Dim SHop As SHFILEOPSTRUCT
  If Len(Filename) < 4 Then
    MoveFileToRecycleBin = -3
    Exit Function
  ElseIf InStr(Filename, "*") Or InStr(Filename, "?") Then
    MoveFileToRecycleBin = -2
    Exit Function
  ElseIf Dir(Filename, vbHidden) = "" Then
    MoveFileToRecycleBin = -1
    Exit Function
  End If
  With SHop
    .wFunc = FO_DELETE
    .pFrom = Filename
    If Confirm Then
      .fFlags = FOF_ALLOWUNDO   'Rückfrage "Soll wirklich in den Papierkorb verschoben werden?" einblenden
    Else
      .fFlags = FOF_ALLOWUNDO Or FOF_NOCONFIRMATION   'Keine Rückfrage einblenden
    End If
  End With
  MoveFileToRecycleBin = SHFileOperation(SHop)
End Function

'*** Aufruf ***
Sub TestCall()
  Dim lngRC As Long
  lngRC = MoveFileToRecycleBin("C:\Daten\EineMappe.xls", True)
  If lngRC = 0 Then
    MsgBox "Die Datei wurde in den Papierkorb verschoben (ausser Benutzer hat Rückfrage verneint).", vbInformation
  ElseIf lngRC = -1 Then
    MsgBox "Die Datei ist nicht vorhanden!", vbExclamation
  ElseIf lngRC = -2 Then
    MsgBox "Die Platzhalterzeichen * und ? sind nicht erlaubt!", vbExclamation
  ElseIf lngRC = -3 Then
    MsgBox "Der Dateiname ist zu kurz!", vbExclamation
  ElseIf lngRC = 5 Then
    MsgBox "Zugriffsfehler aufgetreten! Wahrscheinlich keine Löschberechtigung vorhanden.", vbExclamation
  ElseIf lngRC = 32 Then
    MsgBox "Zugriffsfehler aufgetreten! Wahrscheinlich ist die Datei gesperrt.", vbExclamation
  Else
    MsgBox "Fehler aufgetreten!", vbExclamation
  End If
End Sub

Achtung! ACHTUNG!
Beachten Sie unbedingt, dass Sie der Variable SHop.pFrom einen gültigen Pfad-/Dateinamen zuweisen, bevor Sie die Datei verschieben (was mit der Codezeile "SHFileOperation SHop" erfolgt). Kontrollieren Sie in Ihrem VBA-Programmcode besser gleich doppelt, ob tatsächlich eine gültige, existierende Datei angegeben ist. Die Folgen eines falschen Dateinamens können absolut fatal sein.

Anmerkung des Autors
Ich spreche hier aus eigener Erfahrung. Ich verwendete in einem Programm sinngemäss die Anweisung

  strFile = strPath & "\" & strFileToDelete

zum Festlegen der zu löschenden Datei. Da beim Aufruf der Prozedur MoveFileToRecycleBin die beiden obigen Variablen strPath und strFileToDelete irrtümlich leer waren, wurde der Variable strFile lediglich das Backslash-Zeichen ('\') zugewiesen. Wer die Möglichkeiten der Shell bzw. Befehlszeile kennt, der weiss, dass der Backslash gleich Stammverzeichnis der Festplatte bedeutet. Dies führte schliesslich zu einer Katastrophe: Es wurden alle Dateien und Ordner der gesamten Festplatte gelöscht!

.Hinweis
Weder die Kill-Anweisung von VBA noch die DeleteFile-Methode aus der FileSystemObject-Objektbibliothek kann eine Datei in den Papierkorb verschieben. Beide löschen die Datei sofort und unwiderruflich.

Verwandte Codebeispiele

Datei löschen

Datei der aktiven Arbeitsmappe löschen

Datei über den Löschen-Dialog löschen

Datei löschen-Dialog anzeigen

To Top


Datei der aktiven Arbeitsmappe löschen

.Beschreibung
Die Datei der aktiven Arbeitsmappe kann normalerweise gar nicht gelöscht werden, da sie geöffnet und somit gesperrt ist. Dies gilt jedoch nur, wenn die aktive Mappe zur Bearbeitung im Schreib-Lese-Zugriffsmodus (auch Exklusivmodus genannt) geöffnet wurde, was normalerweise der Fall ist. Eine Arbeitsmappe, die schreibgeschützt geöffnet wurde (read-only) oder die für die gemeinsame Bearbeitung freigegeben wurde, kann dagegen ohne weiteres gelöscht werden, da in diesem Fall die xls-Datei nicht gesperrt ist. Damit eine "normal" geöffnete Arbeitsmappe gelöscht werden kann, muss zuerst der Zugriffsmodus für die Arbeitsmappendatei auf "Schreibgeschützt" geändert werden.

Das VBA-Beispiel löscht die Datei der aktiven Arbeitsmappe und schliesst anschliessend die Mappe.

.Autor
Hans W. Herber, www.herber.de (Anpassungen durch Philipp von Wartburg)

.VBA-Code
Public Sub KillActiveWorkbookFile()
  ActiveWorkbook.ChangeFileAccess xlReadOnly
  Kill ActiveWorkbook.FullName
  ThisWorkbook.Close False
End Sub

.Hinweis
Bitte beachten Sie, dass die aktive Arbeitsmappe sofort und endgültig gelöscht wird; sowohl von der Festplatte als auch aus dem Arbeitsspeicher.

Weitere Informationen

Excel-Objektmodell: Methoden des Workbook-Objektes

To Top


Prüfen, ob ein Datenträger in Laufwerk A: eingelegt ist

.Beschreibung
Mit der nachfolgenden Prozedur kann man überprüfen, ob sich eine Diskette im Laufwerk A: befindet. Zusätzlich wird geprüft, ob sich auf der eingelegten Diskette mindestens eine Datei oder ein Ordner befindet oder ob die Diskette leer ist.

Anhand den drei Konstanten vbNormal, vbHidden und vbDirectory, die durch Verwendung des Or-Operators zu einer so genannten logischen Disjunktion kombiniert werden, können sowohl Dateien als auch Ordner, die auch versteckt sein dürfen, erkannt werden.

.VBA-Code
Public Sub IsDiskAvailable()
  Dim strFileOrFolder As String
  On Error GoTo ErrorHandler
  strFileOrFolder = Dir("A:", vbNormal Or vbHidden Or vbDirectory)
  If strFileOrFolder <> "" Then
    MsgBox "Datenträger ist bereit. Er ist leer."
  ElseIf strFileOrFolder = "" Then
    MsgBox "Datenträger ist bereit. Er ist nicht leer."
  End If
  Exit Sub
ErrorHandler:
  If Err.Number = 71 Then
    MsgBox "Datenträger ist nicht bereit."
  Else
    MsgBox "Fehler " & Err.Number & " aufgetreten!"
  End If
End Sub

Verwandte Codebeispiele

Prüfen, ob das Laufwerk A: bereit ist

 

Weitere Informationen

Bekannte Probleme in VBA: Verborgene Dateien werden von Dir ohne Attribute-Parameter nicht erkannt

VBA-Befehle und -Funktionen

To Top


Prüfen, ob das Laufwerk A: bereit ist

.Beschreibung
Mit Hilfe der IsReady-Eigenschaft des Drive-Objektes aus der FileSystemObject-Bibliothek kann man überprüfen, ob ein Laufwerk bereit ist. Im nachstehenden Codebeispiel wird das Disketten-Laufwerk A: überprüft. Der Vorteil bei der Verwendung von IsReady ist, dass, im Gegensatz zur VBA-Funktion Dir, kein Fehler auftritt, wenn keine Diskette eingelegt ist. Bei "Dir("A:")" würde der Laufzeitfehler 71 "Datenträger nicht bereit" erscheinen.

Der Programmcode funktioniert übrigens auch mit anderen Geräten, beispielsweise mit einem CD ROM-Laufwerk.

.VBA-Code
Public Sub IsDiskDriveReady()
  If CreateObject("Scripting.FileSystemObject").GetDrive("A:").IsReady = True Then
    MsgBox "Laufwerk A: ist bereit."
  Else
    MsgBox "Laufwerk A: ist nicht bereit."
  End If
End Sub

Verwandte Codebeispiele

Prüfen, ob ein Datenträger in Laufwerk A: eingelegt ist

 

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Netzlaufwerk verbinden

.Beschreibung
Diese Beispiel zeigen, wie man ein Netzlaufwerk bzw. eine freigegebene Remote-Ressource verbinden kann (Laufwerk mappen). Damit der Programmcode ausgeführt werden kann, muss im VBA-Projekt ein Verweis auf die Windows Script Host-Bibliothek gesetzt werden.

» Das Codebeispiel #1 verbindet den Ordner SharedFolder des Servers DataServer als neues Laufwerk mit dem Buchstaben "H:".

» Das Beispiel #2 stellt ebenfalls die Verbindung her, wobei hier kein Laufwerkbuchstabe zugeordnet wird.

» Das dritte Beispiel mappt die Netzwerk-Ressource als Laufwerk "H:" und verwendet für die Anmeldung mit der Ressource den Benutzernamen "<Username>" und das Passwort "<Password>".

» Das Codebeispiel #4 verbindet die Netzwerk-Ressource via Automation mit Microsoft Word.

» Das Codebeispiel #5 verbindet die Netzwerk-Ressource via Automation mit Microsoft Word, wobei hier ein Passwort verlangt wird.

.VBA-Code #1
Sub MapNetworkDrive1()
  Dim wshNetwork As New IWshRuntimeLibrary.IWshNetwork_Class

  wshNetwork.MapNetworkDrive "H:", "\\DataServer\SharedFolder"
  Set wshNetwork = Nothing
End Sub

.VBA-Code #2
Sub MapNetworkDrive2()
  Dim wshNetwork As New IWshRuntimeLibrary.IWshNetwork_Class

  wshNetwork.MapNetworkDrive "\\DataServer\SharedFolder"
  Set wshNetwork = Nothing
End Sub

.VBA-Code #3
Sub MapNetworkDrive3()
  Dim wshNetwork As New IWshRuntimeLibrary.IWshNetwork_Class

  wshNetwork.MapNetworkDrive "H:", "\\DataServer\SharedFolder", , "<Username>", "<Password>"
  Set wshNetwork = Nothing
End Sub

.VBA-Code #4
Sub MapNetworkDrive4()
  Dim objWord As Object
  Set objWord = CreateObject("Word.Application")
  On Error Resume Next
  objWord.System.Connect "\\Server\Freigabe"
  If Err.Number = 5688 Then
    MsgBox "Die Netzwerkverbindung konnte nicht hergestellt werden!", vbExclamation
    Err.Clear
  End If
  objWord.Quit
  Set objWord = Nothing
End Sub

.VBA-Code #5
Sub MapNetworkDrive5()
  Dim objWord As Object
  Set objWord = CreateObject("Word.Application")
  On Error Resume Next
  objWord.System.Connect "\\Server\Freigabe", 1, "<Password>"
  If Err.Number = 5688 Then
    MsgBox "Die Netzwerkverbindung konnte nicht hergestellt werden!", vbExclamation
    Err.Clear
  End If
  objWord.Quit
  Set objWord = Nothing
End Sub

Weitere Informationen

Netzlaufwerk trennen

VBA-Spezialthema: Windows Script Host (WSH)

To Top


Netzlaufwerk trennen

.Beschreibung
Mit der hier vorgestellten Prozedur wird ein Netzlaufwerk bzw. die Verbindung mit einer Remote-Ressource getrennt. Damit das Beispiel ausgeführt werden kann, muss im VBA-Projekt ein Verweis auf die Windows Script Host-Bibliothek gesetzt werden.

» Im ersten Beispiel die dem Laufwerkbuchstaben "H:" zugeordnete Netzlaufwerk-Verbindung getrennt.

» Das Beispiel #2 trennt die Verbindung zur Remote-Ressource "\\DataServer\SharedFolder", welcher kein Laufwerkbuchstabe zugewiesen wurde.

.VBA-Code #1
Sub RemoveNetworkDrive1()
  Dim wshNetwork As New IWshRuntimeLibrary.IWshNetwork_Class

  wshNetwork.RemoveNetworkDrive "H:"
  Set wshNetwork = Nothing
End Sub

.VBA-Code #2
Sub RemoveNetworkDrive2()
  Dim wshNetwork As New IWshRuntimeLibrary.IWshNetwork_Class

  wshNetwork.RemoveNetworkDrive "\\DataServer\SharedFolder"
  Set wshNetwork = Nothing
End Sub

Weitere Informationen

Netzlaufwerk verbinden

VBA-Spezialthema: Windows Script Host (WSH)

To Top


Textdatei in Excel öffnen und als Arbeitsmappe speichern

.Beschreibung
Hier wird gezeigt, wie eine Textdatei in Microsoft Excel geöffnet und anschliessend als Arbeitsmappe (xls-Dateiformat) gespeichert wird. Das Beispiel verwendet Office Automation; der Programmcode kann somit in einem beliebigen Microsoft Office-Programm wie zum Beispiel Word oder PowerPoint ausgeführt werden (Microsoft Excel muss jedoch installiert sein, da sonst die Objekterstellung mit CreateObject fehlschlägt).

.VBA-Code
Sub ConvertTextfileToWorkbook()
  'Neue Instanz von Microsoft Excel anlegen
  Dim objExcel As Object
  Dim objBook As Object
  Set objExcel = CreateObject("Excel.Application")
  'Textdatei öffnen
  Set objBook = objExcel.Workbooks.Open("C:\Daten\EineTextdatei.txt")
  'Speichern als Arbeitsmappe
  objBook.SaveAs "C:\Daten\EineMappe.xls", -4143
  'Excel-Instanz beenden
  objExcel.Quit

  Set objBook = Nothing
  Set objExcel = Nothing
End Sub

Weitere Informationen

Textdatei in Excel öffnen

Formatierte Textdatei in Excel öffnen
Excel-Objektmodell: Methoden der Workbooks-Auflistung

To Top


Textdatei in Excel öffnen

.Beschreibung
Textdateien können mit Excel-VBA genau gleich wie gewöhnliche Arbeitsmappen (xls-Dateiformat) geöffnet werden, nämlich mit der Open-Methode des Workbooks-Auflistungsobjektes. Microsoft Excel nimmt die Konvertierung des Dateiinhaltes automatisch vor. Alternativ zu Open kann eine Textdatei auch mit der OpenText-Methode geöffnet werden. OpenText ist eigentlich die 'bessere' Lösung, da diese Methode speziell für Textdateien vorgesehen ist. Leider besitzt sie einen Nachteil gegenüber der Open-Methode (siehe Hinweis weiter unten).

.VBA-Code #1
Sub OpenTextFile1()
  Workbooks.Open "C:\Daten\EineTextdatei.txt"
End Sub

.VBA-Code #2
Sub OpenTextFile2()
  Workbooks.OpenText "C:\Daten\EineTextdatei.txt"
End Sub

.Hinweis
Obwohl in den meisten Fällen sowohl Open als auch OpenText gleichermassen zum erwarteten Ergebnis führen, besitzen die beiden Methoden einen wichtigen Unterschied:

Open ist eine Funktion, d.h. es wird eine Referenz auf ein Workbook-Objekt zurückgegeben. OpenText dagegen ist eine Prozedur und kann folgedessen keine Objektreferenz zurückgeben. Dieser Unterschied ist von Bedeutung - und ein Nachteil, wenn Sie mit Objektvariablen arbeiten. Diese Codezeile funktioniert problemlos und erstellt eine Objektvariable:

  Set wkbWorkbook = Workbooks.Open("C:\Daten\EineTextdatei.txt")

Diese Codezeile dagegen funktioniert nicht, da OpenText wie erwähnt keine Objektreferenz liefert:

  Set wkbWorkbook = Workbooks.OpenText("C:\Daten\EineTextdatei.txt")

Wenn Sie auf OpenText angewiesen sind, so müssen Sie diese Umgehungslösung verwenden:

  Workbooks.OpenText "C:\Daten\EineTextdatei.txt"
  Set wkbWorkbook = ActiveWorkbook

Bei der Umgehungslösung müssen Sie unbedingt allfällige Laufzeitfehler abfangen und korrekt behandeln. Falls nämlich OpenText fehlschlägt (z.B. weil die Textdatei nicht existiert), wird mit der Set-Anweisung trotzdem eine Referenz auf die aktive Arbeitsmappe gesetzt. Und dies ist wohlgemerkt nicht die Datei, die zuvor mit OpenText geöffnet werden sollte.

TODO...

Sub OpenText(Filename As String, [Origin], [StartRow], [DataType], [TextQualifier As XlTextQualifier = xlTextQualifierDoubleQuote], [ConsecutiveDelimiter], [Tab], [Semicolon], [Comma], [Space], [Other], [OtherChar], [FieldInfo], [TextVisualLayout])

XlTextQualifier

xlTextQualifierDoubleQuote
xlTextQualifierNone
xlTextQualifierSingleQuote

 

Beachten Sie unbedingt, dass die OpenText-Methode von Excel 2000 gegenüber Excel 97 geändert hat. Die OpenText-Methode von Excel 2002 hat sich gegenüber Excel 2000 ebenfalls geändert.

Verwandte Codebeispiele

Formatierte Textdatei in Excel öffnen
Textdatei in Excel öffnen und als Arbeitsmappe speichern

 

Weitere Informationen

Excel-Objektmodell: Methoden der Workbooks-Auflistung

To Top


Text an Drucker anstelle an Datei senden (Speichern in Druckerdatei)

.Beschreibung
Mit einem kleinen Trick können Sie beliebigen Text direkt in eine Art Druckerdatei statt in eine gewöhnliche (Text-)Datei speichern. Dazu muss anstelle eines Dateinamens bei der Open-Anweisung lediglich das Schlüsselwort "PRN" angegeben werden, wodurch der Standard-Drucker der Arbeitsstation verwendet wird.

.VBA-Code
Sub WriteToPrinter()
  Open "PRN" For Output As #1
    Print #1, "Hallo Drucker!"
  Close #1
End Sub

.Hinweis
Beachten Sie, dass bei dieser "Speicherung" der Text an den Drucker gesendet wird und ohne dass der Drucker ein Blatt ausgibt. Damit Sie ein mit dem Text bedrucktes Blatt erhalten, müssen Sie bei Ihrem Drucker auf die "Vorschub"-Taste (englisch 'Form Feed') drücken. Je nach Typ und Modell des Druckers kann die Taste unterschiedlich beschriftet sein.

Weitere Informationen

VBA-Befehle und -Funktionen

To Top


Datei-Verknüpfung erstellen

.Beschreibung
Mit den Möglichkeiten des Windows Script Host (WSH) lässt sich sehr einfach eine Datei-Verknüpfung (Dateinamenerweiterung 'lnk') anlegen. Dieses Beispiel zeigt exemplarisch, wie eine Verknüpfung mit einer Excel-Arbeitsmappe (im VBA-Codebeispiel "DemoMappe.xls") erstellt wird. Die Verknüpfung wird im Ordner "C:\Excel" angelegt und verwendet als Arbeitsverzeichnis "C:\Windows". Der Dateiname der Verknüpfung lautet im Beispiel "Link zu DemoMappe.lnk", wobei Sie auch einen beliebigen anderen Namen wählen können.

Bitte beachten Sie den Hinweis bezüglich Objektbibliothek-Verweis am Ende des Codebeispiels.

.VBA-Code
Sub CreateFileShortcut()
  Dim objWSHShell As New IWshRuntimeLibrary.IWshShell_Class
  Dim objWSHShortcut As IWshRuntimeLibrary.IWshShortcut_Class
  Set objWSHShortcut = objWSHShell.CreateShortcut("C:\Excel\Link zu DemoMappe.lnk")
  With objWSHShortcut

    .TargetPath = "D:\Daten\DemoMappe.xls"
    .Description = "Dies ist eine neue Verknüpfung"
    .WorkingDirectory = "C:\Windows"
    .WindowStyle = 1   '1 = normale Fenstergrösse
    .Save
  End With

  Set objWSHShortcut = Nothing
  Set objWSHShell = Nothing
End Sub

.Hinweis
Bitte beachten Sie, dass für die Ausführung des obigen Codes ein Verweis auf die Bibliothek "Windows Script Host Object Model (Ver 1.0)" gesetzt werden muss (nicht zu verwechseln mit der Bibliothek "Microsoft Scripting Runtime", Datei scrrun.dll). Wenn die Bibliothek nicht in der Liste "Verfügbare Verweise" aufgeführt ist, können Sie mit der Durchsuchen-Schaltfläche die benötigte Datei einbinden; sie heisst WSHOM.ocx und sollte in einem Windows-Verzeichnis aufzuspüren sein (d.h. Windows, Windows\System oder Windows\System32).

Wenn Sie dem VBA-Projekt keinen Verweis hinzufügen möchten, können Sie als Alternative die Variante "Late Binding" verwenden. Ersetzen Sie dazu die beiden Codezeilen

  Dim objWSHShell As New IWshRuntimeLibrary.IWshShell_Class
  Dim objWSHShortcut As IWshRuntimeLibrary.IWshShortcut_Class

durch diese drei Zeilen:

  Dim objWSHShell As Object
  Dim objWSHShortcut As Object
  Set objWSHShell = CreateObject("WScript.Shell")

Die restlichen Programmzeilen müssen nicht angepasst werden.

Verwandte Codebeispiele

Datei-Verknüpfung auf dem Windows Desktop erstellen

Datei-Verknüpfung im Favoriten-Ordner erstellen

Datei-Verknüpfung im Eigene Dateien-Ordner erstellen

Datei-Verknüpfung im Windows-Startmenü erstellen

Verknüpfung zu einer Programmdatei im 'Senden an'-Menü des Windows Explorers erstellen

Datei-Verknüpfung zu einer Programmdatei im Autostart-Ordner erstellen

Internet-Verknüpfung erstellen

Verknüpfung mit Arbeitsmappe zu Favoriten hinzufügen

Zieldatei aus einer Datei-Verknüpfung (lnk-Datei) ermitteln

Ordner-Verknüpfung erstellen

 

Weitere Informationen

VBA-Spezialthema: Windows Script Host (WSH)

To Top


Ordner-Verknüpfung erstellen

.Beschreibung
Mit der Objektbibliothek Windows Script Host (WSH) kann man nebst Datei-Verknüpfungen auch Ordner-Verknüpfungen erstellen. In diesem Codebeispiel wird eine Verknüpfung auf den Ordner "C:\Daten" mit dem Namen "C:\Excel\Ordner-Verknüpfung.lnk" angelegt.

Bitte beachten Sie den Hinweis bezüglich Objektbibliothek-Verweis am Ende dieses Codebeispiels.

.VBA-Code
Sub CreateFolderShortcut()
  Dim objWSHShell As New IWshRuntimeLibrary.IWshShell_Class
  Dim objWSHShortcut As IWshRuntimeLibrary.IWshShortcut_Class
  Set objWSHShortcut = objWSHShell.CreateShortcut("C:\Excel\Ordner-Verknüpfung.lnk")
  With objWSHShortcut

    .TargetPath = "C:\Daten"
    .Description = "Dies ist eine Ordner-Verknüpfung"
    .WorkingDirectory = ""
    .WindowStyle = WshNormalFocus
    .Save
  End Witn

  Set objWSHShortcut = Nothing
  Set objWSHShell = Nothing
End Sub

.Hinweis
Bitte beachten Sie, dass im VBA-Projekt ein Verweis auf die Bibliothek "Windows Script Host Object Model (Ver 1.0)" gesetzt werden muss (nicht zu verwechseln mit der Bibliothek "Microsoft Scripting Runtime"). Wenn die Bibliothek nicht in der Liste der Verweise aufgeführt ist, können Sie mit der Durchsuchen-Schaltfläche die benötigte Datei einbinden; sie heisst "WSHOM.ocx" und sollte in einem Windows-Verzeichnis aufzuspüren sein (z.B. Windows\System oder Windows\System32).

Verwandte Codebeispiele

Ordner-Verknüpfung auf dem Windows Desktop erstellen

Ordner-Verknüpfung im Windows-Startmenü erstellen

Datei-Verknüpfung erstellen

Zieldatei aus einer Datei-Verknüpfung (lnk-Datei) ermitteln

 

Weitere Informationen

VBA-Spezialthema: Windows Script Host (WSH)

To Top


Fortlaufend nummerierte Mappenkopien im Temp-Verzeichnis von Windows anlegen

.Beschreibung
Vielleicht haben Sie schon mal eine Möglichkeit gesucht, wie man von einer geöffneten Arbeitsmappe Sicherungsdateien im Temp-Verzeichnis von Windows erstellen kann. Die Dateien sollen dabei als Dateiname eine fortlaufende Nummer verwenden. Die erste erstellte Sicherungsdatei besitzt also den Namen "1.tmp", die nächste Datei "2.tmp", dann "3.tmp" und so weiter.

Diese Aufgabestellung könnte man mit ein bisschen VBA-Code so lösen:
1. Temp-Verzeichnis von Windows herausfinden
2. Dateiname (Nummer) der zuletzt gespeicherten tmp-Datei ermitteln
3. Nummer um 1 erhöhen
4. Datei mit der neuen Nummer im Temp-Verzeichnis speichern

Das Temp-Verzeichnis lässt sich beispielsweise anhand von Environ("Temp") einfach ermitteln. Schwierig wird es beim Dateinamen einer Sicherungsdatei. Seit der Speicherung der letzten Sicherungsdatei könnte ein anderes Programm eine tmp-Datei mit einer Zahl als Dateiname erstellt haben. Man muss also herausfinden, ob die gewünschte Zahl bereits vorkommt. Wenn dies der Fall ist, muss ermittelt werden, welche Zahl in der Zahlenreihe denn verfügbar ist. Problematisch wird es, wenn zwischen Festlegen der neuen Nummer und Speichern der neuen Sicherungsdatei ein anderes Programm eine tmp-Datei mit 'unserem' Dateinamen anlegt. Diese Situation muss unbedingt abgefangen und gelöst werden.

Zum Glück gibt es einen Trick, der das Schreiben des erforderlichen Programmcodes überflüssig macht: Bekanntlich kann man mit der SaveCopyAs-Methode des Workbook-Objektes eine Sicherungskopie einer Arbeitsmappe erstellen. Kaum bekannt ist, dass SaveCopyAs eine zur Lösung unserer Aufgabe äusserst nützliche Eigenschaft aufweist.

Das Argument FileName der SaveCopyAs-Methode ist gemäss der im Excel-Objektmodell beschriebenen Parameter-Definition ein optionales Argument; laut der Online-Hilfe/Excel VBA-Referenz dagegen zwingend erforderlich. Wird das Argument weggelassen, erscheint tatsächlich der Laufzeitfehler 1004 "Anwendungs- oder objektdefinierter Fehler". Was jedoch nirgends steht, ist, dass das Argument auch leer sein darf.

Bei Angabe eines leeren Dateinamens für das FileName-Argument (z.B. 'FileName:=""') oder bei Verwendung einer nicht initialisierten Variable (z.B. 'FileName:=varDummy') speichert Microsoft Excel die Arbeitsmappe im Temp-Verzeichnis von Windows und gibt dieser Datei automatisch einen Dateinamen, der aus einer fortlaufenden Nummer und der Dateinamenerweiterung ".tmp" zusammengesetzt ist. Die fortlaufende Nummer ist eine Zahl, die basierend auf den im Temp-Verzeichnis bereits vorhandenen tmp-Dateien ermittelt wird. Ist beispielsweise eine Datei mit dem Namen "3.tmp" bereits vorhanden, so erhält die nächste mit SaveCopyAs gespeicherte Arbeitsmappe den Dateinamen "4.tmp".

.VBA-Code
Sub CreateTempFile()
  ActiveWorkbook.SaveCopyAs ""
End Sub

.Hinweis
Beim Speichern einer Mappe mittels SaveCopyAs werden die Saved-Eigenschaft und der Dateiname der geöffneten Arbeitsmappe nicht verändert.

Verwandte Codebeispiele

Temp-Verzeichnis von Windows ermitteln

Temporäre Datei im Temp-Verzeichnis von Windows erstellen

Temporäre Datei mit einem eindeutigen Namen in einem Ordner erstellen

 

Weitere Informationen

Excel-Objektmodell: Methoden des Workbook-Objektes

Fragen und Antworten: Wie findet man am einfachsten das Temp-Verzeichnis heraus?

To Top


Internet Explorer starten und Seite anzeigen

.Beschreibung
Mit einer einzigen Codezeile lässt sich der Internet Explorer starten und eine beliebige Seite bzw. Datei anzeigen. Die Adresse der Seite kann als URL (z.B. "www.xyz.com") oder als Pfad zur gewünschten HTML-Datei (z.B. "C:\Daten\EineSeite.htm") angegeben werden.

» Das erste Codebeispiel zeigt die am häufigsten verwendete Lösungsvariante mit der FollowHyperlink-Methode.

» Im zweiten Beispiel wird die Webseite mit der Run-Methode des Shell-Objektes aus der Windows Script Host-Bibliothek geöffnet.

.VBA-Code #1
Sub OpenInternetExplorer1()
  ActiveWorkbook.FollowHyperlink Address:="http://www.xyz.com", NewWindow:=True
End Sub

.VBA-Code #2
Sub OpenInternetExplorer2()
  CreateObject("WScript.Shell").Run "http://www.xyz.com"
End Sub

.Hinweis
Geben Sie für das FollowHyperlink-Argument NewWindow den Wert True an, da ansonsten die aktive Arbeitsmappe ausgeblendet wird.

Verwandte Codebeispiele

Internet Explorer starten

Internet Explorer im Vollbildmodus starten und Seite anzeigen

To Top


Internet Explorer im Vollbildmodus starten und Seite anzeigen

.Beschreibung
Der Internet Explorer verfügt über einen so genannten Kiosk-Modus, der unter anderem zum Ausführen des Webbrowsers im Vollbildmodus und ohne Menü-/Symbol- und Statusleiste benutzt wird. Der Modus wird Kiosk genannt, weil der Benutzer auf dem Bildschirm ausschliesslich den Inhalt der angezeigten Webseite sieht und unter anderem kein Adressfeld für die Eingabe einer URL zur Verfügung steht. Also Dinge, die bei Informationssystemen vorhanden sein müssen, welche eben beispielsweise in Kiosken stehen.

Der Kiosk-Modus wird durch Angabe des Befehlszeilen-Parameters "-k" beim Starten des Internet Explorers aktiviert. Ist der Explorer einmal gestartet, kann der Modus nicht mehr deaktiviert werden. Sie können den Internet Explorer durch Drücken der Tastenkombination Alt+F4 beenden.

Das Codebeispiel verwendet die Run-Methode des Shell-Objektes aus der Windows Script Host-Bibliothek, damit die Datei "IExplore.exe" ohne Angabe des vollständigen Dateipfades gestartet werden kann. Bei der Shell-Funktion von VBA ist dies nicht möglich.

.VBA-Code
Sub OpenInternetExplorer()
  CreateObject("WScript.Shell").Run "IExplore.exe -k"
End Sub

Verwandte Codebeispiele

Internet Explorer starten und Seite anzeigen

 

Weitere Informationen

VBA-Spezialthema: Windows Script Host (WSH)

VBA-Befehle und -Funktionen

To Top


Login-Name des angemeldeten Benutzers abfragen

.Beschreibung
Der Login-Name des aktuell in Windows angemeldeten Benutzers lässt sich mindestens auf zwei verschiedene Wege ermitteln. Wenn der Benutzer nicht angemeldet ist oder kein Benutzerprofil verwendet wird, kann es sein, dass als Name nichts oder lediglich zwei Punkte ("..") zurückgegeben werden (Anmerkung des Autors: Beispielsweise gibt Windows ME zwei Punkte zurück). Beide Lösungsvorschläge funktionieren übrigens gleich gut.

» Das erste Codebeispiel benötigt dazu lediglich eine einzige Codezeile und verwendet das Network-Objekt aus der Windows Script Host-Objektbibliothek.

» Das zweite Beispiel zeigt eine Lösungsvariante, welche die API-Funktion GetUserName benutzt.

.VBA-Code #1
Sub GetUserLoginName1()
  MsgBox CreateObject("WScript.Network").UserName
End Sub

.VBA-Code #2
'Deklarationsbereich
Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
  (ByVal lpBuffer As String, nSize As Long) As Long

'Codemodul
Sub GetUserLoginName2()
  Dim strUsername As String
  Dim lngLength As Long
  Dim lngRetVal As Long
  strUsername = Space$(255)
  lngLength = 255
  lngRetVal = GetUserName(strUsername, lngLength)
  strUsername = Left(strUsername, lngLength - 1)
  GetUserLoginName2 = strUsername

End Sub

.Hinweis
Bitte beachten Sie, dass auch dann ein Benutzername zurückgegeben wird, wenn sich der Benutzer nicht unter Windows anmelden musste, jedoch ein (allgemeines) Benutzerprofil verwendet wird.

Weitere Informationen

VBA-Spezialthema: Windows Script Host (WSH)

To Top


Windows beenden

.Beschreibung
Hier wird gezeigt, wie man Windows mittels VBA-Code beenden kann. Vor dem Beenden wird der Benutzer gewöhnlich gefragt, ob Änderungen in den Dokumenten der gerade laufenden Anwendungen vor dem Beenden gespeichert werden sollen.

» Codebeispiel #1: Mit der API-Funktion ExitWindowEx kann man Windows beenden, und zwar indem man für das erste Argument der Funktion die Zahl 1 angibt. Dieser Programmcode funktioniert in allen VBA-Programmen (egal ob Microsoft Excel, Word, PowerPoint oder dergleichen) und auch in VB-Programmen.

» Codebeispiel #2: Das Objektmodell von Microsoft Word enthält eine spezielle Methode namens ExitWindows zum Beenden von Windows. Der Programmcode dieses Codebeispiels funktioniert nur in einem VBA-Projekt von Microsoft Word.

» Codebeispiel #3: Man kann auch die ExitWindows-Methode von Microsoft Word-VBA in anderen Anwendungen wie beispielsweise Microsoft Excel benutzen. Dazu muss man Microsoft Word mittels Automation ferngesteuert werden. Diese Lösungsvariante funktioniert zwar grundsätzlich, sollte jedoch möglichst nicht zum Einsatz kommen. Das Problem ist, dass sich die Anwendung, in welcher der VBA-Code ausgeführt wird, nicht selber beenden kann. Fehlermeldungen wie Laufzeitfehler 7 "Nicht genügend Speicher" und Excel-Fehlermeldungen wie "Kann Microsoft Excel nicht beenden" können daher auftreten. Zudem kann die Systemmeldung "Anwendung reagiert nicht auf die Anforderung 'Task beenden'" erscheinen.

.VBA-Code #1
'Deklarationsbereich
Declare Function ExitWindowsEx Lib "user32" (ByVal Flags As Long, _
  ByVal Reserved As Long) As Long

'Codemodul
Sub QuitWindows1()
  ExitWindowsEx 1, 0
End Sub

.VBA-Code #2
Sub QuitWindows2()
  Application.Tasks.ExitWindows
End Sub

.VBA-Code #3
Sub QuitWindows3()
  Dim objWord As Object
  Set objWord = CreateObject("Word.Application")
  objWord.Tasks.ExitWindows
  objWord.Quit
  Set objWord = Nothing
End Sub

Verwandte Codebeispiele

Windows-Benutzer abmelden

Computer neu starten

Computer herunterfahren und ausschalten

To Top


Windows-Benutzer abmelden

.Beschreibung
Mit der API-Funktion ExitWindowEx kann man den aktuellen Windows-Benutzer abmelden, indem für das erste Funktionsargument Flags die Zahl 0 angeben. Bei Ausführen des Programmcodes werden nacheinander alle laufenden Anwendungen beendet und zum Schluss der Benutzer in Windows abgemeldet. Gewöhnlich erscheint dann das Benutzer-Anmeldefenster von Windows.

Bitte beachten Sie, dass andere Werte als 0 für Flags andere Auswirkungen besitzen, wie beispielsweise die Beendigung von Windows, den Neustart des Rechners oder das Ausschalten des Rechners. Wie das geht, erfahren Sie in den VBA-Codebeispielen unter "Verwandte Codebeispiele".

.VBA-Code
'Deklarationsbereich
Declare Function ExitWindowsEx Lib "user32" (ByVal Flags As Long, _
   ByVal Reserved As Long) As Long

'Codemodul
Sub LogoutWindowsUser()
  ExitWindowsEx 0, 0
End Sub

Verwandte Codebeispiele

Windows beenden

Computer neu starten

Computer herunterfahren und ausschalten

To Top


Windows-Version ermitteln

.Beschreibung
Es gibt mehrere Möglichkeiten zum Ermitteln der eingesetzten Windows-Version.

» Codebeispiel #1: Mit der Eigenschaft OperatingSystem des Application-Objektes von Microsoft Excel kann die eingesetzte Windows-Version abgefragt werden. Bei zum Beispiel einem Windows NT 4.0-System enthält die Eigenschaft die Zeichenfolge "Windows (32-bit) NT 4.00". Bei dieser Lösungsvariante wird somit der genaue Name der Windows-Version ("Windows (32-bit) NT") sowie die Versionsnummer ("4.00") ausgegeben.

» Codebeispiel #2: Als Alternative kann man auch die System-Umgebungsvariable "OS" abfragen, was allerdings unter Umständen nicht auf jedem Rechner einwandfrei funktionieren könnte, da "OS" nicht zwingend existieren muss, weil es keine Standard-Umgebungsvariable ist. Im Falle von Windows NT 4.0 wird die Zeichenfolge "Windows_NT" zurückgegeben. Bei dieser Variante wird folglich nur der Name des Betriebssystems ohne Versionsnummer ermittelt.

» Codebeispiel #3: Die im Prinzip sicherste und demzufolge beste Lösung verwendet die API-Funktion GetVersionEx. Diese liefert die genausten Informationen. Wenn man nur den Typ des Betriebssystems wissen möchte, genügt die Auswertung des Inhaltes der Variable dwPlatformId (vergl. Programmcode). Enthält diese den Wert 1, handelt es sich um ein Windows vom Typ "Windows 95". Bei 2 handelt es sich um ein Windows vom Typ "Windows NT".

.VBA-Code #1
Sub GetWindowsVersion1()
  MsgBox "Windows-Version: " & Application.OperatingSystem
End Sub

.VBA-Code #2
Sub GetWindowsVersion2()
  MsgBox "Windows-Version: " & Environ("OS")
End Sub

.VBA-Code #3
'Deklarationsbereich
Type OSVERSIONINFO
  dwOSVersionInfoSize As Long
  dwMajorVersion As Long
  dwMinorVersion As Long
  dwBuildNumber As Long
  dwPlatformId As Long
  szCSDVersion As String * 128
End Type
Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _

   (ByRef lpVersionInformation As OSVERSIONINFO) As Long

'Codemodul
Sub GetWindowsVersion3()
  Dim myOS As OSVERSIONINFO
  Dim lngResult As Long
  Dim strVersion As String
  myOS.dwOSVersionInfoSize = Len(myOS)
  lngResult = GetVersionEx(myOS)
  strVersion = myOS.dwMajorVersion & "." & myOS.dwMinorVersion & "." & myOS.dwBuildNumber
  If myOS.dwPlatformId = 0 Then
    MsgBox "Windows " & strVersion
  ElseIf myOS.dwPlatformId = 1 Then
    MsgBox "Windows 95 " & strVersion
  ElseIf myOS.dwPlatformId = 2 Then
    MsgBox "Windows NT " & strVersion
  Else
    MsgBox "Windows " & strVersion
  End If

End Sub

Verwandte Codebeispiele

Windows-Buildnummer ermitteln

Betriebssystem abfragen

Excel-Version ermitteln

Version der installierten Microsoft Excel-Anwendung ermitteln

Versionsnummer einer ausführbaren Datei abfragen

VBA-Editor-Version ermitteln

To Top


Windows-Buildnummer ermitteln

.Beschreibung
Dieses Codebeispiel ermittelt die Buildnummer der eingesetzten Windowsversion. Bei zum Beispiel Windows NT 4 mit Service Pack 5 lautet sie 1381.

.VBA-Code
'Deklarationsbereich
Type OSVERSIONINFO
  dwOSVersionInfoSize As Long
  dwMajorVersion As Long
  dwMinorVersion As Long
  dwBuildNumber As Long
  dwPlatformId As Long
  szCSDVersion As String * 128
End Type
Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _

   (ByRef lpVersionInformation As OSVERSIONINFO) As Long

'Codemodul
Sub GetWindowsBuild()
  Dim myOS As OSVERSIONINFO
  Dim lngResult As Long
  myOS.dwOSVersionInfoSize = Len(myOS)
  lngResult = GetVersionEx(myOS)
  MsgBox "Windows-Buildnummer: " & myOS.dwBuildNumber
End Sub

Verwandte Codebeispiele

Windows-Version ermitteln

Excel-Buildnummer abfragen

Versionsnummer einer ausführbaren Datei abfragen

To Top


Windows-Verzeichnis ermitteln

.Beschreibung
Das Windows-Verzeichnis wird am einfachsten mit der Environ-Funktion von VBA abgefragt. Je nach verwendeter Windows-Version und installierter Software kann es sein, dass die Umgebungsvariable "systemroot" nicht funktioniert. Die Variable "windir" dagegen ist laut Microsoft auf jedem Windows-Rechner vorhanden sein.

.VBA-Code #1
'Deklarationsbereich
Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" _
   (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Const gintMAX_SIZE% = 255

'Codemodul
Function GetWindowsFolder1() As String
  Dim strBuffer As String
  Dim intZeroPos As Integer
  strBuffer = Space$(gintMAX_SIZE)
  If GetWindowsDirectory(strBuffer, gintMAX_SIZE) > 0 Then
    intZeroPos = InStr(strBuffer, Chr$(0))
    If intZeroPos > 0 Then
      GetWindowsFolder1 = Left$(strBuffer, intZeroPos - 1)
    Else
      GetWindowsFolder1 = strBuffer
    End If
  Else
    GetWindowsFolder1 = ""
  End If
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox "Windows-Verzeichnis: " & GetWindowsFolder1()

End Sub

.VBA-Code #2
Sub GetWindowsFolder2()
  MsgBox "Windows-Verzeichnis: " & Environ("windir")

End Sub

.VBA-Code #3
Sub GetWindowsFolder3()
  MsgBox "Windows-Verzeichnis: " & Environ("systemroot")

End Sub

Verwandte Codebeispiele

Windows-Systemverzeichnis ermitteln

Temp-Verzeichnis von Windows ermitteln

Windows-Laufwerk ermitteln

Windows-Version ermitteln

 

Weitere Informationen

VBA-Befehle und -Funktionen

To Top


Windows-Systemverzeichnis ermitteln

.Beschreibung
Im Gegensatz zum Windows-Verzeichnis kann das System-Verzeichnis von Windows nicht anhand einer Umgebungsvariable abgefragt werden, da zu diesem Zweck schlicht keine existiert. Man kann zwar das Windows-Verzeichnis ermitteln und dann prüfen, ob ein Unterverzeichnis namens "system32" existiert. Der Ordner "system32" muss jedoch nicht zwingend vorhanden sein, da dieser bei teils Windows-Versionen mit "system" benannt ist. Die sicherste und zudem kürzeste Variante stellt auf jeden Fall die Benutzung des FileSystemObject-Objektes dar, wie es im Codebeispiel 2 gezeigt wird.

.VBA-Code #1
'Deklarationsbereich
Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" _
   (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Const gintMAX_SIZE% = 255

'Codemodul
Function GetWindowsSystemFolder1() As String
  Dim strBuffer As String
  Dim intZeroPos As Integer
  strBuffer = Space$(gintMAX_SIZE)
  If GetSystemDirectory(strBuffer, gintMAX_SIZE) > 0 Then
    intZeroPos = InStr(strBuffer, Chr$(0))
    If intZeroPos > 0 Then
      GetWindowsSystemFolder1 = Left$(strBuffer, intZeroPos - 1)
    Else
      GetWindowsSystemFolder1 = strBuffer
    End If
  Else
    GetWindowsSystemFolder1 = ""
  End If
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox "Windows-Systemverzeichnis: " & GetWindowsSystemFolder1()

End Sub

.VBA-Code #2
Sub GetWindowsSystemFolder2()
  If Dir(Environ("windir") & "\system32", vbDirectory) <> "" Then
    MsgBox "Windows-Systemverzeichnis: " & Environ("windir") & "\" & _

      Dir(Environ("windir") & "\system32", vbDirectory)
  ElseIf Dir(Environ("windir") & "\system", vbDirectory) <> "" Then
    MsgBox "Windows-Systemverzeichnis: " & Environ("windir") & "\" & _

      Dir(Environ("windir") & "\system", vbDirectory)
  Else
    MsgBox "Das Windows-Systemverzeichnis konnte nicht ermittelt werden."
  End If

End Sub

.VBA-Code #3
Sub GetWindowsSystemFolder3()
  MsgBox "Windows-Systemverzeichnis: " & CreateObject("Scripting.FileSystemObject").GetSpecialFolder(1)

End Sub

Verwandte Codebeispiele

Windows-Verzeichnis ermitteln

Temp-Verzeichnis von Windows ermitteln

Windows-Laufwerk ermitteln

Windows-Version ermitteln

 

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

VBA-Befehle und -Funktionen

To Top


Windows-Laufwerk ermitteln

.Beschreibung
Das Windows-Laufwerk kann mit der VBA-Funktion Environ ermittelt werden, indem die Umgebungsvariable "systemdrive" abgefragt wird. Da je nach Windows-Version und installierter Software diese Variable nicht zwingend vorhanden ist, kann man auch das Windows-Verzeichnis anhand der Variable "windir" ermitteln ("windir" ist bei allen Windows-Versionen vorhanden) und die beiden ersten Zeichen des zurückgegebenen Pfades als Laufwerkbuchstaben inklusive Doppelpunkt (':') verwenden.

.VBA-Code #1
Sub GetWindowsDrive1()
  MsgBox Environ("systemdrive")

End Sub

.VBA-Code #2
Sub GetWindowsDrive2()
  MsgBox Left$(Environ("windir"), 2)

End Sub

Verwandte Codebeispiele

Windows-Systemverzeichnis ermitteln

Windows-Verzeichnis ermitteln

Temp-Verzeichnis von Windows ermitteln

Windows-Version ermitteln

 

Weitere Informationen

VBA-Befehle und -Funktionen

To Top


Temp-Verzeichnis von Windows ermitteln

.Beschreibung
Die nachfolgenden Codebeispiele zeigen, wie das Temp-Verzeichnis von Windows auf ganz unterschiedliche Wege herausgefunden werden kann.

» Das ersten Codebeispiel verwendet die Windows API-Funktion GetTempPath und ist verglichen mit den anderen Codebeispielen (insbesondere #2) eher kompliziert und aufwändig. Dafür wird das Temp-Verzeichnis zuverlässig ermittelt, und ausserdem wird keine zusätzliche Objektbibliothek benötigt.

» Das zweite Beispiel zeigt die einfachste und kürzeste Lösungsvariante und ist somit zu bevorzugen.

» Das Codebeispiel #3 benutzt das FileSystemObject-Objekt und dessen GetSpecialFolder-Methode.

» Auch das Codebeispiel #4 verwendet die GetSpecialFolder-Methode, jedoch ohne Objektvariable. Wenn Sie die FileSystemObject-Instanz innerhalb der Prozedur nicht noch für andere Zwecke benötigen, so können Sie diese kurze Variante ohne die Objektvariable benutzen.

» Im Beispiel #5 wird das Shell-Objekt aus der Windows Script Host-Objektbibliothek verwendet. Beachten Sie, dass die Variable strEnv als Datentyp Variant zu deklarieren ist.

» Das Codebeispiel #6 stellt eine vereinfachte Variante von Codebeispiel #5 dar.

.VBA-Code #1
'Deklarationsbereich
Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal _
   nBufferLength As Long, ByVal lpBuffer As String) As Long

'Codemodul
Function GetTempFolder1() As String
  Dim lngPathLength As Long
  Dim strTempDir As String
  Dim lngBufferLength As Long
  lngBufferLength = 260
  strTempDir = Space(lngBufferLength)
  lngPathLength = GetTempPath(lngBufferLength, strTempDir)
  If Not lngPathLength = 0 Then
    GetTempDir = Left(strTempDir, lngPathLength)
  Else
    GetTempDir = CurDir()
  End If
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox GetTempFolder1
End Sub

.VBA-Code #2
Sub GetTempFolder2()
  MsgBox Environ("temp")

End Sub

.VBA-Code #3
Sub GetTempFolder3()
  Dim fsoObject As Object
  Set fsoObject = CreateObject("Scripting.FileSystemObject")
  MsgBox fsoObject.GetSpecialFolder(2)    '2 = TemporaryFolder
  Set fsoObject = Nothing
End Sub

.VBA-Code #4
Sub GetTempFolder4()
  MsgBox CreateObject("Scripting.FileSystemObject").GetSpecialFolder(2)    '2 = TemporaryFolder
End Sub

.VBA-Code #5
Sub GetTempFolder5()
  Dim wshShell As Object
  Dim strEnv As Variant
  Set wshShell = CreateObject("WScript.Shell")
  For Each strEnv In wshShell.Environment("PROCESS")
    If UCase(Left$(strEnv, 5)) = "TEMP=" Then
      MsgBox Mid$(strEnv, 6)
    End If
  Next
  Set wshShell = Nothing
End Sub

.VBA-Code #6
Sub GetTempFolder6()
  MsgBox CreateObject("WScript.Shell").Environment("PROCESS")("temp")
End Sub

Verwandte Codebeispiele

Zufälliger Name für eine temporäre Datei generieren

Temporäre Datei im Temp-Verzeichnis von Windows erstellen

Temporäre Datei mit einem eindeutigen Namen in einem Ordner erstellen

Fortlaufend nummerierte Mappenkopien im Temp-Verzeichnis von Windows anlegen

Windows-Verzeichnis ermitteln

Windows-Systemverzeichnis ermitteln

Windows-Laufwerk ermitteln

 

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

VBA-Spezialthema: Windows Script Host (WSH)

VBA-Befehle und -Funktionen

To Top


Hyperlink-Basis-Verzeichnis einer Arbeitsmappe ermitteln

.Beschreibung
Mit der so genannten Hyperlink-Basis kann man ein Verzeichnis festlegen, welches als Basis für alle relativen Pfade von Hyperlinks der Arbeitsmappe verwendet wird. In Microsoft Excel wird die Hyperlink-Basis im Eigenschaften-Dialogfenster der Arbeitsmappe (Menü Datei/Eigenschaften) eingegeben bzw. abgefragt. Diese Einstellung gilt pro Arbeitsmappe.

Bitte beachten Sie, dass die Hyperlink-Basis nicht unbedingt einen gültigen Pfad enthalten muss. Sie kann sogar etwas ganz anderes als einen Pfad enthalten, sprich einen beliebigen Begriff oder Text.

.VBA-Code
Sub GetHyperlinkBase()
  MsgBox ActiveWorkbook.BuiltInDocumentProperties("Hyperlink base").Value

End Sub

.Hinweis
Anstelle des Bezeichners "Hyperlink base" können bei BuiltInDocumentProperties auch die Zahl 29 angeben.

Verwandte Codebeispiele

Hyperlink-Basis-Verzeichnis einer Arbeitsmappe ändern

Prüfen, ob das Hyperlink-Basis-Verzeichnis einer Arbeitsmappe existiert

 

Weitere Informationen

Hyperlinks

VBA-Befehle und -Funktionen

To Top


Prüfen, ob das Hyperlink-Basis-Verzeichnis einer Arbeitsmappe existiert

.Beschreibung
Die Hyperlink-Basis enthält gewöhnlich entweder nichts oder dann ein Verzeichnis. Weil die Hyperlink-Basis jedoch über ein gewöhnliches Textfeld eingegeben und ungeprüft als Zeichenfolge abgelegt wird, kann Sie auch einen nicht existierenden Pfad oder sogar etwas vollig anderes enthalten, wie zum Beispiel irgend ein Wort, welches gar kein Pfad darstellt. Es ist daher absolut notwendig, den Inhalt der Hyperlink-Basis zu prüfen.

Übrigens darf die Hyperlink-Basis auch eine Internet-Adresse enthalten, d.h. die URL einer Webseite. Hierbei ist zu beachten, dass man die Adresse immer mit vorangestelltem "http://" angibt, also zum Beispiel "http://www.xlam.info". Anderenfalls erkennt Excel die Adresse nicht als gültige Internet-URL.

.VBA-Code
Sub CheckHyperlinkBase()

End Sub

.Hinweis
Anstelle des Bezeichners "Hyperlink base" können bei BuiltInDocumentProperties auch die Zahl 29 angeben.

Verwandte Codebeispiele

Hyperlink-Basis-Verzeichnis einer Arbeitsmappe ermitteln
Hyperlink-Basis-Verzeichnis einer Arbeitsmappe ändern

 

Weitere Informationen

Hyperlinks

VBA-Befehle und -Funktionen

To Top


Excel-Version ermitteln

.Beschreibung
In diesem Beispiel wird die Version der aktuell verwendeten Microsoft Excel-Sitzung abgefragt.

8.x für Excel 97, 9.x für Excel 2000, 10.x für Excel 2002/XP, 11.x für Excel 2003.

Die Version wird nicht als Zahl sondern Zeichenfolge zurückgegeben (z.B. "8.0a" bei Microsoft Excel mit original Service Pack 1).

Die Angabe sollte mit der Versionsinformation der Programmdatei Excel.exe übereinstimmen.

.VBA-Code #1
Sub GetExcelVersion1()
  MsgBox Application.Version

End Sub

.VBA-Code #2
Sub GetExcelVersion2()
  MsgBox Int(Val(Application.Version))

End Sub

Verwandte Codebeispiele

Excel-Buildnummer abfragen

VBA-Editor-Version ermitteln

Version der installierten Microsoft Excel-Anwendung ermitteln

Windows-Version ermitteln

To Top


VBA-Editor-Version ermitteln

.Beschreibung
Mit diesem Programmcode wird die Versionsnummer des VBA-Editors der aktuellen Sitzung des Microsoft Office-Programmes abgefragt.

Funktioniert in allen Microsoft Office-Programmen (Excel, Word, PowerPoint etc.)

Gibt bei Microsoft Office 97 die Versionsnummer 5.00 zurück.

.VBA-Code
Sub GetVBEVersion()
  MsgBox Application.VBE.Version

End Sub

Verwandte Codebeispiele

Excel-Version ermitteln

Excel-Buildnummer abfragen

Version der installierten Microsoft Excel-Anwendung ermitteln

Windows-Version ermitteln

To Top


CD-ROM Laufwerk öffnen und schliessen

.Beschreibung
Anhand der API-Funktion mciExecute aus der Windows Multimedia-DLL "winmm.dll" kann ein CD-ROM Laufwerk äusserst einfach geöffnet und geschlossen werden.

"Notwendiger Parameter fehlt"

"Unbekannter Befehlsparameter"

"Unbekannter Befehl"

Wenn beim Öffnen die Schublade bereits geöffnet bzw. beim Schliessen das CD-ROM Laufwerk bereits geschlossen ist, tritt kein Fehler auf.

Bitte beachten Sie, dass das jeweilige Kommando ("set cdaudio door [...]") ganz exakt angegeben werden muss. Bei einem Schreibfehler wird eine Fehlermeldung angezeigt. Die Gross-/Kleinschreibung spielt dagegen keine Rolle.

» Codebeispiel #1: Dieses Beispiel öffnet die Schublade des CD-ROM Laufwerkes.

» Codebeispiel #2: Dieses Beispiel schliesst die Schublade des CD-ROM Laufwerkes.

.Autor
Hans W. Herber, www.herber.de

.VBA-Code #1
'Deklarationsbereich
Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long

'Codemodul
Sub OpenCDDrive()
  mciExecute "set cdaudio door open"
End Sub

.VBA-Code #2
'Deklarationsbereich
Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long

'Codemodul
Sub CloseCDDrive()
  mciExecute "set cdaudio door closed"
End Sub

.Hinweis
Das Öffnen bzw. Schliessen des CD-ROM Laufwerkes funktioniert mit obigem VBA-Code tadellos. Nicht bekannt ist allerdings, welches Laufwerk angesprochen wird, falls mehrere CD-ROM Laufwerke vorhanden sind. Der Programmcode wurde auf einem Computer mit einem einzigen CD-ROM Laufwerk getestet. Es ist jedoch anzunehmen, dass dasjenige Laufwerk benutzt wird, welches als Musik-CD-Laufwerk in der Windows Systemsteuerung unter Multimedia-Eigenschaften festgelegt ist.

Verwandte Codebeispiele

Prüfen, ob ein Laufwerk ein CD-ROM Laufwerk ist

Typ eines Laufwerkes abfragen

Erstes CD-ROM Laufwerk ermitteln

To Top


Erstes CD-ROM Laufwerk ermitteln

.Beschreibung
Mit dem nachstehenden Programmcode können Sie herausfinden, wie der Laufwerkbuchstabe des ersten CD-ROM Laufwerkes des Computers lautet.

.Autor
Hans W. Herber, www.herber.de

.VBA-Code
'Deklarationsbereich
Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" _
  (ByVal nDrive As String) As Long
Declare Function GetLogicalDriveStrings Lib "kernel32" Alias "GetLogicalDriveStringsA" _

  (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Const DRIVE_CDROM As Long = 5

'Codemodul
Function GetFirstCdRomDriveLetter() As String
  Dim lDriveType As Long
  Dim strDrive As String
  Dim lStart As Long: lStart = 1
  Dim strDrives As String
  strDrives = Space(150)
  Dim lRetVal As Long
  lRetVal = GetLogicalDriveStrings(150, strDrives)
  If lRetVal = 0 Then
    GetFirstCdRomDriveLetter = vbNullString
    Exit Function
  End If
  strDrive = Mid(strDrives, lStart, 3)
  Do
    lDriveType = GetDriveType(strDrive)
    If lDriveType = DRIVE_CDROM Then
      GetFirstCdRomDriveLetter = strDrive
      Exit Function
    End If
    lStart = lStart + 4
    strDrive = Mid(strDrives, lStart, 3)
  Loop While (Mid(strDrives, lStart, 1) <> vbNullChar)
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox GetFirstCdRomDriveLetter()
End Sub

Verwandte Codebeispiele

Prüfen, ob ein Laufwerk ein CD-ROM Laufwerk ist

Typ eines Laufwerkes abfragen

CD-ROM Laufwerk öffnen und schliessen

To Top


Ordner mit Schreibschutz versehen

.Beschreibung
Dieses Codebeispiel zeigt, wie das Schreibgeschützt-Attribut eines Ordners aktiviert wird. Vor der Aktivierung wird geprüft, ob der Ordner existiert und ob das Schreibgeschützt-Attribut allenfalls bereits gesetzt ist.

.VBA-Code
Sub SetFolderReadOnlyAttribute()
  If Dir("C:\Daten", vbDirectory) <> "" Then
    If GetAttr("C:\Daten") Mod 2 = 0 Then
      SetAttr "C:\Daten", vbReadOnly
    End If
  End If
End Sub

Verwandte Codebeispiele

Prüfen, ob ein Ordner schreibgeschützt ist

To Top


Arbeitsmappe öffnen und geschütztes VBA-Projekt entsperren

.Beschreibung
Wenn ein mit Kennwort geschütztes VBA-Projekt automatisch unmittelbar nach dem Öffnen der Arbeitsmappe entsperrt werden soll, so gibt es nur einen einzigen, nicht ganz einfachen Weg: Da im Excel- bzw. Excel-VBA-Objektmodell keine Methode oder Eigenschaft zum Entsperren von VBA-Projekten existiert, muss der VBA-Editor mittels SendKeys ferngesteuert und das Projektschutzkennwort eingegeben werden.

.VBA-Code
Private Sub Workbook_Open()
  Dim bolBerechtigt As Boolean
  'bolBerechtigt = [True|False]
  If bolBerechtigt = True then
    If Application.VBE.ActiveVBProject.Protection = 1 Then
      Application.VBE.MainWindow.SetFocus
      SendKeys "passwort{enter}+{tab}{right}%a{enter}%q"
      Application.VBE.CommandBars.FindControl(Id:=2578).Execute
    End If
  End If
End Sub

.Hinweis
Erläuterungen zum Programmcode:
- Mit der Variable bolBerechtigt wird gesteuert, ob ein Benutzer zur Schutz-Deaktivierung berechtigt ist oder nicht.
- Mit der Abfrage "If [...].Protection = 1" wird verhindert, dass ein nicht gesperrtes Projekt zu entsperren versucht wird.
- Für die Zeichenfolge "passwort" wird das Projekt-Kennwort eingesetzt.

- Die Id 2578 bei FindControl steht für den Menübefehl "<Projekt>-Eigenschaften" (Menü "Extras" des VBA-Editors).

Der umgekehrte Weg, d.h. ein nicht gesperrtes Projekt beim Öffnen der Arbeitsmappe zu schützen, ist nicht realisierbar. Die Aktivierung beim Öffnen ist aus folgenden Gründen nicht möglich:
- Der Schutz wird erst angewendet, nachdem die Mappe gespeichert, geschlossen und neu geöffnet wurde. Die Aktivierung des Kennwortschutzes ist somit ohne Wirkung, solange die Mappe nicht erneut geöffnet wird.
- Die Aktivierung des Schutzes im Workbook_Open-Ereignis oder im Auto_Open-Makro ist unsicher, da beide Prozeduren durch Drücken der Umschalt-Taste übergangen werden können, d.h. der Schutz würde gar nicht angewendet.
- Das Objektmodell des VBA-Editors besitzt keine Methoden oder Eigenschaften für Aktivieren/Deaktivieren des Schutzes oder Kennwort setzen. Lediglich der Status des Schutzes kann abgefragt werden. Einzige Möglichkeit ist das Senden von Tastenfolgen mit SendKeys.

Wie oben gezeigt, ist es möglich, dass ein Projekt geschützt und der dadurch bereits aktivierte Schutz beim Öffnen deaktiviert wird. Der Vorteil: Wird beim Öffnen die Umschalt-Taste gedrückt, so bleibt der Kennwortschutz aktiviert. Das Übergehen des VBA-Codes im Workbook_Open-Ereignis mittels Umschalt-Taste führt somit nicht zur Offenlegung des Programmcodes. Unschön an dieser Lösung ist, dass das Projektkennwort im VBA-Code offen vorliegen muss, da es zum Entsperren benötigt wird. Dieses offen sichtbare Passwort beeinträchtigt jedoch nicht gross die Sicherheit, da es im VBA-Programm steht; und dieser ist ja geschützt.

To Top


Dateiinhalt einlesen und in Variable ablegen

.Beschreibung
Das nachfolgende Codebeispiel zeigt, wie man eine Datei öffnet und den gesamten Dateiinhalt in eine Variable einfüllt.

.VBA-Code
Sub ReadFileContents()
  Dim strFileContents As String
  Open "C:\Daten\EineDatei.txt" For Binary Access Read As #1
    strFileContents = Input(LOF(1), #1)
  Close #1
  MsgBox strFileContents
End Sub

Verwandte Codebeispiele

Die ersten x Bytes eines Dateiinhaltes einlesen

Textdatei öffnen und sequentiell lesen

To Top


Die ersten x Bytes eines Dateiinhaltes einlesen

.Beschreibung
Hier wird gezeigt, wie man eine beliebige Anzahl Bytes einer Datei einlesen kann. Das Dateiformat der Datei spielt hierbei keine Rolle.

» Im Beispiel #1 werden die ersten 5 Bytes eingelesen und in der Variable strFileContents abgelegt.

» Das zweite Codebeispiel zeigt die kurze Variante ohne Benutzung einer Variable. Hier werden als Beispiel die ersten 8 Bytes eingelesen und direkt mit MsgBox ausgegeben.

Bitte beachten Sie, dass der Meldungsdialog unter Umständen nicht den gesamten Inhalt der Variable bzw. der Datei anzeigt.

.VBA-Code #1
Sub ReadFileContents1()
  Dim strFileContents As String
  Open "C:\Daten\EineDatei.txt" For Binary Access Read As #1
    strFileContents = Input(5, #1)
  Close #1
  MsgBox strFileContents
End Sub

.VBA-Code #2
Sub ReadFileContents2()
  Open "C:\Daten\EineMappe.xls" For Binary Access Read As #1
    MsgBox Input(8, #1)
  Close #1
End Sub

.Hinweis
Die meisten Dateitypen von Microsoft Excel (also Dateien mit den Dateinamenerweiterungen xls, xlt, xla oder xlk) benutzen ein spezielles Format, welches quasi innerhalb des OLE Structured Storage File-Formates verwendet wird. Dieses Format wird 'BIFF' genannt. Die Abkürzung BIFF steht für 'Binary Interchange File Format'.

Verwandte Codebeispiele

Dateiinhalt einlesen und in Variable ablegen

Textdatei öffnen und sequentiell lesen

To Top


Prüfen, ob eine Datei das OLE Structured Storage Format besitzt

.Beschreibung
Microsoft Excel-Arbeitsmappendateien und andere Microsoft Office-Dokumentdateien (u.a. Word-Dokumente und PowerPoint-Präsentationen), sowie auch bestimmte Windows-Dateien (u.a. Microsoft Management Console und Microsoft Installer Package) verwenden das so genannte OLE Structured Storage File Format.

Mit dem hier vorgestellten VBA-Programmcode können Sie feststellen, ob eine Datei das OLE Structured Storage Format besitzt. Dadurch können Sie beispielsweise bereits vor dem Öffnen überprüfen, ob die Datei ein potenziell lesbares Format verwendet. Schlägt die Prüfung fehl, so ist die Datei mit absoluter Sicherheit weder eine Arbeitsmappe (xls), eine Vorlage (xlt), ein Add-In (xla) noch eine Sicherungskopie einer Arbeitsmappe (xlk). Wenn die ersten sechs Bytes einer Datei die Hex-Werte D0, CF, 11, E0, A1 und B1 besitzen, so liegt eindeutig das OLE Structured Storage Dateiformat vor.

Hier die ersten sechs Bytes einer OLE Structured Storage-Datei:

Byte Hex Value Dec Value Character
1 D0 208 Ð
2 CF 207 Ï
3 11 17 
4 E0 224 à
5 A1 161 ¡
6 B1 177 ±

Mit VBA könnte man nun diese ersten sechs Bytes des Dateiinhaltes einlesen und dann jedes einzelne Byte auf seinen Hex-Wert prüfen. Einiges einfacher geht es, wenn die sechs Bytes in einem Arbeitsschritt Text eingelesen und mit einer Zeichenfolge, welche sechs Zeichen enthält, die die erwähnten Hex-Werte darstellen, verglichen werden.

» Die beiden Codebeispiele #1 und #2 verwenden das oben beschriebene Verfahren mit dem Überprüfen der ersten sechs Bytes des Dateiinhalts.

» Das Codebeispiel #3 verwendet einen komplett anderen Ansatz. Hier wird anhand der GetDocumentProperties-Methode aus der OLE Document Properties Object Library (DSOFile.dll) auf die Datei zugegriffen und dabei kontrolliert, ob ein Fehler auftritt.

.VBA-Code #1
Sub CheckOLEStructuredStorageFileFormat1()
  Dim strFileContents As String
  Open "C:\Daten\EineDatei.xls" For Binary Access Read As #1
    strFileContents = Input(6, #1)
  Close #1
  If strFileContents = "ÐÏࡱ" Then
    MsgBox "Die Datei besitzt das OLE Structured Storage Format."
  End If
End Sub

.VBA-Code #2
Sub CheckOLEStructuredStorageFileFormat2()
  Open "C:\Daten\EineDatei.xls" For Binary Access Read As #1
    If Input(6, #1) = "ÐÏࡱ" Then
      MsgBox "Die Datei besitzt das OLE Structured Storage Format."
    End If
  Close #1

End Sub

.VBA-Code #3
Sub CheckOLEStructuredStorageFileFormat3()
  Dim objDSOReader As Object
  Dim objDSODocument As Object
  Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
  On Error Resume Next
  Set objDSODocument = objDSOReader.GetDocumentProperties("C:\Daten\EineDatei.xls")
  If Err.Number = 0 Then
    MsgBox "Die Datei besitzt das OLE Structured Storage Format."
  ElseIf Err.Number = 432 Then
    MsgBox "Die Datei ist nicht vorhanden."
  ElseIf Err.Number = 2 Then
    MsgBox "Die Datei besitzt nicht das OLE Structured Storage Format."
  ElseIf Err.Number = 3 Then
    MsgBox "Die Datei wird gerade bearbeitet."
  Else
    MsgBox "Es ist ein Fehler aufgetreten."
  End If
  Set objDSODocument = Nothing
  Set objDSOReader = Nothing
End Sub

.Hinweis
Die meisten Dateitypen von Microsoft Excel (also Dateien mit den Dateinamenerweiterungen xls, xlt, xla oder xlk) benutzen ein spezielles Format, welches quasi innerhalb des OLE Structured Storage File-Formates verwendet wird. Dieses Format wird 'BIFF' genannt. Die Abkürzung BIFF steht für 'Binary Interchange File Format'.

Verwandte Codebeispiele

Prüfen, ob eine Datei das BIFF-Format besitzt

Prüfen, ob eine geschlossene Arbeitsmappe ein duales Dateiformat verwendet

Dateiinhalt einlesen und in Variable ablegen

Die ersten x Bytes eines Dateiinhaltes einlesen

 

Weitere Informationen

Excel-Dateiformat BIFF

VBA-Spezialthema: OLE Document Properties (DSOFile)

To Top


Prüfen, ob eine Arbeitsmappe noch nicht gespeicherte Änderungen enthält

.Beschreibung
Die Saved-Eigenschaft des Workbook-Objektes gibt Auskunft darüber, ob die Arbeitsmappe Änderungen enthält, welche noch nicht gespeichert wurden. Bei jedem Speichern-Vorgang, egal ob über "Speichern" oder "Speichern unter" ausgelöst, wird die Saved-Eigenschaft automatisch auf True gesetzt.

.VBA-Code
Sub CheckUnsavedChanges()
  If ActiveWorkbook.Saved = False Then
    MsgBox "Die Arbeitsmappe enthält noch nicht gespeicherte Änderungen."
  End If
End Sub

.Hinweis
Bitte beachten Sie, dass beim Speichern mittels der SaveCopyAs-Methode die Saved-Eigenschaft nicht auf True gesetzt wird!

Verwandte Codebeispiele

Prüfen, ob eine Arbeitsmappe bereits einmal gespeichert wurde

Prüfen, ob ein VBA-Projekt noch nicht gespeicherte Änderungen besitzt

 

Weitere Informationen

Excel-Objektmodell: Eigenschaften des Workbook-Objektes

To Top


Prüfen, ob eine Arbeitsmappe bereits einmal gespeichert wurde

.Beschreibung
Durch Vergleichen der FullName- mit der Name-Eigenschaft von Workbook kann man herausfinden, ob eine Arbeitsmappe schon einmal gespeichert wurde. Wenn die beiden Eigenschaften den gleichen Inhalt besitzen, dann wurde die Mappe noch nie als Datei gespeichert. Im nachstehenden Beispiel wird die aktive Arbeitsmappe verwendet.

.VBA-Code
Sub CheckFirstSave()
  If ActiveWorkbook.FullName = ActiveWorkbook.Name Then
    MsgBox "Die Arbeitsmappe wurde noch nie gespeichert."
  End If
End Sub

Verwandte Codebeispiele

Prüfen, ob eine Arbeitsmappe noch nicht gespeicherte Änderungen enthält

Prüfen, ob eine Arbeitsmappe gerade gespeichert wird

 

Weitere Informationen

Excel-Objektmodell: Eigenschaften des Workbook-Objektes

To Top


Aktuell verwendeter Drucker abfragen

.Beschreibung
Den aktuell von Microsoft Excel verwendeten Drucker erhält man durch Abfragen der ActivePrinter-Eigenschaft des Application-Objektes. Die Eigenschaft enthält Name und Port des aktiven Druckers.

Gibt Druckername und Port (nicht Anschlussname!) aus. Bei Microsoft PowerPoint nur Druckername ohne Port.

Bei Microsoft Excel und Microsoft Word gilt der aktive Drucker grundsätzlich für alle geöffneten Arbeitsmappen bzw. Dokumente.

» Codebeispiel #1: Microsoft Excel, Microsoft Word und Microsoft PowerPoint.

» Codebeispiel #2: Microsoft PowerPoint.

.VBA-Code #1
Sub GetActivePrinter()
  MsgBox "Aktueller Drucker: " & Application.ActivePrinter
End Sub

.VBA-Code #2
Sub GetActivePrinterPresentation()
  MsgBox "Aktueller Drucker: " & ActivePresentation.PrintOptions.ActivePrinter
End Sub

Verwandte Codebeispiele

Aktuell verwendeter Drucker wechseln

Eingerichtete Drucker mit Druckerport auflisten

Eingerichtete Drucker mit zusätzlichen Informationen auflisten

Interner Name des Druckerports eines Druckers ermitteln

 

Weitere Informationen

Excel-Objektmodell: Eigenschaften des Application-Objektes

To Top


Aktuell verwendeter Drucker wechseln

.Beschreibung
Beschreibung folgt.

Es muss Druckername und Portname (nicht Anschlussname!) angegeben werden. Der tatsächliche (interne) Name des Ports muss allenfalls zuerst ermittelt werden.

Der Laufzeitfehler 1004 "Anwendungs- oder objektdefinierter Fehler" tritt auf, wenn der angegebene Drucker nicht existiert, und/oder der Port ungültig ist und/oder die verwendete Syntax falsch ist (<Druckername> auf <Port>).

Bei Microsoft PowerPoint wird nur der Druckername angegeben.

Laufzeitfehler -2147467259 in Microsoft PowerPoint, wenn der Drucker nicht existiert oder nicht verfügbar ist.

Das Setzen von Application.ActivePrinter funktioniert in PowerPoint nicht. Dort muss ActivePresentation.PrintOptions.ActivePrinter verwendet werden.

Bei Wechseln des Windows Standard-Druckers ändert sich der aktuelle Drucker automatisch (alle Office-Programme).

Wenn ein VBA-Programm nur vorübergehend einen anderen Drucker braucht, sollte am Schluss des VBA-Programmes der ursprünglich verwendete Drucker wiederhergestellt werden.

.VBA-Code #1
Sub SetActivePrinter1()
  Application.ActivePrinter = "HP LaserJet 4M Plus auf LPT1:"
End Sub

.VBA-Code #2
Sub SetActivePrinter2()
  Dim strPrinter As String

  strPrinter = Application.ActivePrinter
  Application.ActivePrinter = "HP LaserJet 4M Plus auf LPT1:"
  Application.ActivePrinter = strPrinter
End Sub

Verwandte Codebeispiele

Aktuell verwendeter Drucker abfragen

Eingerichtete Drucker mit Druckerport auflisten

Eingerichtete Drucker mit zusätzlichen Informationen auflisten

Interner Name des Druckerports eines Druckers ermitteln

 

Weitere Informationen

Excel-Objektmodell: Eigenschaften des Application-Objektes

To Top


Interner Name des Druckerports eines Druckers ermitteln

.Beschreibung
Dieses Codebeispiel ermittelt den internen Portnamen eines Anschlusses. Dieser wird unter anderem zum Festlegen des aktiven Druckers in Microsoft Excel benötigt.

Wenn Sie beispielsweise eine Exceltabelle als PDF-Datei drucken wollen (mit dem Acrobat Distiller), wird im Drucken-Dialogfenster nach dem Auswählen des Druckers "Acrobat Distiller" unter "Ort" nicht der Druckerport sondern der Dateipfad der Zieldatei (*.pdf) angezeigt. Wenn Sie nun mit VBA-Code den aktiven Drucker auf den Acrobat Distiller ändern möchten, so müssen Sie wie üblich Drucker und Port mit der Syntax "<Druckername> auf <Port>" angeben. Im Falle des Acrobat Distillers funktioniert das nicht, weil der Port nicht der oben erwähnte Zieldateipfad ist. Der zu verwendende Port besitzt nämlich einen anderen Namen, den so genannten internen Portnamen. Beim Acrobat Distiller lautet dieser "Ne00:", sofern der erste lokale Port benutzt wird. Der zweite lokale Port heisst "Ne01:", der dritte "Ne02:" und so weiter.

Im Beispiel wird der Drucker "HP LaserJet 4M Plus" verwendet (abgelegt als Konstante strPrinter).

.VBA-Code
Sub GetPrinterPortName()
  Const strPrinter As String = "HP LaserJet 4M Plus"
  Dim strSetting As String
  Dim strPort As String
  Dim intChar As Integer
  On Error Resume Next
  strSetting = CreateObject("WScript.Shell").RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices\" & strPrinter)
  If Err.Number = -2147024894 Then
    MsgBox "Es existiert kein Drucker '" & strPrinter & "'.", vbInformation
    Exit Sub
  End If
  For intChar = Len(strSetting) To 1 Step -1
    If Mid$(strSetting, intChar, 1) = "," Then
      strPort = Mid$(strSetting, intChar + 1)
      Exit For
    End If
  Next intChar
  If strPort = "" Then
    MsgBox "Drucker '" & strPrinter & "'" & vbCrLf & vbCrLf & _

        "Der Port-Name wurde nicht gefunden!", vbExclamation
  Else
    MsgBox "Drucker '" & strPrinter & "'" & vbCrLf & vbCrLf & "Name des Ports: " & strPort & vbCrLf & _

        "Excel-Druckerbezeichnung: " & strPrinter & " auf " & strPort, vbInformation
  End If
End Sub

Verwandte Codebeispiele

Prüfen, ob ein Port (Anschluss) vorhanden ist

Vorhandene Ports (Anschlüsse) auflisten

Aktuell verwendeter Drucker abfragen

 

Weitere Informationen

VBA-Spezialthema: Windows Script Host (WSH)

To Top

Haben Sie Fragen, Anregungen oder Hinweise?
Mail senden an: philipp_von_wartburg@yahoo.de

Zuletzt aktualisiert am 09.01.2009 / 08:00 Uhr
© 2002-2009 by Philipp von Wartburg, Schweiz

Alle Rechte vorbehalten