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!'

Dateisystem eines Laufwerkes abfragen

.Beschreibung
Das Dateisystem eines Laufwerkes bzw. eines Datenträgers lässt sich komfortabel anhand der FileSystem-Eigenschaft des Drive-Objektes aus der FileSystemObject-Objektbibliothek ermitteln. FileSystem enthält beispielsweise die Zeichenfolge "FAT" oder "NTFS".

Als Alternative zur Lösungsvariante mit der FileSystemObject-Bibliothek (siehe Codebeispiele #1 und #2) gibt es auch eine reine VBA-Lösung, welche die API-Funktion GetVolumneInformation verwendet (siehe Codebeispiel #3).

.VBA-Code #1
Public Sub GetFileSystem1()
  Dim fsoObject As Object
  Dim fsoDrive As Object
  Set fsoObject = CreateObject("Scripting.FileSystemObject")
  Set fsoDrive = fsoObject.GetDrive("C:")
  MsgBox "Das Dateisystem von C: ist " & fsoDrive.FileSystem
  Set fsoDrive = Nothing
  Set fsoObject = Nothing
End Sub

.VBA-Code #2
Public Sub GetFileSystem2()
  MsgBox CreateObject("Scripting.FileSystemObject").GetDrive("C:").FileSystem

End Sub

.VBA-Code #3
'Deklarationsbereich
Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" _
   (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, _
   lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, _
   ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long

'Codemodul
Public Sub GetFileSystem3()
  Dim Drive As String
  Dim FSystem As String
  Drive = "D:\"
  FSystem = Space(127)
  GetVolumeInformation Drive$, vbNullString, 0&, 0&, 0&, 0&, FSystem$, 127&
  MsgBox "Das Dateisystem von " & Left$(Drive, 2) & " ist " & Left$(FSystem, InStr(FSystem, Chr$(0)) - 1)
End Sub

.Hinweis
Wenn bei GetDrive ein ungültiges Laufwerk angegeben wird, erscheint der Laufzeitfehler 68 "Gerät nicht verfügbar" (bei nicht existierendem Laufwerk) oder der Laufzeitfehler 71 "Datenträger nicht bereit" (z.B. bei Diskettenlaufwerk ohne eingelegte Diskette oder CD-ROM-Laufwerk ohne eingelegte CD).

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

Info
Artikel-ID: 1
Thema: Laufwerk/Analysieren
Kategorie: -
Version: 1
Geändert: 7.08.2005

To Top


Share-Name (Freigabename) eines Laufwerkes abfragen

.Beschreibung
Hier wird gezeigt, wie der Share-Name (Freigabename) eines Laufwerkes herausgefunden werden kann. Besitzt das abgefragte Laufwerk keinen Freigabenamen (was unter anderem bei einem Diskettenlaufwerk der Fall ist), so enthält die ShareName-Eigenschaft eine leere Zeichenfolge (sprich ""). Es können auch Laufwerke abgefragt werden, die nicht bereit sind (z.B. falls keine CD im CD-ROM-Laufwerk eingelegt ist).

.VBA-Code #1
Public Sub GetShareName1()
  Dim fsoObject As Object
  Dim fsoDrive As Object
  Set fsoObject = CreateObject("Scripting.FileSystemObject")
  Set fsoDrive = fsoObject.GetDrive("C:")
  MsgBox "Der Freigabename von C: ist " & fsoDrive.ShareName
  Set fsoDrive = Nothing
  Set fsoObject = Nothing
End Sub

.VBA-Code #2
Public Sub GetShareName2()
  MsgBox CreateObject("Scripting.FileSystemObject").GetDrive("C:").ShareName

End Sub

.Hinweis
Wenn der Share-Name eines nicht existierenden Laufwerkes abgefragt wird, erscheint der Laufzeitfehler 68 "Gerät nicht verfügbar".

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

 

Verwandte Codebeispiele

Dateisystem eines Laufwerkes abfragen

.Info
Artikel-ID: 2
Autor: Philipp von Wartburg, www.xlam.info
Thema: Laufwerk/Analysieren
Kategorie: -
Version: 1
Geändert: 7.08.2005

To Top


Volume-Name (Datenträgername) eines Laufwerkes abfragen

.Beschreibung
Diese Codebeispiele zeigen, wie man die Bezeichnung eines Datenträgers (den so genannten Volume-Name) abfragen kann und wie sich diese Information in der Praxis nützlich einsetzen lässt.

» Das Codebeispiel #1 benutzt die Dir-Funktion von VBA unter Verwendung der Konstante vbVolume für das Attributes-Argument.

» Codebeispiel #2 verwendet die VolumeName-Eigenschaft des Drive-Objektes aus der FileSystemObject-Bibliothek.

» Das Beispiel #3 verwendet wie Beispiel #2 die VolumeName-Eigenschaft, wobei hier direkt auf das Drive-Objekt zugegriffen wird, d.h. ohne Benutzung von Objektvariablen.

» Im Codebeispiel #4 wird der Benutzer aufgefordert, eine bestimmte Diskette einzulegen (die mit der Bezeichnung "ABC 2005"), falls sich die falsche Diskette im Laufwerk befindet.

.VBA-Code #1
Public Sub GetVolumeName1()
  MsgBox "Der Datenträgername von C: ist " & Dir("C:", vbVolume)
End Sub

.VBA-Code #2
Public Sub GetVolumeName2()
  Dim fsoObject As Object
  Dim fsoDrive As Object
  Set fsoObject = CreateObject("Scripting.FileSystemObject")
  Set fsoDrive = fsoObject.GetDrive("C:")
  MsgBox "Der Datenträgername von C: ist " & fsoDrive.VolumeName
  Set fsoDrive = Nothing
  Set fsoObject = Nothing
End Sub

.VBA-Code #3
Public Sub GetVolumeName3()
  MsgBox CreateObject("Scripting.FileSystemObject").GetDrive("C:").VolumeName

End Sub

.VBA-Code #4
Public Sub CheckDiskName()
  Do
    If CreateObject("Scripting.FileSystemObject").GetDrive("A:").VolumeName <> "ABC 2005" Then
      If MsgBox("Bitte Diskette mit der Bezeichnung 'ABC 2005' einlegen.", _
          vbInformation + vbRetryCancel, "Falscher Dateiträger") = vbCancel Then
        Exit Sub
      End If
    Else
      Exit Do
    End If
  Loop
  'Weiterer VBA-Code...
End Sub

.Hinweis
Bitte beachten Sie unbedingt folgende Punkte:
- Wenn der Volume-Name eines nicht existierenden Laufwerkes abgefragt wird, erscheint der Laufzeitfehler 68 "Gerät nicht verfügbar".
- Wenn ein Diskettenlaufwerk angesprochen wird, wobei keine Diskette eingelegt ist, erscheint der Laufzeitfehler 71 "Datenträger nicht bereit".
- Wenn ein CD-ROM-Laufwerk angesprochen wird, wobei keine CD eingelegt ist, tritt bei Verwendung der Dir-Funktion kein Laufzeitfehler auf, sondern es wird einfach nichts zurückgegeben (als ob der Datenträger keine Bezeichnung besitzt). Wird dagegen die VolumeName-Eigenschaft verwendet, tritt der Laufzeitfehler 71 "Datenträger nicht bereit" auf.

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

 

Verwandte Codebeispiele

Volume-Name (Datenträgername) eines Laufwerkes ändern/löschen

Dateisystem eines Laufwerkes abfragen

To Top


Volume-Name (Datenträgername) eines Laufwerkes ändern/löschen

.Beschreibung
Anhand der VolumeName-Eigenschaft des Drive-Objektes aus der FileSystemObject-Bibliothek können Sie auf den Namen/die Bezeichnung eines Datenträgers bzw. Laufwerkes zugreifen. Bitte beachten Sie die weiter unten unter "Hinweis" aufgeführten Punkte.

» Bei Codebeispiel #1 wird die Bezeichnung des Laufwerkes C: in "C-Laufwerk" geändert.

» Das Codebeispiel #2 gibt dem Datenträger bzw. der Diskette in Laufwerk A: den Namen "DISK #2".

» Das Beispiel #3 löscht die Bezeichnung der in Laufwerk A: eingelegten Diskette.

.VBA-Code #1
Public Sub SetVolumeName1()
  CreateObject("Scripting.FileSystemObject").GetDrive("C:").VolumeName = "C-Laufwerk"

End Sub

.VBA-Code #2
Public Sub SetVolumeName2()
  CreateObject("Scripting.FileSystemObject").GetDrive("A:").VolumeName = "DISK #2"

End Sub

.VBA-Code #3
Public Sub SetVolumeName3()
  CreateObject("Scripting.FileSystemObject").GetDrive("A:").VolumeName = ""

End Sub

.Hinweis
Bitte beachten Sie unbedingt folgende Punkte:
- Wenn der Volume-Name eines nicht existierenden Laufwerkes geändert wird, erscheint der Laufzeitfehler 68 "Gerät nicht verfügbar".
- Wenn ein Diskettenlaufwerk angesprochen wird, wobei keine Diskette eingelegt ist, erscheint der Laufzeitfehler 71 "Datenträger nicht bereit".
- Wenn ein CD-ROM-Laufwerk angesprochen wird, wobei keine CD eingelegt ist, erscheint ebenfalls der Laufzeitfehler 71 "Datenträger nicht bereit".
- Der Datenträgername darf maximal 11 Zeichen lang sein. Anderenfalls erscheint der Laufzeitfehler 380 "Unzulässiger Eigenschaftswert".
- Kleinbuchstaben werden automatisch in Grossbuchstaben umgewandelt.
- Nur Buchstaben, Ziffern und ein paar sonstige Zeichen (u.a. Leerzeichen, Bindestrich, Unterstrich, runde Klammern, geschweifte Klammern, Apostroph, Tilde, Ausrufezeichen, Dollar, Prozent, Ampersand, Number, At-Zeichen) sind zulässig. Bei Verwendung eines nicht erlaubten Zeichens erscheint der Laufzeitfehler 380 "Unzulässiger Eigenschaftswert".

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

 

Verwandte Codebeispiele

Volume-Name (Datenträgername) eines Laufwerkes abfragen

To Top


Freier Speicherplatz eines Laufwerkes abfragen

.Beschreibung
Der freie Speicherplatz eines Laufwerkes bzw. eines Datenträgers kann mit der FreeSpace-Eigenschaft des Drive-Objektes aus der FileSystemObject-Objektbibliothek ermittelt werden, oder Sie können via Automation die FreeDiskSpace-Eigenschaft aus der Microsoft Word-Bibliothek abfragen. Sowohl FreeSpace als auch FreeDiskSpace liefern den freien Speicherplatz in Bytes. Wenn Sie das Ergebnis durch 1'024 teilen, erhalten Sie den Speicherplatz in KB. Durch erneutes Teilen durch 1'024 erhalten Sie den Speicherplatz in MB. Sie können die von FreeSpace bzw. FreeDiskSpace gelieferte Zahl auch direkt durch 1'048'576 teilen, um MB zu erhalten.

Bitte beachten Sie, dass bei FreeDiskSpace kein Laufwerkbuchstabe angegeben werden kann. Es wird immer das aktuelle Laufwerk verwendet. Dieses kann mit ChDrive gewechselt werden.

.VBA-Code #1
Public Sub GetFreeSpace1()
  Dim fsoObject As Object
  Dim fsoDrive As Object
  Set fsoObject = CreateObject("Scripting.FileSystemObject")
  Set fsoDrive = fsoObject.GetDrive("C:")
  MsgBox "Der freie Speicherplatz von C: beträgt " & fsoDrive.FreeSpace
  Set fsoDrive = Nothing
  Set fsoObject = Nothing
End Sub

.VBA-Code #2
Public Sub GetFreeSpace2()
  MsgBox "Der freie Speicherplatz von C: beträgt " & CreateObject("Scripting.FileSystemObject").GetDrive("C:").FreeSpace

End Sub

.VBA-Code #3
Public Sub GetFreeSpace3()
  Dim objWord As Object
  Set objWord = CreateObject("Word.Application")
  MsgBox "Der freie Speicherplatz von " & Left$(CurDir, 2) & " beträgt " & objWord.System.FreeDiskSpace
  objWord.Quit
  Set objWord = Nothing
End Sub

.Hinweis
Im Gegensatz zur AvailableSpace-Eigenschaft gibt FreeSpace den gesamten freien Speicherplatz zurück. Allfällige Speicherplatz-Beschränkungen für Benutzer (Space Restriction) werden von FreeSpace nicht berücksichtigt.

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

VBA-Befehle und -Funktionen

 

Verwandte Codebeispiele

Verfügbarer Speicherplatz eines Laufwerkes abfragen

Belegter Speicherplatz eines Laufwerkes abfragen

Gesamter Speicherplatz eines Laufwerkes abfragen

Laufwerke mit Speicherkapazität und Auslastung auflisten

Prüfen, ob eine Diskette genügend freien Speicherplatz besitzt

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

To Top


Verfügbarer Speicherplatz eines Laufwerkes abfragen

.Beschreibung
Der auf einem Laufwerk bzw. Datenträger verfügbare Speicherplatz kann mit der AvailableSpace-Eigenschaft des Drive-Objektes aus der FileSystemObject-Bibliothek abgefragt werden. AvailableSpace liefert den verfügbaren Speicherplatz in Bytes. Sie können den Wert durch 1'024 teilen, um KB zu erhalten.

.VBA-Code #1
Public Sub GetAvailableSpace1()
  Dim fsoObject As Object
  Dim fsoDrive As Object
  Set fsoObject = CreateObject("Scripting.FileSystemObject")
  Set fsoDrive = fsoObject.GetDrive("C:")
  MsgBox "Der verfügbare Speicherplatz von C: beträgt " & fsoDrive.AvailableSpace
  Set fsoDrive = Nothing
  Set fsoObject = Nothing
End Sub

.VBA-Code #2
Public Sub GetAvailableSpace2()
  MsgBox "Der verfügbare Speicherplatz beträgt " & CreateObject("Scripting.FileSystemObject").GetDrive("C:").AvailableSpace

End Sub

.Hinweis
Im Gegensatz zur FreeSpace-Eigenschaft gibt AvailableSpace nur den tatsächlich verfügbaren Platz zurück. Besitzt ein Benutzer (beziehungsweise das Benutzerprofil) eine Speicherplatz-Beschränkung (Space Restrictions), so wird der freie Platz im Rahmen dieser Beschränkung angezeigt und nicht der freie Speicherplatz des gesamten Laufwerkes.

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

 

Verwandte Codebeispiele

Freier Speicherplatz eines Laufwerkes abfragen

Belegter Speicherplatz eines Laufwerkes abfragen

Gesamter Speicherplatz eines Laufwerkes abfragen

Laufwerke mit Speicherkapazität und Auslastung auflisten

Prüfen, ob eine Diskette genügend freien Speicherplatz besitzt

To Top


Gesamter Speicherplatz eines Laufwerkes abfragen

.Beschreibung
Der Gesamtspeicherplatz bzw. die Grösse eines Laufwerkes bzw. der Speicherplatz eines Datenträgers wird mit der TotalSize-Eigenschaft des Drive-Objektes aus der FileSystemObject-Objektbibliothek ermittelt. TotalSize liefert den gesamten Speicherplatz (freier plus belegter) in Bytes. Sie können den Wert durch 1'024 teilen, um den Speicherplatz in KB zu erhalten.

.VBA-Code #1
Public Sub GetTotalSize1()
  Dim fsoObject As Object
  Dim fsoDrive As Object
  Set fsoObject = CreateObject("Scripting.FileSystemObject")
  Set fsoDrive = fsoObject.GetDrive("C:")
  MsgBox "Der gesamte Speicherplatz von C: beträgt " & fsoDrive.TotalSize & " Bytes"
  Set fsoDrive = Nothing
  Set fsoObject = Nothing
End Sub

.VBA-Code #2
Public Sub GetTotalSize2()
  MsgBox CreateObject("Scripting.FileSystemObject").GetDrive("C:").TotalSize
End Sub

.Hinweis
Die FileSystemObject-Bibliothek bietet noch eine andere Möglichkeit, die Grösse eines Laufwerkes herauszufinden, und zwar anhand der Size-Eigenschaft des Folder-Objektes (siehe Codebeispiel Grösse eines Laufwerkes abfragen).

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

 

Verwandte Codebeispiele

Grösse eines Laufwerkes abfragen

Freier Speicherplatz eines Laufwerkes abfragen

Verfügbarer Speicherplatz eines Laufwerkes abfragen

Belegter Speicherplatz eines Laufwerkes abfragen

Laufwerke mit Speicherkapazität und Auslastung auflisten

Prüfen, ob eine Diskette genügend freien Speicherplatz besitzt

To Top


Belegter Speicherplatz eines Laufwerkes abfragen

.Beschreibung
Der belegte Speicherplatz eines Laufwerkes wird am besten ermittelt, indem der man zuerst mit der TotalSize-Eigenschaft des Drive-Objektes den gesamten Speicherplatz abfragt und dann den von FreeSpace zurückgegebene Wert subtrahiert.

.VBA-Code #1
Public Sub GetTotalSize1()
  Dim fsoObject As Object
  Dim fsoDrive As Object
  Set fsoObject = CreateObject("Scripting.FileSystemObject")
  Set fsoDrive = fsoObject.GetDrive("C:")
  MsgBox "Der belegte Speicherplatz von C: beträgt " & fsoDrive.TotalSize - fsoDrive.FreeSpace & " Bytes"
  Set fsoDrive = Nothing
  Set fsoObject = Nothing
End Sub

.VBA-Code #2
Public Sub GetTotalSize2()
  MsgBox CreateObject("Scripting.FileSystemObject").GetDrive("C:").TotalSize - _ 

      CreateObject("Scripting.FileSystemObject").GetDrive("C:").FreeSpace
End Sub

.Hinweis
Die FileSystemObject-Bibliothek bietet noch eine andere Möglichkeit, die Grösse eines Laufwerkes herauszufinden, und zwar anhand der Size-Eigenschaft des Folder-Objektes (siehe Codebeispiel Grösse eines Laufwerkes abfragen).

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

 

Verwandte Codebeispiele

Grösse eines Laufwerkes abfragen

Freier Speicherplatz eines Laufwerkes abfragen

Verfügbarer Speicherplatz eines Laufwerkes abfragen

Laufwerke mit Speicherkapazität und Auslastung auflisten

Prüfen, ob eine Diskette genügend freien Speicherplatz besitzt

To Top


Anzahl Laufwerke abfragen

.Beschreibung
Die Anzahl Laufwerke kann mit der Count-Eigenschaft der Drives-Auflistung aus der FileSystemObject-Objektbibliothek herausgefunden werden. Die Anzahl berücksichtigt alle Laufwerke, die Laufwerkbuchstaben besitzen. Als Laufwerke werden somit nicht nur Festplatten bezeichnet sondern auch Diskettenlaufwerke, CD-ROM-Laufwerke, verbundene Netzwerklaufwerke etc.

.VBA-Code #1
Public Sub ShowNumberOfDrives1()
  Dim fsoObject As Object
  Dim fsoDrive As Object
  Set fsoObject = CreateObject("Scripting.FileSystemObject")
  MsgBox "Die Anzahl Laufwerke ist " & fsoObject.Drives.Count
  Set fsoDrive = Nothing
  Set fsoObject = Nothing
End Sub

.VBA-Code #2
Public Sub ShowNumberOfDrives2()
  MsgBox CreateObject("Scripting.FileSystemObject").Drives.Count
End Sub

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Laufwerksbuchstabe aus einem Dateinamen extrahieren

.Beschreibung
Im Prinzip ist es äusserst einfach, den Laufwerksbuchstaben aus einem vollständigen Dateinamen zu ermitteln. Man braucht lediglich die ersten beiden Zeichen mit der VBA-Funktion Left$ abzufragen. Weil man aber überprüfen muss, ob überhaupt ein Dateiname angegeben wurde, ob dieser mindestens zwei Zeichen lang ist, ob das erste Zeichen ein Buchstabe und das zweite Zeichen ein Doppelpunkt ist, ist schon ein bisschen mehr VBA-Code nötig. Einfacher geht es mit der GetDriveName-Methode aus der FileSystemObject-Objektbibliothek, da sie alle diese Punkte selbständig überprüft.

.VBA-Code #1
Public Sub GetDriveLetter1()
  Dim fsoObject As Object
  Set fsoObject = CreateObject("Scripting.FileSystemObject")
  MsgBox "Laufwerksbuchstabe: " & fsoObject.GetDriveName("C:\Daten\EineMappe.xls")
  Set fsoObject = Nothing
End Sub

.VBA-Code #2
Public Sub GetDriveLetter2()
  MsgBox CreateObject("Scripting.FileSystemObject").GetDriveName("C:\Daten\EineMappe.xls")
End Sub

.Hinweis
Die bei GetDriveName angegebene Datei muss nicht zwingend existieren.

Tipp! Tipp!
GetDriveName verarbeitet problemlos auch UNC-Pfade. Wie das funktioniert, zeigt das Codebeispiel Laufwerk aus einem UNC-Pfad extrahieren.

Verwandte Codebeispiele

Laufwerksbuchstabe aus einem Laufwerk extrahieren

Laufwerk aus einem UNC-Pfad extrahieren

 

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Laufwerk aus einem UNC-Pfad extrahieren

.Beschreibung
UNC-Pfade enthalten bekanntlich immer den Server- und den Freigabenamen, gefolgt von einem Pfad. Möchte man nur Server- und Freigabename des UNC-Pfades wissen, muss man theoretisch den Teil vor dem vierten Backslash-Zeichen (\) abfragen, da der Teil nach dem vierten Backslash zum Ordner-/Verzeichnisname gehört. In der Praxis geht es bedeutend einfacher, weil man die GetDriveName-Methode aus der FileSystemObject-Objektbibliothek zuhilfe nehmen kann. GetDriveName prüft selbständig, ob der angegebene UNC-Pfad Sinn macht. Nur wenn der UNC-Pfad mit der Syntax "\\x\y" beginnt, wird die Laufwerksbezeichnung zurückgegeben. Ansonsten wird eine leere Zeichenfolge ("") zurückgegeben.

.VBA-Code #1
Public Sub GetUNCDriveName1()
  Dim fsoObject As Object
  Set fsoObject = CreateObject("Scripting.FileSystemObject")
  MsgBox "Laufwerksbezeichnung: " & fsoObject.GetDriveName("\\Server\Freigabename\Daten")
  Set fsoObject = Nothing
End Sub

.VBA-Code #2
Public Sub GetUNCDriveName2()
  MsgBox CreateObject("Scripting.FileSystemObject").GetDriveName("\\Server\Freigabename")
End Sub

.Hinweis
Der bei GetDriveName angegebene UNC-Pfad muss nicht zwingend existieren.

Verwandte Codebeispiele

Laufwerksbuchstabe aus einem Dateinamen extrahieren

Laufwerksbuchstabe aus einem Laufwerk extrahieren

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

Share-Name (Freigabename) eines Laufwerkes abfragen

 

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Laufwerksbuchstabe aus einem Laufwerk extrahieren

.Beschreibung
Wenn man für den Zugriff auf ein Laufwerk mit der FileSystemObject-Objektbibliothek arbeitet und den Laufwerksbuchstaben eines Laufwerkes wissen möchte, kann man die DriveLetter-Eigenschaft abfragen. Es wird immer ein einzelner Buchstabe zurückgegeben, also der Laufwerksbuchstabe ohne Doppelpunkt bzw. Backslash-Zeichen.

.VBA-Code #1
Public Sub GetDriveLetter1()
  Dim fsoObject As Object
  Set fsoObject = CreateObject("Scripting.FileSystemObject")
  MsgBox "Laufwerksbuchstabe: " & fsoObject.GetDrive("C:\").DriveLetter
  Set fsoObject = Nothing
End Sub

.VBA-Code #2
Public Sub GetDriveLetter2()
  MsgBox CreateObject("Scripting.FileSystemObject").GetDrive("C:\").DriveLetter
End Sub

.Hinweis
Das bei GetDrive angegebene Laufwerk muss existieren, aber nicht zwingend bereit sein. Beispielsweise muss in einem CD-ROM-Laufwerk keine CD eingelegt sein. Wenn das Laufwerk nicht vorhanden ist, erscheint der Laufzeitfehler 68 "Gerät nicht verfügbar". Die Verwendung von Netzwerkfreigaben (z.B. "\\Server\Freigabe") ist erlaubt.

Verwandte Codebeispiele

Laufwerksbuchstabe aus einem Dateinamen extrahieren

Laufwerk aus einem UNC-Pfad extrahieren

 

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Versionsnummer einer ausführbaren Datei abfragen

.Beschreibung
Die Versionsnummer einer Programmdatei kann mit der GetFileVersion-Methode des FileSystemObject-Objektes aus der FileSystemObject-Objektbibliothek ermittelt werden.

Es wird gewöhnlich diejenige Versionsinformation ausgegeben, die auch im Eigenschaften-Dialog (Registerseite "Version") des Windows Explorers angezeigt wird, wenn man eine Datei selektiert und dann den Menübefehl "Eigenschaften" ausführt (oder die Tastenkombination Alt+Enter drückt). Gerade bei Microsoft Excel jedoch stimmen diese Angaben nicht überein.

GetFileVersion: 8.0.1.4307
Eigenschaften-Dialog: 8.0a
Application.Version: 8.0a
Application.Build: 4307

Übrigens kann nicht nur die Version von exe-Dateien, sondern auch von dll-, olb-, cpl-, scr- und sys-Dateien abgefragt werden.

.VBA-Code #1
Public Sub GetFileVersion1()
  Dim fsoObject As Object
  Set fsoObject = CreateObject("Scripting.FileSystemObject")
  MsgBox "Dateiversion: " & fsoObject.GetFileVersion("C:\Windows\Notepad.exe")
  Set fsoObject = Nothing
End Sub

.VBA-Code #2
Public Sub GetFileVersion2()
  MsgBox CreateObject("Scripting.FileSystemObject").GetFileVersion("C:\Windows\Notepad.exe")
End Sub

Verwandte Codebeispiele

Ziel-Betriebssystem einer ausführbaren Datei abfragen

Versionsinformationen einer ausführbaren Datei abfragen

Excel-Version ermitteln

Version der installierten Microsoft Excel-Anwendung ermitteln

 

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Excel-Buildnummer abfragen

.Beschreibung
Die Buildnummer von Microsoft Excel lässt sich anhand der Build-Eigenschaft des Application-Objektes ermitteln.

GetFileVersion-Methode

» Codebeispiel #1: Build der aktuellen Excel-Sitzung.

» Codebeispiel #2: Build der Programmdatei Excel.exe der aktuellen Excel-Sitzung.

» Codebeispiel #3: Build der angegebenen Programmdatei Excel.exe.

.VBA-Code #1
Public Sub GetExcelBuild1()
  MsgBox "Buildnummer von Microsoft Excel: " & Application.Build
End Sub

.VBA-Code #2
Public Sub GetExcelBuild2()
  Dim strVersion As String
  Dim strBuild As String
  Dim intChar As Integer
  strVersion = CreateObject("Scripting.FileSystemObject").GetFileVersion(Application.Path & "\Excel.exe")
  For intChar = Len(strVersion) To 1 Step -1
    If Mid$(strVersion, intChar, 1) = "." Then
      strBuild = Right$(strVersion, Len(strVersion) - intChar)
      Exit For
    End If
  Next intChar
  MsgBox "Buildnummer von Excel.exe: " & strBuild
End Sub

.VBA-Code #3
Public Sub GetExcelBuild3()
  Dim strVersion As String
  Dim strBuild As String
  Dim intChar As Integer
  strVersion = CreateObject("Scripting.FileSystemObject").GetFileVersion("D:\Programme\Microsoft Office\Office\Excel.exe")
  For intChar = Len(strVersion) To 1 Step -1
    If Mid$(strVersion, intChar, 1) = "." Then
      strBuild = Right$(strVersion, Len(strVersion) - intChar)
      Exit For
    End If
  Next intChar
  MsgBox "Buildnummer von Excel.exe: " & strBuild
End Sub

Verwandte Codebeispiele

Excel-Version ermitteln

Version der installierten Microsoft Excel-Anwendung ermitteln

To Top


Aktivieren eines bereits laufenden Office-Programmes

.Beschreibung
Anhand der ActivateMicrosoftApp-Methode des Application-Objektes kann ein anderes, laufendes Office-Programm aktiviert werden. Durch das Aktivieren erhält das Office-Programm bzw. sein Anwendungsfenster den Fokus.

Folgende Konstanten stehen als Parameter zur Verfügung:

Konstante Wert
xlMicrosoftAccess 4
xlMicrosoftFoxPro 5
xlMicrosoftMail 3
xlMicrosoftPowerPoint 2
xlMicrosoftProject 6
xlMicrosoftSchedulePlus 7
xlMicrosoftWord 1

.VBA-Code
Public Sub ActivateOfficeProgram()
  Application.ActivateMicrosoftApp xlMicrosoftWord

End Sub

.Hinweis
- Beachten Sie, dass ActivateMicrosoftApp nur in Microsoft Excel existiert. Andere Office-Programme wie unter anderem Microsoft Word und Microsoft PowerPoint kennen diese Methode nicht.

- Die ActivateMicrosoftApp-Methode besitzt ein höchst interessantes Verhalten, wenn man anstelle einer der oben angegebenen Konstanten den Wert True oder False angibt. Lesen Sie alles darüber auf dieser Seite:

Weitere Informationen

The eXpLorer: ActivateMicrosoftApp

- Mit ActivateMicrosoftApp kann auch ein Office-Programm gestartet werden. Das geschieht immer dann automatisch, wenn das angegebene Programm nicht aktiviert werden kann, weil es noch nicht läuft.

Verwandte Codebeispiele

Aktivieren eines bereits laufenden Windows-Programmes

Fenster einer laufenden Anwendung aktivieren

To Top


Aktivieren eines bereits laufenden Windows-Programmes

.Beschreibung
Ein bereits laufendes Programm wird am einfachsten mit der AppActivate-Methode von VBA aktiviert. Allerdings besitzt die Methode ein paar Schwächen, weshalb hier noch eine andere Lösung ohne AppActivate vorgestellt wird.

» Codebeispiel #1: Dieses Beispiel verwendet die AppActivate-Methode von VBA. Dadurch erhält das angegebene Programm den Fokus. Wenn das angegebene Programm nicht läuft, erscheint der Laufzeitfehler 5 "Unzulässiger Prozeduraufruf oder ungültiges Argument". Ausführliche Informationen über die sonstigen Möglichkeiten und Spezialitäten von AppActivate siehe weiter unten unter "Weitere Informationen".

» Codebeispiel #2: Diese Lösung benutzt die Activate-Methode des Task-Objektes von Microsoft Word. Es wird mittels Automation eine neue Instanz von Microsoft Word gestartet, damit auf die Tasks-Auflistung zugegriffen und das gewünschte Programm aktiviert werden kann.

» Codebeispiel #3: Hier wird ebenfalls die Activate-Methode aus der Microsoft Word-Objektbibliothek eingesetzt. Dieser Programmcode muss sich in einem VBA-Projekt eines Microsoft Word-Dokumentes befinden.

.VBA-Code #1
Public Sub ActivateTask1()
  AppActivate "Rechner"
End Sub

.VBA-Code #2
Public Sub ActivateTask2()
  Const TaskName As String = "Rechner"
  Dim objWord As Object
  Set objWord = CreateObject("Word.Application")
  On Error Resume Next
  objWord.Tasks(TaskName).Activate
  If Err.Number = 5491 Then
    MsgBox "Der Task '" & TaskName & "' existiert nicht!", vbExclamation
  ElseIf Err.Number <> 0 Then
    MsgBox "Beim Aktivieren 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 ActivateTask3()
  Application.Tasks("Rechner").Activate

End Sub

.Hinweis
Wenn Sie die obigen Codebeispiele direkt im VBA-Editor starten, wird das angegebene Programm aktiviert, danach jedoch der Fokus wieder zurück auf das Fenster des VBA-Editors gesetzt. Dadurch kann der Eindruck entstehen, dass der Programmcode nicht korrekt funktioniert, was aber nicht der Fall ist.

Verwandte Codebeispiele

Aktivieren eines bereits laufenden Office-Programmes

Fenster einer laufenden Anwendung aktivieren

 

Weitere Informationen

VBA-Befehle und -Funktionen

To Top


Länge des vollständigen Dateinamens einer Arbeitsmappe abfragen

.Beschreibung
Dieses kurze Beispiel zeigt, wie man die Länge eines vollständigen Dateinamens (d.h. inklusive Pfad) herausfinden kann. Man braucht lediglich die Länge des Inhaltes der FullName-Eigenschaft abzufragen.

» Codebeispiel #1: Hier wird die Länge des Pfad-/Dateinamens der aktiven Arbeitsmappe ausgegeben.

» Codebeispiel #2: Dieses praxisnahe Beispiel zeigt, in welcher Situation man die Länge des Pfad-/Dateinamens benötigt. Zuerst wird der "Speichern unter"-Dialog angezeigt und ein Dateiname bzw. Speicherort verlangt. Wenn der vollständige Dateiname länger als 218 Zeichen ist, erscheint eine Hinweismeldung. Anderenfalls wird die aktive Arbeitsmappe gespeichert.

.VBA-Code #1
Public Sub GetFileNameLength1()
  MsgBox "Länge des vollständigen Dateinamens: " & Len(ActiveWorkbook.FullName)

End Sub

.VBA-Code #2
Public Sub GetFileNameLength2()
  Dim strFile As String
  strFile = Application.GetSaveAsFilename(, "Microsoft Excel-Arbeitsmappen (*.xls),*.xls")
  If strFile <> "Falsch" And strFile <> "False" Then
    If Len(strFile) > 218 Then
      MsgBox "Der gewählte Dateiname '" & strFile & "' ist zu lang.", vbInformation
      Exit Sub
    Else
      ActiveWorkbook.SaveAs strFile
    End If
  End If
End Sub

.Hinweis
Beachten Sie unbedingt, dass der Pfad-/Dateiname einer Arbeitsmappendatei maximal 218 Zeichen lang sein darf. Beim Verwenden von mehr als 218 Zeichen können Fehlermeldungen auftreten, weil, je nach Situation, auf die Datei nicht zugegriffen oder die Datei nicht gefunden werden kann. Ausführliche Informationen dazu finden Sie auf dieser Webseite:

Weitere Informationen

XLimits: Maximale Länge des Dateinamens einer Arbeitsmappe

To Top


Prüfen, ob eine Datei komprimiert ist

.Beschreibung
Anhand von GetAttr von VBA können Sie herausfinden, ob eine Datei komprimiert ist. Dazu muss eine logische Konjunktion mit dem Wert 2048 anhand des And-Operators durchgeführt werden. Wenn die Formel "(Rückgabewert von GetAttr) And 2048" gleich True ergibt, ist die Datei komprimiert.

.VBA-Code
Public Sub GetCompressedAttribute()
  If GetAttr("C:\Daten\EineDatei.xls") And 2048 Then
    MsgBox "Die Datei ist komprimiert."
  Else
    MsgBox "Die Datei ist nicht komprimiert."
  End If
End Sub

Verwandte Codebeispiele

Komprimierungsgrösse einer komprimierten Datei ermitteln

 

Weitere Informationen

VBA-Befehle und -Funktionen

To Top


Datei-Attribute abfragen und als Text ausgeben

.Beschreibung
Diese kleine Prozedur gibt die Datei-Attribute einer Datei als Text in einem Dialogfeld aus. Ist beispielsweise die Datei "C:\Daten\EineDatei.xls" verborgen und schreibgeschützt, so erscheint der Text "Dateiattribute: Versteckt, Schreibgeschützt". Die Attribute werden mit der Attributes-Eigenschaft aus der FileSystemObject-Bibliothek ermittelt. Man könnte dazu genau so gut die GetAttr-Funktion von VBA benutzen.

Zum Ermitteln der Datei-Attribute wird eine so genannte logische Konjunktion zwischen zwei Ausdrücken eingesetzt (And-Operator).

.VBA-Code
Public Sub GetFileAttributes()
  Dim x As Integer
  Dim strMessage As String
  x = CreateObject("Scripting.FileSystemObject").GetFile("C:\Daten\EineDatei.xls").Attributes
  If (x And 2048) Then
    strMessage = strMessage & "Komprimiert, "
    x = x - 2048
  End If
  If (x And 64) Then
    strMessage = strMessage & "Alias, "
    x = x - 64
  End If
  If (x And 32) Then
    strMessage = strMessage & "Archiv, "
    x = x - 32
  End If
  If (x And 16) Then
    strMessage = strMessage & "Directory, "
    x = x - 16
  End If
  If (x And 8) Then
    strMessage = strMessage & "Volume, "
    x = x - 8
  End If
  If (x And 4) Then
    strMessage = strMessage & "System, "
    x = x - 4
  End If
  If (x And 2) Then
    strMessage = strMessage & "Versteckt, "
    x = x - 2
  End If
  If (x And 1) Then
    strMessage = strMessage & "Schreibgeschützt, "
    x = x - 1
  End If
  If strMessage = "" Then
    strMessage = "(Normal)"
  Else
    strMessage = Left(strMessage, Len(strMessage) - 2)
  End If
  MsgBox "Dateiattribute: " & strMessage

End Sub

Weitere Informationen

VBA-Befehle und -Funktionen

To Top


Grösse eines Ordners abfragen

.Beschreibung
Wenn Sie die Grösse eines Ordners wissen möchten, können Sie ganz einfach die Size-Eigenschaft des Folder-Objektes aus der FileSystemObject-Bibliothek abfragen. Die ausgegebene Zahl stellt die Grösse (in Bytes) sämtlicher Dateien des Ordners dar - egal ob sich die Dateien direkt im Ordner oder in einem seiner Unterordner befinden.

Bitte beachten Sie unbedingt diese Punkte:
- Wenn ein nicht vorhandener Pfad, ein nicht verfügbares oder ein nicht existierendes Laufwerk angegeben wird, erscheint der Laufzeitfehler 76 "Pfad nicht gefunden".
- Wenn der Benutzer keinen Zugriff auf den angegebenen Ordner oder auf irgend einen Unterordner dieses Ordners (egal welcher Ebene) hat, tritt sofort Laufzeitfehler 70 "Zugriff verweigert" auf. Dies ist dann der Fall, wenn der Benutzer die Verzeichnis-Berechtigung "Lesen" nicht besitzt.
- Bitte beachten Sie, dass die Abfrage von Size unter Umständen ziemlich lange dauern kann. Dies, wenn der angegebene Ordner viele Ordner enthält oder der Ordner auf einem langsamen Laufwerk befindet (z.B. einer Diskette).

.VBA-Code
Public Sub GetFolderSize()
  MsgBox "Grösse des Ordners: " & CreateObject("Scripting.FileSystemObject").GetFolder("C:\Daten").Size

End Sub

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

 

Verwandte Codebeispiele

Grösse eines Laufwerks abfragen

To Top


Unterordner in einem Ordner anlegen

.Beschreibung
Dieses Beispiel erstellt einen neuen Unterordner in einem bestimmten Ordner. Dazu wird die Add-Methode des SubFolders-Objektes aus der FileSystemObject-Objektbibliothek verwendet. Als Alternative könnte man den neuen Ordner auch mit dem MkDir-Befehl von VBA anlegen. Der Vorteil von "SubFolders.Add" ist jedoch, dass Add den neuen Ordner als Objekt zurückgibt. Dadurch kann man unmittelbar nach der Ordnererstellung komfortabel auf den neuen Ordner zugreifen (siehe Codebeispiel #2).

.VBA-Code #1
Public Sub AddNewSubFolder1()
  CreateObject("Scripting.FileSystemObject").GetFolder("C:\Daten").SubFolders.Add "NeuerOrdner"

End Sub

.VBA-Code #2
Public Sub AddNewSubFolder2()
  Dim objNewFolder As Object
  Set objNewFolder = CreateObject("Scripting.FileSystemObject").GetFolder("C:\Daten").SubFolders.Add("NeuerOrdner")

  MsgBox objNewFolder.DateCreated
  Set objNewFolder = Nothing
End Sub

.Hinweis
Bitte beachten Sie, dass, wenn der zu erstellende Ordner bereits vorhanden ist, der Laufzeitfehler 58 "Datei existiert bereits" auftritt.

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

 

Verwandte Codebeispiele

Ordner anlegen

Ordner mit Unterordnern anlegen (Verzeichnisbaum

To Top


Ordnertyp abfragen

.Beschreibung
Mit der Type-Eigenschaft des Folder-Objektes aus der FileSystemObject-Bibliothek können Sie auf sehr einfache Art und Weise den Typ eines Ordners feststellen. Der Ordnertyp wird beispielsweise dann benötigt, wenn beim Kopieren einer Datei geprüft werden soll, ob der Zielordner die Datei überhaupt aufnehmen kann. Bestimmte Ordner können nämlich nicht als Ziel verwendet werden.

Es gibt folgende Ordnertypen (Liste nicht abschliessend):

Ordnername Ordnertyp Ort
(Beliebiger Name) Dateiordner (Beliebiger Ort)
"Recycled" Papierkorb Laufwerk-Root
"Tasks" Geplante Vorgänge Windows-Ordner
"Offline Web Pages" Subscription Folder Windows-Ordner
"Downloaded Program Files" ActiveX-Zwischenspeicher-Ordner Windows-Ordner
"Verlauf" Verlauf Windows-Ordner
"His6" Verlauf [..]\Profile\<Benutzername>

Beispielsweise gibt die Ordnertyp-Abfrage von "C:\Recycled" die Zeichenfolge "Papierkorb" zurück, und die Abfrage von beispielsweise "C:\WinNT\Offline Web Pages" ergibt "Subscription Folder".

.VBA-Code
Public Sub GetFolderType()
  MsgBox CreateObject("Scripting.FileSystemObject").GetFolder("C:\Recycled").Type

End Sub

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Spezialordner auflisten

.Beschreibung
Dieses Beispiel listet die Pfade der Spezialordner von Windows, und zwar den Windows-, den System- und den Temp-Ordner, auf dem aktiven Arbeitsblatt auf. Es gibt mehrere andere Möglichkeiten, wie man die Spezialordner ermitteln kann. Das hier vorgestellte Beispiel soll zeigen, wie man die Ordnerpfade anhand der GetSpecialFolder-Methode des FileSystemObject-Objektes herankommt.

Am Ende des Codebeispiels sind unter "Verwandte Codebeispiele" zwei andere Beispiele angegeben, wie man weitere Spezialordner von Windows abfragen kann. Es handelt sich insbesondere um benutzerspezifische Ordner wie den Desktop-, Dokumente-, Favoriten, Senden an-, Autostart-Ordner sowie viele andere mehr.

.VBA-Code
Public Sub ListSpecialFolders()
  Dim fsoObject As Object
  Set fsoObject = CreateObject("Scripting.FileSystemObject")

  With ActiveSheet
    .Cells(1, 1).Value = "Windows-Ordner:"
    .Cells(1, 2).Value = fsoObject.GetSpecialFolder(0)
    .Cells(2, 1).Value = "System-Ordner:"
    .Cells(2, 2).Value = fsoObject.GetSpecialFolder(1)
    .Cells(3, 1).Value = "Temp-Ordner:"
    .Cells(3, 2).Value = fsoObject.GetSpecialFolder(2)

  End With
  Set fsoObject = Nothing
End Sub

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

 

Verwandte Codebeispiele

Spezialordner mit Pfad auflisten

Pfad eines Spezialordners ermitteln

To Top


Dateiname in Pfad und Datei splitten

.Beschreibung
Dieses Beispiel zeigt, wie man einen vollständigen Dateinamen in die beiden Bestandteile "Dateiname" und "Pfadname" splitten kann. Diese Lösung funktioniert allerdings nur, wenn die Datei existiert. Weitere Lösungen finden Sie unter "Verwandte Codebeispiele".

.VBA-Code
Public Sub SplitFullname()
  Dim strFullname As String
  Dim strFilename As String
  Dim strPathname As String
  strFullname = "C:\Daten\EineMappe.xls"
  strFilename = Dir(strFullname, vbHidden)
  If strFilename <> "" Then
    strPathname = Left(strFullname, Len(strFullname) - Len(Dir(strFullname, vbHidden)) - 1)
  Else
    strPathname = ""
  End If
  MsgBox "Datei: " & strFullname
  MsgBox "Dateiname: " & strFilename
  MsgBox "Pfadname: " & strPathname
End Sub

Verwandte Codebeispiele

Pfad aus einem Dateinamen extrahieren

Datei aus einem Dateinamen extrahieren

Dateinamenerweiterung aus einem Dateinamen extrahieren

Laufwerksbuchstabe aus einem Dateinamen extrahieren

To Top


Pfad aus einem Dateinamen extrahieren

.Beschreibung
Die hier vorgestellten Beispiele zeigen, wie man den Pfad aus einem vollständigen Dateinamen extrahieren kann.

» Das erste Codebeispiel zeigt eine Funktion, in welcher die Dir-Funktion von VBA verwendet wird. Diese Lösung funktioniert allerdings nur, wenn die übergebene Datei existiert. Wenn die Datei nicht vorhanden ist, gibt die Funktion eine leere Zeichenfolge ("") zurück.

» Das Codebeispiel #2 benutzt die ParentFolder-Eigenschaft des File-Objektes (welches mittels GetFile-Methode ermittelt wird) aus der FileSystemObject-Objektbibliothek. Diese Lösung funktioniert ebenfalls nur bei einer vorhandenen Datei. Wenn die Datei nicht existiert, erscheint der Laufzeitfehler 53 "Datei nicht gefunden".

» Auch das Beispiel #3 verwendet die FileSystemObject-Objektbibliothek. Weil hier aber die GetParentFolderName-Methode benutzt wird, muss die angegebene Datei nicht zwingend existieren. Dies ist die beste Lösung, da keine Laufzeitfehler auftreten können, Fantasie-Pfade angegeben werden können und auch UNC-Pfade problemlos akzeptiert werden.

.VBA-Code #1
'Codemodul
Public Function GetPathFromFile(ByVal strFullname As String) As String
  If Dir(strFullname, vbHidden) <> "" Then
    GetPathFromFile = Left(strFullname, Len(strFullname) - Len(Dir(strFullname, vbHidden)) - 1)
  Else
    GetPathFromFile = ""
  End If
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox GetPathFromFile("C:\Daten\EineMappe.xls")
End Sub

.VBA-Code #2
Public Sub GetFilePath1()
  MsgBox CreateObject("Scripting.FileSystemObject").GetFile("C:\Daten\EineMappe.xls").ParentFolder
End Sub

.VBA-Code #3
Public Sub GetFilePath2()
  MsgBox CreateObject("Scripting.FileSystemObject").GetParentFolderName("C:\Daten\EineMappe.xls")
End Sub

Verwandte Codebeispiele

Dateiname in Pfad und Datei splitten

Datei aus einem Dateinamen extrahieren

Dateinamenerweiterung aus einem Dateinamen extrahieren

Laufwerksbuchstabe aus einem Dateinamen extrahieren

 

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Datei aus einem Dateinamen extrahieren

.Beschreibung
Es gibt zwei Möglichkeiten, den Namen einer Datei aus einem vollständigen Dateinamen (d.h. inklusive Pfad) zu extrahieren.

» Die in Codebeispiel #1 vorgestellte kleine VBA-Funktion extrahiert den Dateinamen durch Suchen des letzten Backslash-Zeichens ('\'). Diese Lösung funktioniert auch bei nicht vorhandenen Dateien bzw. Pfaden. Wird der Funktion beispielsweise der Dateiname "C:\Daten\EineMappe.xls" übergeben, so gibt sie "EineMappe.xls" zurück.

» Das Codebeispiel #2 zeigt die Variante mit der GetFileName-Methode aus der FileSystemObject-Objektbibliothek und ist bedeutend kürzer als das VBA-Codebeispiel #1. Diese Lösung funktioniert ebenfalls auch bei nicht existierenden Dateien bzw. Pfaden. Wird der Funktion zum Beispiel der Dateiname "C:\Daten\EineMappe.xls" übergeben, so gibt sie "EineMappe.xls" zurück.

.VBA-Code #1
Public Function GetFilename(ByVal strFile As String) As String
  Dim intCounter As Integer
  Dim strFilename As String
  For intCounter = Len(strFile) To 1 Step -1
    If Mid$(strFile, intCounter, 1) = "\" Then
      strFilename = Mid$(strFile, intCounter + 1)
      Exit For
    End If
  Next intCounter
  If strFilename = "" Then
    GetFilename = "ERROR"
  Else
    GetFilename = strFilename
  End If
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox GetFilename("C:\Daten\EineMappe.xls")
End Sub

.VBA-Code #2
Public Sub GetFilename()
  MsgBox CreateObject("Scripting.FileSystemObject").GetFileName("C:\Daten\EineMappe.xls")
End Sub

Verwandte Codebeispiele

Pfad aus einem Dateinamen extrahieren

Dateiname in Pfad und Datei splitten

Dateinamenerweiterung aus einem Dateinamen extrahieren

Dateiname ohne Dateinamenerweiterung aus einem Dateinamen extrahieren

Laufwerksbuchstabe aus einem Dateinamen extrahieren

 

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Dateinamenerweiterung aus einem Dateinamen extrahieren

.Beschreibung
Es gibt zwei Möglichkeiten, wie man die Dateinamenerweiterung einer Datei herausfinden kann. Die eine Möglichkeit verwendet die Methode GetExtensionName aus der FileSystemObject-Objektbibliothek (siehe Codebeispiel #1), die andere kommt ganz ohne zusätzliche Bibliothek aus (siehe Codebeispiel #2). Bei beiden Lösungen muss die Datei nicht zwingend existieren, von der die Dateinamenerweiterung ermittelt werden soll.

.VBA-Code #1
Public Sub GetExtension1()
  MsgBox CreateObject("Scripting.FileSystemObject").GetExtensionName("C:\Daten\EineMappe.xls")
End Sub

.VBA-Code #2
Public Sub GetExtension2()
  Dim strExtension As String
  Dim intChar As Integer
  Dim strFile As String
  strFile = "C:\Daten\EineMappe.xls"
  For intChar = Len(strFile) To 1 Step -1
    If Mid$(strFile, intChar, 1) = "\" Then
      'Ein Backslash wurde erreicht, d.h. dass der Dateiname keinen Punkt enthält
      strExtension = ""
      Exit For
    ElseIf Mid$(strFile, intChar, 1) = "." Then
      'Der Punkt wurde gefunden
      strExtension = LCase$(Right$(strFile, Len(strFile) - intChar))
      Exit For
    End If
  Next intChar
  MsgBox strExtension

End Sub

Verwandte Codebeispiele

Dateiname in Pfad und Datei splitten

Datei aus einem Dateinamen extrahieren

Dateiname ohne Dateinamenerweiterung aus einem Dateinamen extrahieren

Pfad aus einem Dateinamen extrahieren

Laufwerksbuchstabe aus einem Dateinamen extrahieren

To Top


Dateiname ohne Dateinamenerweiterung aus einem Dateinamen extrahieren

.Beschreibung
Der einfachste Weg, den so genannten 'Base Name' einer Datei zu erhalten (Dateiname ohne Dateinamenerweiterung), ist die Verwendung der Methode ExtensionName aus der FileSystemObject-Objektbibliothek. Für die im Beispielcode angegebene Datei "C:\Daten\EineMappe.xls" liefert die Methode "EineMappe" zurück.

.VBA-Code
Public Sub GetFileBaseName()
  MsgBox CreateObject("Scripting.FileSystemObject").GetBaseName("C:\Daten\EineMappe.xls")
End Sub

.Hinweis
Die bei GetBaseName angegebene Datei muss nicht zwingend existieren.

Verwandte Codebeispiele

Dateiname in Pfad und Datei splitten

Datei aus einem Dateinamen extrahieren

Pfad aus einem Dateinamen extrahieren

Dateinamenerweiterung aus einem Dateinamen extrahieren

Laufwerksbuchstabe aus einem Dateinamen extrahieren

 

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Prüfen, ob eine Datei das BIFF-Format besitzt

.Beschreibung
Um allfällige Probleme beim Öffnen einer Exceldatei zu vermeiden, sollte man vor dem Öffnen überprüfen, ob die Datei tatsächlich eine gültige Exceldatei ist. Sprich, ob die Datei das BIFF-Format besitzt. Die Kontrolle der Dateinamenerweiterung ist zu unsicher, da diese beliebig vergeben werden kann. Beispielsweise kann man eine Word-Dokumentdatei "Brief.doc" in "Brief.xls" umbenennen; und schon verwendet sie als Dateityp "Microsoft Excel-Arbeitsmappe", obwohl die Datei nach wie vor ein Word-Dokument ist. Auf der anderen Seite kann man einem gültigen Microsoft Excel Add-In eine frei erfundene Dateinamenerweiterung wie beispielsweise 'xyz' vergeben.

Die hier vorgestellte Funktion verlässt sich nicht auf die Dateinamenerweiterung, sondern überprüft den internen und somit tatsächlich benutzten Dateityp einer Datei. Dazu wird die Dokument-Eigenschaft AppName der Dokumentdatei abgefragt, ob sie den Text "Microsoft Excel" enthält.

Benötigt wird eine von Microsoft Developer Support entwickelte DLL-Datei namens "dsofile.dll".

.VBA-Code
Public Function CheckBIFFFileFormat(ByVal strFile As String) As Boolean
  Dim oFilePropReader As DSOleFile.PropertyReader
  Dim oDocProp As DSOleFile.DocumentProperties
  If Dir(strFile) = "" Then
    MsgBox "Die Datei '" & strFile & "' existiert nicht!", vbExclamation
    CheckBIFFFileFormat = False
    Exit Function
  End If
  Set oFilePropReader = New DSOleFile.PropertyReader
  On Error Resume Next
  Set oDocProp = oFilePropReader.GetDocumentProperties(strFile)
  If Err.Number = &H80040203 Then
    'Die Datei ist momentan gesperrt
    Err.Clear
    CheckBIFFFileFormat = False
  ElseIf Err.Number = &H80040202 Then

    'Die Datei besitzt keine Document Properties
    Err.Clear
    CheckBIFFFileFormat = False
  ElseIf Err.Number <> 0 Then
    'Ein anderer Fehler ist aufgetreten

    Err.Clear
    CheckBIFFFileFormat = False
  Else
    If oDocProp.AppName = "Microsoft Excel" Then

      'Die zugeordnete Anwendung ist Microsoft Excel, also handelt es sich um
      'eine Dokumentdatei mit dem Excel-Dateiformat BIFF
.
      CheckBIFFFileFormat = True
    Else
      CheckBIFFFileFormat = False
    End If
  End If
  Set oDocProp = Nothing
  Set oFilePropReader = Nothing
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox "Excel-Dateiformat BIFF vorhanden: " & CheckBIFFFileFormat("C:\Daten\EineMappe.xls")
End Sub

Weitere Informationen

Excel-Dateiformat BIFF

 

Verwandte Codebeispiele

Prüfen, ob eine Datei das OLE Structured Format besitzt

To Top


BIFF-Formatversion einer Arbeitsmappendatei ermitteln

.Beschreibung
...

.VBA-Code
Public Sub GetBIFFFormatVersion()

End Sub

To Top


Datei umbenennen

.Beschreibung
Am einfachsten lässt sich eine Datei mit der Name-Anweisung von VBA umbenennen. Name unterstützt allerdings keine Platzhalterzeichen (? und *). Es kann daher mit dieser Anweisung immer nur eine einzelne Datei umbenannt werden.

.VBA-Code
Public Sub RenameFile()
  Name "C:\Dateien\AlteDatei.xls" As "C:\Dateien\NeueDatei.xls"

End Sub

.Hinweis
Nebenbei erwähnt war früher (mit dem alten DOS) das Umbenennen von mehreren Dateien kein Problem. So konnte man beispielsweise sämtlichen Word-Dokumenten in einem bestimmten Verzeichnis anhand des Befehls "REN *.doc *.bak" die Dateinamenerweiterung 'bak' zuweisen. Wie sich dies mit VBA aufrufen lässt, erfahren Sie unter Mehrere Dateien umbenennen.

Weitere Informationen

VBA-Befehle und -Funktionen

 

Verwandte Codebeispiele

Mehrere Dateien umbenennen

Datei kopieren

To Top


Mehrere Dateien umbenennen

.Beschreibung
Weil es mit der Name-Anweisung von VBA nicht möglich ist, mehrere Dateien umzubenennen, muss man einen anderen Weg suchen. Das Umbenennen ist nicht möglich, weil Name keine Platzhalterzeichen (? und *) unterstützt. Die hier vorgestellte Lösung ruft den so genannten Befehlsinterpreter von Windows auf (auch als "DOS-Fenster" oder "Konsole" bekannt) und setzt den REN-Befehl zum Umbenennen von Dateien ab.

Im ersten Beispiel werden alle Dateien mit der Dateinamenerweiterung "xls" in "bak" umbenannt, welche sich im Verzeichnis "C:\Daten" befinden. Das zweite Codebeispiel benennt alle Dateien, die mit "Mappe" und der Dateinamenerweiterung "xl" beginnen, in "Book*" um.

.VBA-Code #1
Public Sub RenameFiles1()
  ChDrive "C:"

  ChDir "C:\Daten"
  Shell "CMD /C REN *.xls *.bak"
End Sub

.VBA-Code #2
Public Sub RenameFiles2()
  ChDrive "C:"

  ChDir "C:\Daten"
  Shell "CMD /C REN Mappe*.xl* Book*.xl*"
End Sub

.Hinweis
Die obige Lösung mittels CMD ist die einzige bekannte Möglichkeit zum Umbenennen mehrerer Dateien.

Verwandte Codebeispiele

Datei umbenennen

Mehrere Dateien kopieren

To Top


Datei kopieren

.Beschreibung
Zum Kopieren einer Datei steht die FileCopy-Anweisung von VBA zur Verfügung (siehe Beispiel #1). Als Alternative können Sie die CopyFile-Methode des FileSystemObject-Objektes aus der FileSystemObject-Objektbibliothek einsetzen (Beispiel #2).

Interessant ist die in Beispiel #3 verwendete Copy-Methode des File-Objektes (FileSystemObject-Objektbibliothek). Diese besitzt einen Parameter namens OverWriteFiles, mit dem festgelegt werden kann, ob eine bereits vorhandene Datei im Zielordner überschrieben werden soll. Standardmässig steht der Parameter auf True, d.h. dass überschrieben wird. Wenn Sie den Parameter explizit auf False stellen, so können Sie anhand des Laufzeitfehlers 58 "Datei existiert bereits" herausfinden, ob die Datei kopiert wurde, oder eben wegen einer bereits vorhandenen Datei der Kopiervorgang nicht durchgeführt wurde.

.VBA-Code #1
Sub CopyFile1()
  FileCopy "C:\Dateien\EineMappe.xls", "C:\Kopien\EineMappe.xls"

End Sub

.VBA-Code #2
Sub CopyFile2()
  CreateObject("Scripting.FileSystemObject").CopyFile "C:\Dateien\EineMappe.xls", "C:\Kopien\EineMappe.xls"

End Sub

.VBA-Code #3
Sub CopyFile3()
  On Error Resume Next
  CreateObject("Scripting.FileSystemObject").GetFile("C:\Dateien\EineMappe.xls").Copy "C:\Kopien\EineMappe.xls", False
  If Err.Number = 58 Then
    MsgBox "Datei existiert bereits im Zielordner."
  End If

End Sub

.Hinweis
Bitte beachten Sie, dass...
- bei allen Lösungsvarianten immer die vollständigen Pfad- und Dateinamen angegeben werden müssen.
- bei keiner Variante Platzhalter (? und *) verwendet werden können.
- eine bereits im Zielordner vorhandene Datei automatisch überschrieben wird.
- je nach verwendeter Variante unterschiedliche Laufzeitfehler auftreten können. Fehler 75 "Fehler beim Zugriff auf Pfad/Datei". Fehler 70 "Zugriff verweigert".

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

VBA-Befehle und -Funktionen

 

Verwandte Codebeispiele

Datei verschieben

Mehrere Dateien kopieren

Ordner kopieren

Datenträger/Laufwerk kopieren

To Top


Mehrere Dateien kopieren

.Beschreibung
Anhand der CopyFile-Methode aus der FileSystemObject-Bibliothek können mehrere Dateien auf einen Schlag kopiert werden. Dies ist möglich, weil CopyFile die Platzhalterzeichen * und ? unterstützt. Zudem werden sowohl schreibgeschützte als auch versteckte Dateien anstandslos kopiert.

.VBA-Code
Sub CopyFiles()
  CreateObject("Scripting.FileSystemObject").CopyFile "D:\Daten\Sub1\SubY\*.*", "D:\Daten\empty"
End Sub

.Hinweis
Bitte beachten Sie, dass eine im Zielordner bereits vorhandene gleichnamige Datei automatisch überschrieben wird.

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

 

Verwandte Codebeispiele

Datei kopieren

Datenträger/Laufwerk kopieren

Mehrere Dateien verschieben

Datei verschieben

Ordner kopieren

To Top


Mehrere Dateien löschen

.Beschreibung
Das Löschen mehrerer Dateien gleichzeitig wird mit der Kill-Anweisung von VBA erledigt. Die Kill-Anweisung besitzt den grossen Vorteil, dass die beiden Platzhalterzeichen ? und * unterstützt werden (allerdings nur unter Windows, nicht aber auf Macintosh!). Bedenken Sie jedoch, dass dieser Vorteil eine gewisse Gefahr mit sich bringt, weil bei unsachgemässer Verwendung eines Platzhalters im schlimmsten Fall sehr viele, gar nicht zu Löschen beabsichtigte Dateien unwiderruflich gelöscht werden. Beispielsweise löscht die Anweisung "Kill *.*" sämtliche Dateien im Windows-Verzeichnis, sofern dieses gerade das aktuelle Verzeichnis ist (kann mit CurDir abgefragt werden). Die gelöschten Dateien werden nicht in den Windows-Papierkorb verschoben - und können somit nicht mehr zurückgeholt werden.

Bitte beachten Sie auch folgende Punkte:
- Wenn das Verzeichnis bereits leer ist oder nur noch versteckte Dateien enthält, kann Kill keine Löschung durchführen, was zum Laufzeitfehler 53 "Datei nicht gefunden" führt.
- Wenn das Verzeichnis eine schreibgeschützte Datei enthält, so erscheint der Laufzeitfehler 75 "Fehler beim Zugriff auf Pfad/Datei", weil die Datei nicht gelöscht werden kann. Die bis zum Auftreten des Fehlers bereits durchgeführten Löschungen werden nicht rückgängig gemacht.
- Wenn sich im Verzeichnis eine gesperrte Datei befindet, wird der Laufzeitfehler 70 "Zugriff verweigert" ausgegeben. Die bis zum Auftreten des Fehlers bereits durchgeführten Löschungen werden nicht rückgängig gemacht.
- Wenn der Pfad auf ein nicht bereites Laufwerk verweist, z.B. ein Diskettenlaufwerk ohne eingelegte Diskette, so tritt der Laufzeitfehler 71 "Datenträger nicht bereit" auf.

Wegen der hohen Anzahl möglicher Laufzeitfehler sollte im Zusammenhang mit Kill immer eine Fehlerbehandlungsroutine programmiert werden (On Error GoTo <ErrorHandler>).

.VBA-Code #1
Sub KillFiles1()
  Kill "C:\Dateien\Alt\*.*"   'Alle Dateien des Ordners löschen
End Sub

.VBA-Code #2
Sub KillFiles2()
  Kill "C:\Dateien\Alt\Monat*.xl?"  
'Dateien löschen, die mit "Monat" beginnen und die Erweiterung "xl" und ein beliebiges Zeichen besitzen
End Sub

.Hinweis
Statt Kill kann man auch die DeleteFile-Methode aus der FileSystemObject-Objektbibliothek verwenden.

Weitere Informationen

VBA-Befehle und -Funktionen

VBA-Spezialthema: FileSystemObject (FSO)

Phil's Office Secrets: Kompatibilität zwischen Excel für Windows und Excel für Macintosh: Kill-Anweisung

 

Verwandte Codebeispiele

Datei löschen

Inhalt einer Textdatei löschen

Dateien eines Ordners löschen

Dateien eines Ordners und allen Unterordnern löschen

Datenträger/Laufwerk löschen

Mehrere Dateien verschieben

Mehrere Dateien kopieren

Mehrere Dateien umbenennen

To Top


Dateien eines Ordners und allen Unterordnern löschen

.Beschreibung
Wenn man alle Dateien löschen möchte, die sich in einem Ordner und dessen Unterordnern befinden, so kommt man mit VBA nicht sehr weit. Das Problem ist nämlich, dass VBA keine Anweisung zum Löschen mehrerer Dateien bietet, mit der man die in Unterordnern gespeicherten Datenen löschen kann.

 

.VBA-Code
Sub KillFiles()
  Kill "C:\Dateien\Alt\*.*"   'Alle Dateien des Ordners löschen
End Sub

.Hinweis
Statt Kill kann man auch die DeleteFile-Methode aus der FileSystemObject-Objektbibliothek verwenden.

Weitere Informationen

VBA-Befehle und -Funktionen

 

Verwandte Codebeispiele

Datei löschen

Dateien eines Ordners löschen

Datenträger/Laufwerk löschen

Mehrere Dateien löschen

To Top


Dateien mit bestimmten Datei-Attributen löschen

.Beschreibung
Die folgenden Beispiele zeigen, wie man mehrere ...

Schalter 's': Unterverzeichnisse einbeziehen

Schalter 'q': Keine Rückfrage bei Benutzung von Platzhaltern

Schalter 'f': Auch schreibgeschützte Dateien löschen

Schalter 'a': Attribute (Argument 'h': Versteckte Dateien)

Codebeispiel #1: Versteckte Dateien im Ordner "C:\Dateien" und seinen Unterordnern löschen.

Codebeispiel #2: Nicht versteckte Dateien im Ordner "C:\Dateien" und seinen Unterordnern löschen und Löschprotokoll erstellen.

Informationen über alle verfügbaren Schalter von DEL erhalten Sie durch Eingabe von "DEL /?" im Konsolenfenster (DOS-Fenster).

 

.VBA-Code #1
Sub KillFiles1()
  ChDrive "C"
  ChDir "C:\Dateien"
  Shell "CMD /C DEL /S /Q /F /A:H *.*"
End Sub

.VBA-Code #2
Sub KillFiles2()
  ChDrive "C"
  ChDir "C:\Dateien"
  Shell "CMD /C DEL /S /Q /F *.* >C:\KillLog.txt"

End Sub

Weitere Informationen

VBA-Befehle und -Funktionen

 

Verwandte Codebeispiele

Datei löschen

Inhalt einer Textdatei löschen

Dateien eines Ordners löschen

Dateien eines Ordners und allen Unterordnern löschen

Datenträger/Laufwerk löschen

Mehrere Dateien verschieben

Mehrere Dateien kopieren

Mehrere Dateien umbenennen

To Top


Gekürzte Fassung eines langen Dateinamens für Anzeige erstellen

.Beschreibung
Lange Dateinamen besitzen den Nachteil, dass sie eben halt sehr lang sein können. Dies ist insofern ein Nachteil, weil die Anzeige eines sehr langen Namens erheblich Platz auf dem Bildschirm beansprucht. Insbesondere für Dialogfenster und MRU-Befehle im Datei-Menü (Liste der zuletzt verwendeten Dateien) ist dies ungünstig, da entweder nicht der gesamte Dateiname angezeigt werden kann oder dann seine Länge das Menü erheblich verbreitert. Was damit gemeint ist, zeigt ein kleines Beispiel:

Beispiel
In der Liste der zuletzt verwendeten Dateien steht die Datei "D:\Programme\Seagate Software\Crystal Reports\Samples\Reports\General Business\World Sales Report - Version 80.rpt". Der Dateiname ist 114 Zeichen lang und führt zu einem breiten Menü, was optisch nicht sehr schön aussieht.

MRU-Dateiliste mit ungekürzten Dateinamen
Abbildung: Menü "Datei" mit ungekürzten Dateinamen

Die gekürzte Fassung des Dateinamens dagegen verbreitert das Menü nicht mehr so stark. Der angezeigte Dateiname ist nur noch 71 Zeichen lang.

MRU-Dateiliste mit gekürzten Dateinamen
Abbildung: Menü "Datei" mit gekürzten Dateinamen

Wie gut zu sehen ist, sieht die zweite Variante (mit den gekürzten Namen) optisch besser aus. Für den Benutzer ist immer noch erkennbar, um welche Datei es sich handelt, obwohl nicht mehr der gesamte Pfad angezeigt wird. Gesucht wird daher eine VBA-Coderoutine, mit der man eine solche Kürzung für beliebige Dateinamen durchführen kann, wobei nur Dateinamen mit einer bestimmten Länge gekürzt werden sollen.

MRU-Dateiliste von Microsoft Word
Auch die Microsoft Office-Programme verwenden gekürzte Fassungen von Dateinamen.

MRU-Dateiliste von Microsoft Word 97
Abbildung: MRU-Dateiliste von Microsoft Word

 

MRU-Dateiliste von Crystal Reports

MRU-Dateiliste von Crystal Reports 8.0
Abbildung: MRU-Dateiliste von Crystal Reports

Die unten vorgestellte VBA-Funktion kürzt Dateinamen nach folgenden Regeln:
- Der Dateiname wird gekürzt, wenn er mehr als x Zeichen lang ist. Anderenfalls findet keine Kürzung statt.
- Gekürzt wird, indem ein im Pfad enthaltener Verzeichnisname durch drei Punkte ('...') ersetzt wird.
- Mit der Kürzung wird beim Anfang des Dateinamens gestartet.
- Wenn der gekürzte Name immer noch zu lang ist, wird er ein weiteres Mal gekürzt.
- Es wird so lange gekürzt, bis der Dateiname weniger als x Zeichen lang ist.
- Nach durchgeführter Kürzung wird der Laufwerkbuchstabe dem gekürzten Dateinamen vorangestellt.

Ohne Kürzung:
C:\Persönliche Daten\Microsoft Excel\Wasserwerke Zürich\Buchhaltung intern\Statistikzahlen Dezember 2004.xls

Kürzung auf maximal 50 Zeichen:
C:\...\Statistikzahlen Dezember 2004.xls

Kürzung auf maximal 70 Zeichen:
C:\...\Buchhaltung intern\Statistikzahlen Dezember 2004.xls

 

» Mit der Konstante MaxLen wird festgelegt, auf welche Länge der Dateiname gekürzt werden soll. Zu empfehlen ist ein Wert grösser als 50 (im Codebeispiel wird 70 verwendet).

» Es kann der Funktion auch eine Datei übergeben werden, die nicht physisch auf der Festplatte vorhanden ist.

 

.VBA-Code
Public Function CompressFilename(ByVal strFile As String) As String
  Dim intChar As Integer         'Zähler für Dateiname-Zeichen
  Dim intBackslash As Integer   
'Zähler für gefundene Backslash-Zeichen
  Dim strFileSmall As String    
'Gekürzter Dateiname
  Const MaxLen As Integer = 70  
'Maximale Länge des gekürzten Dateinamens
  strFileSmall = strFile
  Do
    If Len(strFileSmall) > MaxLen Then
      intBackslash = 0
      For intChar = 1 To Len(strFileSmall)
        If Mid$(strFileSmall, intChar, 1) = "\" Then
          intBackslash = intBackslash + 1
          If intBackslash = 2 Then
            strFileSmall = "...\" & Mid$(strFileSmall, intChar + 1)
            Exit For
          End If
        End If
      Next intChar
      If intChar > Len(strFileSmall) Then Exit Do
    Else
      Exit Do
    End If
  Loop

  If Left$(strFileSmall, 4) = "...\" Then
    strFileSmall = Left$(strFile, 3) & strFileSmall
  End If

  CompressFilename = strFileSmall
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox CompressFilename("C:\Persönliche Daten\Microsoft Excel\Wasserwerke Zürich\Buchhaltung intern\Statistikzahlen Dezember 2004.xls")
End Sub

To Top


Formatvorlagen in einer Arbeitsmappe zusammenführen

.Beschreibung
Mit Merge können die in einer anderen Arbeitsmappe enthaltenen Formatvorlagen mit denjenigen der aktiven Arbeitsmappe zusammengeführt werden. Die andere Arbeitsmappe muss dazu in Excel geöffnet sein. Das Zusammenführen ist auch über die Benutzeroberfläche von Microsoft Excel möglich. Die entsprechende Funktionalität wird über Menü Format/Formatvorlage, Schaltfläche "Zusammenführen" aufgerufen. Wenn die aktive Arbeitsmappe bereits eine gleichnamige Formatvorlage enthält, erscheint die Rückfragemeldung "Formatvorlagen mit gleichen Namen zusammenführen?".

.VBA-Code
Public Sub MergeStyles()
  ActiveWorkbook.Styles.Merge Workbook:=Workbooks("AndereMappe.xls")
End Sub

To Top


Textdatei anlegen

.Beschreibung
Eine neue Textdatei wird angelegt, indem ein Dateizugriff anhand Open mit dem Zugriffsmodus For Output durchgeführt wird. Beachten Sie bitte, dass die Datei bereits bei Ausführen des Open-Befehls erstellt wird, und nicht erst bei Schliessen der Datei mit Close.

Eine weitere Möglichkeit stellt die CreateTextfile-Methode aus der FileSystemObject-Bibliothek dar (siehe Codebeispiel #2 und #3). Es wird ebenfalls eine Textdatei angelegt, wobei die CreateTextfile-Lösung gegenüber Open einen Vorteil bietet: Anhand des Parameters Overwrite kann festgelegt werden, ob die Datei nur dann erstellt werden soll, wenn sich im Ordner noch keine gleichnamige Datei befindet. Defaultmässig steht Overwrite auf True, was bedeutet, dass eine bereits existierende Datei überschrieben wird. Wenn Sie den Parameter explizit auf False stellen und es existiert bereits eine gleichnamige Datei, so erscheint der Laufzeitfehler 58 "Datei existiert bereits" (siehe Codebeispiel #4).

.VBA-Code #1
Public Sub CreateTextfile1()
  Open "C:\Daten\Textdatei.txt" For Output As #1
  Close #1
End Sub

.VBA-Code #2
Public Sub CreateTextfile2()
  Dim fsoObject As Object
  Dim fsoFolder As Object
  Set fsoObject = CreateObject("Scripting.FileSystemObject")
  Set fsoFolder = fsoObject.GetFolder("C:\Daten")
  fsoFolder.CreateTextfile "Textdatei.txt"
  Set fsoFolder = Nothing
  Set fsoObject = Nothing
End Sub

.VBA-Code #3
Public Sub CreateTextfile3()
  CreateObject("Scripting.FileSystemObject").CreateTextfile "C:\Daten\Textdatei.txt"
End Sub

.VBA-Code #4
Public Sub CreateTextfile4()
  CreateObject("Scripting.FileSystemObject").CreateTextfile "C:\Daten\Textdatei.txt", False
End Sub

Tipp! Tipp!
Wenn Sie eine Textdatei erstellen möchten, um in ihr irgendwelche Daten Ihres Programmes zwischenzuspeichern, können Sie eine "echte" temporäre Datei im offiziellen Temp-Verzeichnis von Windows anlegen. Wie das gemacht wird, zeigt das Codebeispiel Temporäre Datei im Temp-Verzeichnis erstellen.

Weitere Informationen

VBA-Befehle und -Funktionen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Inhalt einer Textdatei löschen

.Beschreibung
Der Inhalt einer Textdatei kann sehr einfach geleert werden. Beachten Sie bitte, dass die Datei bereits bei Ausführen des Open-Befehls geleert wird, und nicht erst bei Schliessen mittels Close.

.VBA-Code
Public Sub ClearTextfile()
  Open "C:\Daten\Textdatei.txt" For Output As #1
  Close #1
End Sub

.Hinweis
Bitte beachten Sie folgende Punkte:
- Der obige VBA-Code löscht den Dateiinhalt sofort und unwiderruflich. Kontrollieren Sie daher, ob der angegebene Dateiname wirklich korrekt ist. Erstellen Sie bei Bedarf zuerst eine Sicherungskopie der zu leerenden Datei.
- Wenn die Datei schreibgeschützt ist, erscheint der Laufzeitfehler 75 "Fehler beim Zugriff auf Pfad/Datei".
- Der Laufzeitfehler 75 "Fehler beim Zugriff auf Pfad/Datei" erscheint ebenfalls, wenn die Datei versteckt ist.
- Bei einer exklusiv geöffneten Datei tritt der Laufzeitfehler 70 "Zugriff verweigert" auf.
- Wenn die angegebene Datei nicht existiert, wird automatisch eine neue Datei angelegt.

Weitere Informationen

VBA-Befehle und -Funktionen

To Top


Datei-Verknüpfung auf dem Windows Desktop erstellen

.Beschreibung
Das Erstellen einer Datei-Verknüpfung auf dem Windows Desktop ist problemlos möglich. Dazu benötigt man lediglich die CreateShortcut-Methode des Shell-Objektes aus der Windows Script Host-Bibliothek.

Die Prozedur AddLinkOnDesktop legt die neue Verknüpfungsdatei (Dateinamenerweiterung "lnk") an. In dieser Prozedur wird die Funktion GetDesktopFolder aufgerufen, welche den Pfad des Windows Desktop ermittelt. Die im Beispiel erstellte Verknüpfung heisst "EineMappe.lnk".

.VBA-Code
'Deklarationsbereich
Public Type DummyStruct
  cb As Long
  id As Long
End Type
Public Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, _

   ByVal lpBuffer As String) As Long
Public Declare Function SHGetSpecialFolderLocation2lng Lib "shell32.dll" _

   Alias "SHGetSpecialFolderLocation" (ByVal hwndOwner As Long, ByVal nFolder As Long, _
   pidl As DummyStruct) As Long

'Codemodul
Public Function GetDesktopFolder() As String
  Dim strPath As String
  Dim udtDummy As DummyStruct
  SHGetSpecialFolderLocation2lng 0&, &H10, udtDummy
  strPath = String(260, 0)
  SHGetPathFromIDList ByVal udtDummy.cb, ByVal strPath
  GetDesktopFolder = Left$(strPath, InStr(strPath, Chr$(0)) - 1)
End Function

Public Sub AddLinkOnDesktop()
  Dim strDesktopFolder As String
  Dim objWSHShell As Object
  Dim objWSHShortcut As Object
  strDesktopFolder = GetDesktopFolder()
  Set objWSHShell = CreateObject("WScript.Shell")
  Set objWSHShortcut = objWSHShell.CreateShortcut(strDesktopFolder & "\EineMappe.lnk")
  With objWSHShortcut
    .TargetPath = "C:\Daten\EineMappe.xls"
    .Description = "Verknüpfung mit EineMappe.xls"
    .WorkingDirectory = "C:\Daten"
    .WindowStyle = 1     '1 = Normale Fenstergrösse
    .Save
  End With
  Set objWSHShortcut = Nothing
  Set objWSHShell = Nothing
End Sub

Weitere Informationen

VBA-Spezialthema: Windows Script Host (WSH)

 

Verwandte Codebeispiele

Ordner-Verknüpfung erstellen

Pfad eines Spezialordners ermitteln

Spezialordner auflisten

Spezialordner mit Pfad auflisten

To Top


Pfad eines Spezialordners ermitteln

.Beschreibung
Es existieren zwei gebräuchliche Lösungsvarianten, wie man den Pfad eines Spezialordners herausfinden kann. Die einfachere der beiden Varianten benutzt die Windows Script Host-Objektbibliothek, genauer gesagt die SpecialFolders-Auflistung des Shell-Objektes. Die andere Lösung verwendet zwei Windows API-Funktionen, was ein bisschen aufwändiger ist. Dafür wird keine zusätzliche Bibliothek benötigt.

» Das Codebeispiel #1 stellt die Lösung mit zwei Windows API-Funktionen vor. Im Deklarationsbereich des VBA-Codes werden 31 Konstanten deklariert, die einen Spezialordner repräsentieren (z.B. CSIDL_DESKTOPDIRECTORY oder CSIDL_SENDTO). Mit dieser Lösung können somit 31 verschiedene Spezialordner-Pfade ermittelt werden.

Konstante Spezialordner
CSIDL_COMMON_APPDATA Anwendungsdaten (Alle User)
CSIDL_COMMON_DOCUMENTS Dokumente (Alle User)
CSIDL_COMMON_FAVORITES Favoriten (Alle User)
CSIDL_COMMON_TEMPLATES Vorlagen (Alle User)
CSIDL_COMMON_DESKTOPDIRECTORY Desktop (Alle User)
CSIDL_COMMON_STARTMENU Startmenü (Alle User)
CSIDL_COMMON_STARTUP Autostart (Alle User)
CSIDL_CONTROLS Controls
CSIDL_COOKIES Cookies
CSIDL_DESKTOPDIRECTORY Desktop
CSIDL_DRIVES Laufwerke
CSIDL_FAVORITES Favoriten
CSIDL_FONTS Schriften
CSIDL_HISTORY History
CSIDL_INTERNET Internet
CSIDL_INTERNET_CACHE Temporary Internet Files
CSIDL_MYPICTURES Eigene Bilder
CSIDL_NETHOOD Netzwerkumgebung
CSIDL_PERSONAL Eigene Dateien
CSIDL_PRINTERS Drucker
CSIDL_PRINTHOOD Druckumgebung
CSIDL_PROFILE Profile
CSIDL_PROGRAM_FILES (Unbekannt)
CSIDL_PROGRAM_FILES_COMMON (Unbekannt)
CSIDL_PROGRAM_FILES_COMMONX86 (Unbekannt)
CSIDL_PROGRAM_FILESX86 (Unbekannt)
CSIDL_PROGRAMS Programme (im Startmenü)
CSIDL_RECENT Recent
CSIDL_SENDTO SendTo
CSIDL_STARTMENU Startmenü
CSIDL_STARTUP Autostart

» In den beiden Codebeispielen #2 und #3 wird das SpecialFolders-Objekt aus der Windows Script Host-Bibliothek benutzt. Das Beispiel #3 stellt eine gekürzte Variante des Codebeispiels #2 dar. Laut der Dokumentation der Windows Script Host-Bibliothek stehen 16 verschiedene Bezeichner zur Verfügung, die einen Spezialordner darstellen (z.B. "Desktop" oder "SendTo"). Allerdings enthält das SpecialFolders-Auflistungsobjekt mehr als 16 Elemente. Wie man mittels Abfrage von UBound unschwer erkennen kann, befinden sich 18 oder mehr Elemente in der Auflistung (0 bis 17, weil der Index nullbasiert ist). Es existieren somit Spezialordner-Pfade, die nicht anhand eines Bezeichners abgefragt werden können (Anmerkung des Autors: Welche das sind, ist leider nicht bekannt).

Die verfügbaren SpecialFolders-Bezeichner lauten wie folgt (Gross-/Kleinschreibung spielt keine Rolle):
- AllUsersDesktop
- AllUsersStartMenu
- AllUsersPrograms
- AllUsersStartup
- Desktop
- Favorites
- Fonts
- MyDocuments
- NetHood
- PrintHood
- Programs
- Recent
- SendTo
- StartMenu
- Startup
- Templates

Wenn Sie einen anderen Bezeichner verwenden bzw. den Bezeichner falsch schreiben, dann wird kein Fehler ausgegeben sondern einfach nichts zurückgegeben.

.VBA-Code #1
'Deklarationsbereich
Public Type DummyStruct
  cb As Long
  id As Long
End Type
Public Const MAX_PATH_LEN = 260
Public Const CSIDL_COMMON_APPDATA = &H23
Public Const CSIDL_COMMON_DOCUMENTS = &H2E
Public Const CSIDL_COMMON_FAVORITES = &H1F
Public Const CSIDL_COMMON_TEMPLATES = &H2D
Public Const CSIDL_COMMON_DESKTOPDIRECTORY = &H19
Public Const CSIDL_COMMON_STARTMENU = &H16
Public Const CSIDL_COMMON_STARTUP = &H18
Public Const CSIDL_CONTROLS = &H3
Public Const CSIDL_COOKIES = &H21
Public Const CSIDL_DESKTOPDIRECTORY = &H10
Public Const CSIDL_DRIVES = &H11
Public Const CSIDL_FAVORITES = &H6
Public Const CSIDL_FONTS = &H14
Public Const CSIDL_HISTORY = &H22
Public Const CSIDL_INTERNET = &H1
Public Const CSIDL_INTERNET_CACHE = &H20
Public Const CSIDL_MYPICTURES = &H27
Public Const CSIDL_NETHOOD = &H13
Public Const CSIDL_PERSONAL = &H5
Public Const CSIDL_PRINTERS = &H4
Public Const CSIDL_PRINTHOOD = &H1B
Public Const CSIDL_PROFILE = &H28
Public Const CSIDL_PROGRAM_FILES = &H26
Public Const CSIDL_PROGRAM_FILES_COMMON = &H2B
Public Const CSIDL_PROGRAM_FILES_COMMONX86 = &H2C
Public Const CSIDL_PROGRAM_FILESX86 = &H2A
Public Const CSIDL_PROGRAMS = &H2
Public Const CSIDL_RECENT = &H8
Public Const CSIDL_SENDTO = &H9
Public Const CSIDL_STARTMENU = &HB
Public Const CSIDL_STARTUP = &H7
Public Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, _

   ByVal lpBuffer As String) As Long
Public Declare Function SHGetSpecialFolderLocation2lng Lib "shell32.dll" _

   Alias "SHGetSpecialFolderLocation" (ByVal hwndOwner As Long, ByVal nFolder As Long, _
   pidl As DummyStruct) As Long

'Codemodul
Public Function GetSpecialFolder(lFolder As Long) As String
  Dim strPath As String
  Dim udtDummy As DummyStruct

  SHGetSpecialFolderLocation2lng 0&, lFolder, udtDummy
  strPath = String(MAX_PATH_LEN, 0)
  SHGetPathFromIDList ByVal udtDummy.cb, ByVal strPath
  GetSpecialFolder = Left$(strPath, InStr(strPath, Chr$(0)) - 1)
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox GetSpecialFolder(CSIDL_PERSONAL)   'Ordner "Eigene Dateien"
End Sub

.VBA-Code #2
Public Sub GetSpecialFolder1()
  Dim objFolders As Object
  Set objFolders = CreateObject("WScript.Shell").SpecialFolders
  'Beispiele von SpecialFolders-Bezeichnern

  MsgBox objFolders("sendto")
  MsgBox objFolders("startmenu")
  MsgBox objFolders("recent")
  MsgBox objFolders("favorites")
  MsgBox objFolders("desktop")
  MsgBox objFolders("allusersdesktop")

  Set objFolders = Nothing
End Sub

.VBA-Code #3
Public Sub GetSpecialFolder2()
  MsgBox CreateObject("WScript.Shell").SpecialFolders("desktop")
End Sub

Verwandte Codebeispiele

Spezialordner auflisten

Spezialordner mit Pfad auflisten

Pfad des Windows Desktops ermitteln

Pfad des Favoriten-Ordners ermitteln

Pfad des Autostart-Ordners ermitteln

Pfad des Eigene Dateien-Ordners ermitteln

 

Weitere Informationen

VBA-Spezialthema: Windows Script Host (WSH)

To Top


Grösse eines Laufwerks abfragen

.Beschreibung
Üblicherweise wird die Grösse eines Laufwerkes, d.h. ihr gesamter Speicherplatz, mittels TotalSize-Eigenschaft des Drive-Objektes abgefragt. Es gibt jedoch eine weitere Methode zum Ermitteln einer Laufwerkgrösse. Die Size-Eigenschaft des Folder-Objektes liefert das gleiche Ergebnis wie TotalSize. Als Verzeichnisname muss man hier den Laufwerksbuchstaben inklusive Backslash-Zeichen ('\') angeben, also beispielsweise "C:\". Wenn Sie das Backslash-Zeichen weglassen, sprich nur "C:" schreiben, so wird der Speicherplatz des gerade aktuellen Verzeichnisses ausgegeben (das aktuelle Verzeichnis kann mit der CurDir-Funktion von VBA herausgefunden werden).

.VBA-Code
Public Sub GetDriveSize()
  MsgBox CreateObject("Scripting.FileSystemObject").GetFolder("C:\").Size
End Sub

.Hinweis
Beachten Sie unbedingt, dass die Abfrage von Size je nach Grösse des Laufwerkes beträchtlich lange dauern kann. Ebenfalls einen Einfluss hat die Geschwindigkeit der Festplatte (bzw. des Datenträgers). Bei einer fast vollständig gefüllten 3.75 GB-Festplatte mit ca. 1'800 Ordnern und 27'000 Dateien dauert es rund 1.5 Minuten, bis die Grösse ermittelt ist.

Bitte beachten Sie zudem, dass wenn der Benutzer auf irgend einen Ordner des Laufwerkes keinen Zugriff hat, sofort der Laufzeitfehler 70 "Zugriff verweigert" auftritt. Dies ist der Fall, wenn der Benutzer für ein Verzeichnis die Berechtigung "Lesen" nicht besitzt.

Verwandte Codebeispiele

Gesamter Speicherplatz eines Laufwerkes abfragen

Freier Speicherplatz eines Laufwerkes abfragen

Verfügbarer Speicherplatz eines Laufwerkes abfragen

Belegter Speicherplatz eines Laufwerkes abfragen

Grösse eines Ordners abfragen

To Top


Laufwerke mit Laufwerk-Eigenschaften auflisten

.Beschreibung
Diese VBA-Prozedur zeigt, wie alle Laufwerke mit ihren Eigenschaften auf dem aktiven Arbeitsblatt der Arbeitsmappe aufgelistet werden.

Bitte beachten Sie, dass allfällig vorhandene Daten in den Zellen des aktiven Arbeitsblattes überschrieben werden.

.VBA-Code
Public Sub ListDrives()
  Dim fsoObject As Object
  Dim fsoDrive As Object
  Dim intRow As Integer
  On Error Resume Next
  intRow = 1
  Set fsoObject = CreateObject("Scripting.FileSystemObject")
  Range("A1:K1").Value = Array("Nr.", "Laufwerk", "Bezeichnung", "Typ", "Freigabename", _

     "Dateisystem", "Seriennummer", "Gesamter Speicher", "Freier Speicher", _
     "Verfügbarer Speicher", "Belegter Speicher")
  Range("A1:K1").Font.Bold = True
  For Each fsoDrive In fsoObject.Drives
    intRow = intRow + 1
    Cells(intRow, 1).Value = intRow - 1
    Cells(intRow, 2).Value = fsoDrive.DriveLetter & ":"
    Cells(intRow, 3).Value = fsoDrive.VolumeName
    Cells(intRow, 4).Value = fsoDrive.DriveType
    Cells(intRow, 5).Value = fsoDrive.ShareName
    Cells(intRow, 6).Value = fsoDrive.FileSystem
    Cells(intRow, 7).Value = fsoDrive.SerialNumber
    Cells(intRow, 8).Value = fsoDrive.TotalSize
    Cells(intRow, 8).NumberFormat = "#,##0"
    Cells(intRow, 9).Value = fsoDrive.FreeSpace
    Cells(intRow, 9).NumberFormat = "#,##0"
    Cells(intRow, 10).Value = fsoDrive.AvailableSpace
    Cells(intRow, 10).NumberFormat = "#,##0"
    Cells(intRow, 11).Value = fsoDrive.TotalSize - fsoDrive.FreeSpace
    Cells(intRow, 11).NumberFormat = "#,##0"
  Next
  Range("A1:K1").Columns.AutoFit
  Set fsoDrive = Nothing
  Set fsoObject = Nothing
End Sub

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Makro einer anderen Arbeitsmappe starten

.Beschreibung
Zum Ausführen eines Makros, das sich in einer anderen Arbeitsmappe befindet, benutzt man die Run-Methode des Application-Objektes. Der Aufruf ist sehr einfach: Man muss lediglich den Datei- und Makronamen des auszuführenden Makros angeben.

Laufzeitfehler 1004 "<Datei> wurde nicht gefunden. [...]"

Laufzeitfehler 1004 "Microsoft Excel kann das Makro <Datei>!<Makro> nicht finden."

Laufzeitfehler 450 "Falsche Anzahl an Argumenten oder ungültige Eigenschaftszuweisung."

 

.VBA-Code #1
Public Sub RunMacro1()
  Application.Run "AndereMappe.xls!Makroprozedur"
End Sub

.VBA-Code #2
Public Sub RunMacro2()
  Application.Run "AndereMappe.xls!Makroprozedur", "Januar", 5
End Sub

.VBA-Code #3
Public Sub RunMacro3()
  Application.Run "C:\Daten\AndereMappe.xls!Makroprozedur"
End Sub

.Hinweis
Bitte beachten Sie, dass nach Run unbedingt ein Datei- bzw. Makroname angegeben werden muss. Wenn Sie nur

  Application.Run

schreiben und dann ausführen, stürzt Microsoft Excel (Version 97) sofort ab. Excel reagiert auch in ähnlichen Situationen häufig mit einem Absturz, beispielsweise wenn die Run-Syntax "<Datei>!<Makro>" nicht korrekt beachtet wurde. Es ist daher zu empfehlen, vor dem Ausführen der Run-Methode die Arbeitsmappe zu speichern.

Weitere Informationen

VBA-Spezialthema: Excel-Objektmodell

To Top


Prozess abschiessen (Anwendungs- und Systemprozess)

.Beschreibung
Das Abschiessen eines Windows-Prozesses ist mit reinem VBA nicht möglich. Auch Excel-VBA kennt keine derartige Möglichkeit. Daher muss man sich eines Utilities namens "Kill.exe" bedienen, welches zwar zum Lieferumfang von Windows gehört, aber nicht automatisch bei der Windows-Installation auf die Festplatte kopiert wird. Es muss somit nachträglich von der Windows-CD in das Windows-Verzeichnis kopiert werden.

Eine ausführliche Beschreibung von Kill.exe mit vielen Beispielen finden Sie unter Fragen und Antworten: Kann man mit VBA einen Systemprozess abschiessen?.

Nachfolgend sechs kleine Beispiele, die grob zeigen sollen, was das Kill-Utility kann:
» Beispiel #1: Prozess anhand Prozessname abschiessen
» Beispiel #2: Prozess anhand Prozess-ID abschiessen
» Beispiel #3: Prozess anhand Prozessname abschiessen (mit Force-Parameter)
» Beispiel #4: Prozess anhand Anwendungsfenstertitel abschiessen
» Beispiel #5: Prozess anhand Anwendungsfenstertitel abschiessen (mit Mustervergleich)
» Beispiel #6: Prozess anhand Prozess-ID abschiessen und Rückmeldung in Textdatei schreiben

.VBA-Code #1
Public Sub KillProcess1()
  Shell "Kill.exe TAPISRV.EXE"
End Sub

.VBA-Code #2
Public Sub KillProcess2()
  Shell "Kill.exe 202"
End Sub

.VBA-Code #3
Public Sub KillProcess3()
  Shell "Kill.exe -f EXCEL.EXE"
End Sub

.VBA-Code #4
Public Sub KillProcess4()
  Shell "Kill.exe Microsoft Excel - MeineMappe.xls"
End Sub

.VBA-Code #5
Public Sub KillProcess5()
  Shell "Kill.exe Microsoft Word*"
End Sub

.VBA-Code #6
Public Sub KillProcess6()
  Shell "Command.com /c Kill.exe 202 >C:\KillLog.txt"
End Sub

.Hinweis
Beachten Sie bitte, dass mit Kill.exe ein Prozess sofort und ohne Sicherheitsrückfrage beendet wird. Wenn Sie beispielsweise den Prozess der Anwendung Microsoft Excel beenden, wird das Anwendungsfenster mit allen Arbeitsmappen ohne Speichern von allfälligen Änderungen einfach geschlossen.

Weitere Informationen

Fragen und Antworten: Kann man mit VBA einen Systemprozess abschiessen?

 

Verwandte Codebeispiele

Andere Anwendung beenden

To Top


Mehrere Dateien verschieben

.Beschreibung
Das Verschieben von mehreren Dateien in einem Arbeitsschritt ist nicht möglich - und zwar weder mit VBA, den Möglichkeiten der FileSystemObject-Bibliothek noch mit der API-Funktion MoveFile von Windows. Eine einzelne Datei wird dagegen gewöhnlich mit der Name-Anweisung von VBA verschoben.

Die als Codebeispiel #1 angegebene VBA-Prozedur zeigt, wie mehrere Dateien anhand einer Programmschleife verschoben werden. Als Beispiel werden alle xls-Dateien, die mit "Monat-" beginnen, aus dem Verzeichnis "C:\Daten" in das Unterverzeichnis "C:\Daten\Backup" verschoben.

Das Codebeispiel #2 zeigt eine andere Lösung, welche die MoveFile-Methode aus der FileSystemObject-Bibliothek verwendet. Mit dieser Methode lassen sich mehrere Dateien gleichzeitig verschieben, wobei die Platzhalterzeichen * und ? erlaubt sind. Das Verschieben von versteckten oder schreibgeschützten Dateien ist kein Problem.

.VBA-Code #1
Public Sub MoveFiles1()
  Dim intFile As Integer
  Dim astrFiles() As String
  Dim strFile As String
  Dim strSourcePath As String
  Dim strDestinationPath As String
  strSourcePath = "C:\Daten\"
  strDestinationPath = "C:\Daten\Backup\"
  strFile = Dir(strSourcePath & "Monat-*.xls")
  Do While strFile <> ""
    intFile = intFile + 1
    ReDim Preserve astrFiles(1 To intFile)
    astrFiles(intFile) = strFile
    strFile = Dir()
  Loop
  On Error Resume Next
  For intFile = 1 To UBound(astrFiles)
    Name strSourcePath & astrFiles(intFile) As strDestinationPath & astrFiles(intFile)
    If Err.Number <> 0 Then
      MsgBox "Fehler beim Verschieben der Datei " & astrFiles(intFile) & ": " & Err.Description & "!"
      Err.Clear
    End If
  Next intFile
End Sub

In obiger VBA-Prozedur werden die Dateien mit der VBA-Anweisung Name verschoben. Statt Name können Sie auch die Move-Methode des File-Objektes aus der FileSystemObject-Objektbibliothek verwenden. Dazu muss lediglich die bisherige Codezeile

  Name strSourcePath & astrFiles(intFile) As strDestinationPath & astrFiles(intFile)

durch die Codezeile

  CreateObject("Scripting.FileSystemObject").GetFile(strSourcePath & astrFiles(intFile)).Move strDestinationPath & astrFiles(intFile)

ersetzt werden. Wesentliche Vorteile gegenüber Name bietet Move allerdings keine.

.VBA-Code #2
Public Sub MoveFiles2()
  CreateObject("Scripting.FileSystemObject").MoveFile "C:\Daten\Monat-*.xls", "C:\Daten\Backup"

End Sub

.Hinweis
Wenn sich im Zielverzeichnis bereits eine gleichnamige Datei befindet, dann erscheint der Laufzeitfehler 58 "Datei existiert bereits". Weder Name, Move noch MoveFile besitzen eine Möglichkeit, das automatische Überschreiben einer vorhandenen Datei zu erzwingen. Eine bereits existierende Datei muss vorgängig mit der Kill-Anweisung von VBA gelöscht werden.

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

VBA-Befehle und -Funktionen

 

Verwandte Codebeispiele

Datei verschieben

Mehrere Dateien kopieren

Datenträger/Laufwerk kopieren

Mehrere Dateien umbenennen

Mehrere Dateien löschen

To Top


Makro eines Dokumentes einer anderen Office-Anwendung starten

.Beschreibung
Im Gegensatz zum Ausführen eines Makros, das sich in einer anderen Excel-Arbeitsmappe befindet, kann man hier nicht die Run-Methode des Application-Objektes verwenden. Mit Run können nur Makros von Dokumenten ausgeführt werden, die in der gleichen Anwendung bzw. Anwendungsinstanz geöffnet sind. Wenn man jedoch ein Makro starten möchte, das sich in einem Dokument einer anderen Anwendung befindet (beispielsweise in einer Microsoft PowerPoint-Präsentation), so muss man ein kleines VBA-Programm schreiben, welches die andere Anwendung mittels Office Automation fernsteuert.

Dieses Codebeispiel zeigt, wie aus Microsoft Excel heraus - genauer gesagt aus einem Excel VBA-Programm heraus - ein PowerPoint-Makro ausgeführt wird. Das Makro heisst "EinMakro" und befindet sich in der Präsentationsdatei "EinePräsentation.ppt". Wie gut zu erkennen ist, wird die Anwendung Microsoft PowerPoint als neue Instanz gestartet und sichtbar gemacht, die Präsentation "EinePräsentation.ppt" geöffnet, das Makro "EinMakro" ausgeführt und schliesslich die Anwendung beendet.

.VBA-Code
Public Sub ExecutePowerPointMacro()
  Dim pptApplication As PowerPoint.Application
  Set pptApplication = New PowerPoint.Application
  pptApplication.Visible = msoTrue
  pptApplication.Presentations.Open "C:\Daten\EinePräsentation.ppt"
  pptApplication.Run "EinePräsentation!EinMakro"
  pptApplication.Quit
  Set pptApplication = Nothing
End Sub

.Hinweis
Damit die obige Prozedur ausgeführt werden kann, muss im VBA-Projekt der Verweis auf die PowerPoint-Objektbibliothek vorhanden sein (bei Office 97: "Microsoft PowerPoint 8.0 Object Library", Datei "msppt8.olb").

To Top


Datenträger/Laufwerk löschen

.Beschreibung
Das vollständige Löschen sämtlicher Dateien und Ordner eines Laufwerkes (z.B. eine Festplatte oder ein USB Memory Stick) beziehungsweise eines Datenträgers (z.B. eine Diskette) ist verglichen mit anderen Datei-Operationen ziemlich aufwändig. Da VBA keinen Befehl zum Löschen eines kompletten Verzeichnisbaumes anbietet, muss man jeden Ordner einzeln löschen. Das führt allerdings zu diesen vier Schwierigkeiten:
1. Vor dem Löschen der Ordner muss die Verzeichnisstruktur ermittelt werden, da man jeden Ordnernamen bzw. jeden Ordnerpfad kennen muss.
2. Die Reihenfolge der Ordnerlöschung ist relevant. Es muss immer von der untersten Verzeichnisebene her begonnen werden, da ein zu löschender Ordner keine Unterordner enthalten darf.
3. Besitzt ein Ordner das Schreibgeschützt-Attribut, so muss dieses zuerst entfernt werden.
4. Wenn ein Ordner eine schreibgeschützte Datei enthält, so muss das Schreibgeschützt-Attribut dieser Datei ebenfalls zuerst entfernt werden.

TODO: Beschreibung des Codebeispiels

Achtung!
Benutzen Sie den Force-Parameter mit der nötigen Vorsicht! Wenn Sie bei DeleteFolder beispielsweise irrtümlich "C:\*" angeben, so wird die gesamte Festplatte "C:" gelöscht (ausser die direkt im Stammverzeichnis "C:\" liegenden Dateien). Eine solche Löschung kann nicht rückgängig gemacht werden.

.VBA-Code
Public Sub EreaseDrive()
  CreateObject("Scripting.FileSystemObject").DeleteFolder "A:\*", True
  CreateObject("Scripting.FileSystemObject").DeleteFile "A:\*.*", True

End Sub

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

 

Verwandte Codebeispiele

Datei löschen

Mehrere Dateien löschen

Dateien eines Ordners und allen Unterordnern löschen

Unterordner eines Ordners löschen

Datenträger/Laufwerk kopieren

To Top


Datenträger/Laufwerk kopieren

.Beschreibung
Anhand der CopyFolder- und CopyFile-Methode aus der FileSystemObject-Bibliothek lässt sich ein Datenträger (z.B. eine Diskette) oder ein komplettes Laufwerk (z.B. eine Festplatte oder einen USB Memory Stick) kopieren. Sowohl schreibgeschützte als auch versteckte Ordner und Dateien werden mit der hier vorgestellten Lösung anstandslos kopiert.

Bitte beachten Sie folgende Punkte:
- Der Zielordner wird nicht automatisch angelegt. Das bedeutet, dass er bereits vorhanden sein muss.
- Sowohl CopyFolder als auch CopyFile besitzen einen Parameter namens OverWriteFiles. Mit diesem wird festgelegt, ob eine im Zielordner bereits vorhandene Datei bzw. vorhandener Ordner überschrieben werden soll. Der Parameter ist standardmässig auf True gesetzt.
- Wenn sich im Zielordner eine gleichnamige Datei befindet, welche schreibgeschützt ist, so erscheint der Laufzeitfehler 70 "Zugriff verweigert". Die bis zum Zeitpunkt des Fehlerauftretens bereits kopierten Dateien und Ordner bleiben bestehen.

Die beiden folgenden Codebeispiele zeigen, wie der komplette Inhalt einer Diskette (Dateien, Ordner und Unterordner), welche sich im Laufwerk "A:" befindet, auf die Festplatte "C:" in den Ordner "Diskette" kopiert wird.
» Beim ersten Codebeispiel existiert der Zielordner "Diskette" bereits.
» Bei Beispiel #2 wird der Zielordner "Diskette" zuerst mittels MkDir angelegt.

.VBA-Code #1
Public Sub CopyDrive1()
  CreateObject("Scripting.FileSystemObject").CopyFolder "A:\*", "C:\Diskette"
  CreateObject("Scripting.FileSystemObject").CopyFile "A:\*.*", "C:\Diskette"
End Sub

.VBA-Code #2
Public Sub CopyDrive2()
  MkDir "C:\Diskette"

  CreateObject("Scripting.FileSystemObject").CopyFolder "A:\*", "C:\Diskette", False
  CreateObject("Scripting.FileSystemObject").CopyFile "A:\*.*", "C:\Diskette", False
End Sub

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

 

Verwandte Codebeispiele

Datei kopieren

Ordner kopieren

Diskette kopieren anhand des Windows-Dialoges "Diskette kopieren"

Datenträger/Laufwerk löschen

To Top


Übergeordneter Ordner eines Ordners abfragen

.Beschreibung
In der Programmiersprache VBA gibt es keine direkte Möglichkeit, den Namen des übergeordneten Ordner (d.h. des Parent-Ordners) eines bestimmten Ordners festzustellen. Man kann durchaus eine Schleife programmieren, die vom Ende des Pfadnamens her beginnend das erste Backslash-Zeichen ('\') sucht. Diese Lösung ist aber nicht sehr "schön" (siehe Codebeispiel #3). Die weitaus bessere Lösung bietet jedoch die FileSystemObject-Bibliothek, und zwar indem man die ParentFolder-Eigenschaft des Folder-Objektes oder die GetParentFolderName-Methode des FileSystemObject-Objektes verwendet (siehe VBA-Beispiel #1 und #2).

.VBA-Code #1
Public Sub GetParentFolder1()
  MsgBox CreateObject("Scripting.FileSystemObject").GetFolder("C:\Daten\Backup").ParentFolder

End Sub

.VBA-Code #2
Public Sub GetParentFolder2()
  MsgBox CreateObject("Scripting.FileSystemObject").GetParentFolderName("C:\Daten\Backup")

End Sub

.VBA-Code #3
Public Sub GetParentFolder3()
  Dim intChar As Integer
  Dim strPath As String
  strPath = "C:\Daten\Backup"
  For intChar = Len(strPath) To 1 Step -1
    If Mid$(strPath, intChar, 1) = "\" Then
      MsgBox Left$(strPath, intChar - 1)
      Exit For
    End If
  Next intChar

End Sub

.Hinweis
Bitte beachten Sie, dass
- für die Abfrage der ParentFolder-Eigenschaft der bei GetFolder angegebene Ordner existieren sein muss (siehe VBA-Codebeispiel #1).
- bei den Codebeispielen #2 und #3 der angegebene Ordner dagegen nicht zwingend existieren muss.

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Prüfen, ob die Inhalte zweier Dateien identisch sind (Zwei Dateien binär miteinander vergleichen)

.Beschreibung
Diese VBA-Funktion vergleicht zwei Dateien miteinander, indem der Inhalt einer Datei mit dem Inhalt einer anderen Datei verglichen wird, und zwar in Paketen von jeweils 65'536 Bytes. Sobald ein Byte eines Paketes nicht identisch ist mit dem entsprechenden Byte des Paketes der anderen Datei, sind die beiden Dateiinhalte verschieden, was zum sofortigen Verlassen der Funktion führt. Bei identischen Dateien gibt die Funktion True (Wahr) zurück, ansonsten False (Falsch).

Nebenbei erwähnt ist dieses Paketvergleich-Verfahren, bzw. seine Implementierung mit dem hier vorgestellten VBA-Code, äusserst schnell und speicherfreundlich. Das Vergleichen von beispielsweise zwei 5 MB grossen Dateien dauert auf einem Computer mit einer 1 GHz CPU nur knapp eine Sekunde. Zudem wird der Arbeitsspeicher kaum spürbar belastet, da immer nur ein Teil (Paket) der Datei gelesen und verarbeitet wird. Aus diesem Grund ist das Verfahren beliebig skalierbar. Sprich: Die Verarbeitungsdauer nimmt linear zur Dateigrösse zu, und der beanspruchte Speicher bleibt immer gleich. Die Paketgrösse kann übrigens auch geändert werden (siehe Konstante BlockSize), z.B. 8'192 oder 262'144. Dies beeinflusst die Dauer zum Vergleichen der beiden Dateien kaum spürbar.

Im Beispiel werden zwei Textdateien ("Datei1.txt" und "Datei2.txt") miteinander verglichen. Natürlich können Sie auch andere Dateitypen verwenden, beispielsweise xls- oder exe-Dateien.

.VBA-Code
Public Function CompareFiles(ByVal File1 As String, ByVal File2 As String) As Boolean
  Const BlockSize = 65536
  Dim Field1(1 To BlockSize) As Byte
  Dim Field2(1 To BlockSize) As Byte
  Dim BaseLen As Long
  Dim PartLen As Long
  Dim lngItem As Long
  Dim bolDifferent As Boolean
  BaseLen = FileLen(File1)
  If BaseLen = FileLen(File2) Then
    Open File1 For Binary As #1
    Open File2 For Binary As #2
    Do
      If BaseLen > BlockSize Then
        PartLen = BlockSize
      Else
        PartLen = BaseLen
      End If
      Get #1, , Field1
      Get #2, , Field2
      For lngItem = 1 To PartLen
        If Field1(lngItem) <> Field2(lngItem) Then Exit For
      Next
      bolDifferent = (lngItem <= PartLen)
      BaseLen = BaseLen - PartLen
    Loop While BaseLen > 0 And Not bolDifferent
    Close #2
    Close #1
    CompareFiles = Not bolDifferent
  Else
    CompareFiles = False
  End If
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox "Dateien sind identisch: " & CompareFiles("C:\Daten\Datei1.txt", "C:\Daten\Datei2.txt")
End Sub

To Top


Dateiname eines VBA-Projektes ermitteln

.Beschreibung
Das Objektmodell des VBA-Editors kennt keine Möglichkeit, wie man den Dateinamen eines bestimmten VBA-Projektes herausfinden kann. Mit Dateiname ist der Name der Arbeitsmappe bzw. des Add-Ins gemeint, in welcher/welchem sich das VBA-Projekt befindet.

"Microsoft Visual Basic for Applications Extensibility" vbeext1.olb

"C:\Programme\Gemeinsame Dateien\Microsoft Shared\VBA"

 

.VBA-Code
Public Function GetProjectFileName(ByVal strProjectName As String) As String
  Dim strComponentName As String
  Dim intCounter As Integer
  Dim objVBAProject As Object
  If Len(Trim$(strProjectName)) = 0 Then
    GetProjectFileName = ""
    Exit Function
  End If
  For Each objVBAProject In Application.VBE.VBProjects
    If LCase$(strProjectName) = LCase$(objVBAProject.Name) Then
      intCounter = intCounter + 1
    End If
  Next objVBAProject
  If intCounter > 1 Then
    MsgBox "Es sind mehrere Projekte mit Name '" & strProjectName & "' vorhanden!", vbExclamation
    GetProjectFileName = ""
    Exit Function
  ElseIf intCounter = 0 Then
    MsgBox "Es ist kein Projekt mit Name '" & strProjectName & "' vorhanden!", vbExclamation
    GetProjectFileName = ""
    Exit Function
  End If
  On Error Resume Next
  strComponentName = ""
  Set objVBAProject = Application.VBE.VBProjects(strProjectName)
  For intCounter = 1 To objVBAProject.VBComponents.Count
    If TypeName(objVBAProject.VBComponents(intCounter).Properties("Parent").Object) = "Application" Then
      If Err.Number = 0 Then
        strComponentName = objVBAProject.VBComponents(intCounter).Name
        Exit For
      Else
        Err.Clear
      End If
    End If
  Next intCounter
  If strComponentName = "" Then
    MsgBox "Parent-Objekt 'Application' nicht vorhanden!", vbExclamation
    Set objVBAProject = Nothing
    GetProjectFileName = ""
    Exit Function
  End If
  GetProjectFileName = objVBAProject.VBComponents(strComponentName).Properties("Name").Value
  If Err = -2147352565 Then
    MsgBox "Element '" & strComponentName & "' nicht vorhanden!", vbExclamation
    Err.Clear
    Set objVBAProject = Nothing
    GetProjectFileName = ""
    Exit Function
  ElseIf Err <> 0 Then
    MsgBox "Unbekannter Fehler!" & vbCrLf & Err.Number & ": " & Err.Description, vbExclamation
    Set objVBAProject = Nothing
    GetProjectFileName = ""
    Exit Function
  End If
  Set objVBAProject = Nothing
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox "Dateiname von VBA-Projekt: " & GetProjectFileName("fsoproject")
End Sub

Verwandte Codebeispiele

Name eines VBA-Projektes abfragen/ändern

Name des aktiven VBA-Projektes abfragen

To Top


Mehrere Ordner verschieben

.Beschreibung
Glaubt man der Beschreibung zur MoveFolder-Methode in der FileSystemObject-Bibliothek, so kann man mit dieser Methode nur einen Ordner aufs Mal verschieben. In der Dokumentation der Microsoft Visual Basic Scripting Edition steht zwar, dass auch mehrere Ordner verschoben werden können - nur wissen das die wenigsten Programmierer. Zum Verschieben von mehreren Ordnern muss man lediglich die Platzhalterzeichen (* und ?) einsetzen.

Das nachfolgende VBA-Codebeispiel verschiebt alle Ordner, die sich im Ordner "C:\Original\Daten" befinden und mit "Sub" beginnen, in den Ordner "C:\Backup" (welcher bereits vorhanden sein muss).

.VBA-Code
Public Sub MoveFolders()
  CreateObject("Scripting.FileSystemObject").MoveFolder "C:\Original\Daten\Sub*", "C:\Backup")
End Sub

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

 

Verwandte Codebeispiele

Ordner verschieben

Datei verschieben

Mehrere Dateien verschieben

Ordner kopieren

Mehrere Ordner kopieren

To Top


Neue Dateinamenerweiterung mit Dateitypzuordnung registrieren

.Beschreibung
Dieses praxisnahe Codebeispiel zeigt, wie man in Windows einen neuen Dateityp hinzugefügt wird, indem eine Dateinamenerweiterung registriert wird.

Im nachfolgenden Beispiel wird die Dateinamenerweiterung "bwd" als Dateityp "BIFF-Workbench Dump" registriert und mit der Programmdatei BIFF-Workbench.exe verbunden. Nach Ausführen des Programmcodes führt ein Doppelklick auf eine bwd-Datei die Anwendung BIFF-Workbench aus und öffnet die Datei. Die Variable strAppPath enthält das Programmverzeichnis der Anwendung BIFF-Workbench, z.B. "C:\Programme\BIFF-Workbench".

.VBA-Code
Public Sub RegisterFileAssociation()
  Dim objShell As Object
  Const strAppPath As String = "C:\Programme\BIFF-Workbench"

  Set objShell = CreateObject("WScript.Shell")
  With objShell
    .RegWrite "HKEY_CLASSES_ROOT\.bwd\", "bwdfile"
    .RegWrite "HKEY_CLASSES_ROOT\bwdfile\", "BIFF-Workbench Dump"
    .RegWrite "HKEY_CLASSES_ROOT\bwdfile\Shell\", ""
    .RegWrite "HKEY_CLASSES_ROOT\bwdfile\Shell\open\command\", Chr$(34) & strAppPath & "\BIFF-Workbench.exe" & Chr$(34) & " %1"
  End With
  Set objShell = Nothing
End Sub

.Hinweis
Beachten Sie bitte, dass der obige Programmcode einen allfällig bereits vorhandenen Dateityp mit der Dateinamenerweiterung "bwd" überschreibt. Überprüfen Sie daher sicherheitshalber, ob die Erweiterung "bwd" schon registriert ist.

Weitere Informationen

VBA-Spezialthema: Windows Script Host (WSH)

 

Verwandte Codebeispiele

Zugeordneter Dateityp einer Dateinamenerweiterung ermitteln

Dateinamenerweiterungen mit zugeordnetem Dateityp auflisten

Dateitypen mit den definierten Öffnen-Befehlen auflisten

Öffnen-Befehl eines Dateityps ändern

To Top


Dateinamenerweiterungen eines Dateityps ermitteln

.Beschreibung
Mit diesem Programmcode wird die Dateinamenerweiterung eines bestimmten Dateityps abgefragt.

.VBA-Code
Public Sub GetExtensionsOfFiletype()

End Sub

.Hinweis
...

Weitere Informationen

VBA-Spezialthema: Windows Script Host (WSH)

 

Verwandte Codebeispiele

Zugeordneter Dateityp einer Dateinamenerweiterung ermitteln

Dateinamenerweiterungen mit zugeordnetem Dateityp auflisten

Dateitypen mit den definierten Öffnen-Befehlen auflisten

Öffnen-Befehl eines Dateityps ändern

To Top


Prüfen, ob eine Dateinamenerweiterung einem Dateityp zugeordnet ist

.Beschreibung
Dieses Codebeispiel überprüft, ob eine bestimmte Dateinamenerweiterung einem Dateityp zugeordnet ist. Zum Beispiel ist die Dateinamenerweiterung "xls" dem Dateityp "Excel.Sheet.x" zugeordnet, welcher die Bezeichnung "Microsoft Excel-Arbeitsmappe" besitzt.

.VBA-Code
Public Sub CheckFileAssociation()

End Sub

.Hinweis
...

Weitere Informationen

VBA-Spezialthema: Windows Script Host (WSH)

 

Verwandte Codebeispiele

Zugeordneter Dateityp einer Dateinamenerweiterung ermitteln

Dateinamenerweiterungen mit zugeordnetem Dateityp auflisten

Dateitypen mit den definierten Öffnen-Befehlen auflisten

Öffnen-Befehl eines Dateityps ändern

To Top


Ordner mit allen Unterordnern auflisten

.Beschreibung
Zum Erstellen einer Liste sämtlicher Unterordner eines Ordners benötigt man vergleichsweise viel VBA-Programmcode.

» Der VBA-Code #1 erstellt eine Liste aller Unterordner des angegebenen Ordners (im Beispiel wird "C:\Daten" verwendet) auf einem neuen Arbeitsblatt der aktiven Arbeitsmappe.

» Der Programmcode von Beispiel #2 entspricht im Wesentlichen demjenigen von Codebeispiel #1. Hier wird jedoch keine Liste erstellt sondern die gefundenen Ordnerpfade in einer Datenfeldvariable astrFolders abgelegt. Der Programmcode kann somit auch in einer anderen Anwendung als Microsoft Excel ausgeführt werden.

.VBA-Code #1
'Codemodul
Function SearchList(ByVal Filename As String, ByVal StartPath As String, ByVal FolderList As Collection) As Long
  Dim SubFolderList As New Collection
  Dim strResult As String
  Dim lngCounter As Long
  On Error Resume Next
  If Right(StartPath, 1) <> "\" Then
    StartPath = StartPath & "\"
  End If
  strResult = Dir(StartPath & Filename, vbDirectory)
  Do While strResult <> ""
    If strResult <> "" Then
      If GetAttr(StartPath & strResult) And vbDirectory Then
        If strResult <> "." And strResult <> ".." Then
          FolderList.Add StartPath & strResult, StartPath & strResult
        End If
      End If
    End If
    strResult = Dir()
  Loop
  strResult = Dir(StartPath & "*", vbDirectory)
  Do While strResult <> ""
    If GetAttr(StartPath & strResult) And vbDirectory Then
      If strResult <> "." And strResult <> ".." Then
        SubFolderList.Add StartPath & strResult, strResult
      End If
    End If
    strResult = Dir()
  Loop
  For lngCounter = 1 To SubFolderList.Count
    SearchList Filename, SubFolderList(lngCounter), FolderList
  Next lngCounter
  SearchList = FolderList.Count
End Function

Sub ListFoldersWithSubFolders1()
  Dim colList As New Collection
  Dim lngCounter As Long
  Dim wksSheet As Worksheet
  Set wksSheet = ActiveWorkbook.Worksheets.Add
  With wksSheet
    For lngCounter = 1 To SearchList("*", "C:\Daten", colList)
      .Cells(lngCounter, 1).Value = colList(lngCounter)
    Next lngCounter
  End Witt

  Set wksSheet = Nothing
End Sub

.VBA-Code #2
'Codemodul
Function SearchList(ByVal Filename As String, ByVal StartPath As String, ByVal FolderList As Collection) As Long
  Dim SubFolderList As New Collection
  Dim strResult As String
  Dim lngCounter As Long
  On Error Resume Next
  If Right(StartPath, 1) <> "\" Then
    StartPath = StartPath & "\"
  End If
  strResult = Dir(StartPath & Filename, vbDirectory)
  Do While strResult <> ""
    If strResult <> "" Then
      If GetAttr(StartPath & strResult) And vbDirectory Then
        If strResult <> "." And strResult <> ".." Then
          FolderList.Add StartPath & strResult, StartPath & strResult
        End If
      End If
    End If
    strResult = Dir()
  Loop
  strResult = Dir(StartPath & "*", vbDirectory)
  Do While strResult <> ""
    If GetAttr(StartPath & strResult) And vbDirectory Then
      If strResult <> "." And strResult <> ".." Then
        SubFolderList.Add StartPath & strResult, strResult
      End If
    End If
    strResult = Dir()
  Loop
  For lngCounter = 1 To SubFolderList.Count
    SearchList Filename, SubFolderList(lngCounter), FolderList
  Next lngCounter
  SearchList = FolderList.Count
End Function

Sub ListFoldersWithSubFolders2()
  Dim colList As New Collection
  Dim lngCounter As Long

  Dim astrFolders() As String
  For lngCounter = 1 To SearchList("*", "C:\Daten", colList)
    ReDim Preserve astrFolders(1 To lngCounter)
    astrFolders(lngCounter) = colList(lngCounter)
  Next lngCounter

  On Error Resume Next
  If Err.Number = 9 Then
    MsgBox "Der Ordner enthält keine Unterordner.", vbInformation
  Else
    MsgBox "Der Ordner enthält " & UBound(astrFolders) & " Unterordner.", vbInformation
  End If
End Sub

.Hinweis
Beide obige Beispiele berücksichtigen keine versteckten Ordner.

To Top


Verknüpfung zu einer Programmdatei im 'Senden an'-Menü des Windows Explorers erstellen

.Beschreibung
Wenn man im Windows Explorer mit der rechten Maustaste auf eine Datei klickt, so erscheint das bekannte Dateimenü mit den Befehlen wie "Öffnen", "Ausschneiden", "Kopieren", "Umbenennen", "Eigenschaften" etc. Unter anderem enthält das Menü auch einen Menüpunkt "Senden an". Im "Senden an"-Untermenü sind verschiedene Ziele aufgelistet (häufig sind es Anwendungen), an die man die selektierte Datei direkt senden kann.

Dieses Codebeispiel zeigt, wie man dem "Senden an"-Menü ein weiteres Ziel hinzufügen kann. Das Ziel wird in Form einer Verknüpfungsdatei (Dateinamenerweiterung 'lnk') im Spezialordner namens "SendTo" erstellt (Jeder Windows-Benutzer besitzt einen solchen Ordner in seinem Profilordner).

Im Beispiel wird eine Verknüpfung zur Anwendung "Programm.exe" angelegt, die sich im Verzeichnis "C:\Programme\EinProgramm" befindet. Die Verknüpfung erhält den Namen "Programm" (wegen "Programm.lnk"). Als Dateisymbol wird automatisch das Symbol der Programmdatei verwendet. Wenn es bereits eine gleichnamige Verknüpfung gibt, so wird diese ersetzt.

Da nicht überprüft wird, ob die angegebenen Dateien/Pfade existieren, können Sie das Codebeispiel ausführen, ohne eine Anpassung vorzunehmen.

.VBA-Code
Public Sub AddLinkInSendToMenu()
  Dim strSendToFolder As String
  Dim objWSHShell As Object
  Dim objWSHShortcut As Object
  Set objWSHShell = CreateObject("WScript.Shell")
  strSendToFolder = objWSHShell.SpecialFolders("sendto")
  Set objWSHShortcut = objWSHShell.CreateShortcut(strSendToFolder & "\Programm.lnk")
  With objWSHShortcut
    .TargetPath = "C:\Programme\EinProgramm\Programm.exe"
    .Description = "Verknüpfung mit Programm"
    .WorkingDirectory = "C:\Programme\EinProgramm"
    .WindowStyle = 1   '1 = normale Fenstergrösse
    .Save
  End With
  Set objWSHShortcut = Nothing
  Set objWSHShell = Nothing
End Sub

.Hinweis
Die Verknüpfungsdatei wird erst beim Ausführen der Codezeile ".Save" auf der Festplatte erstellt.

Weitere Informationen

VBA-Spezialthema: Windows Script Host (WSH)

 

Verwandte Codebeispiele

Datei-Verknüpfung erstellen

Datei-Verknüpfung auf dem Windows Desktop anlegen

To Top


Zugeordneter Dateityp einer Dateinamenerweiterung ermitteln

.Beschreibung
Die meisten Dateinamenerweiterungen sind einem Dateityp zugeordnet. So sieht man unter anderem im Windows Explorer eine Listenspalte "Typ", in welcher der Dateityp einer Datei angezeigt wird (bei Ansicht "Details"). Beispielsweise besitzt die Dateinamenerweiterung "xls" den Dateityp "Microsoft Excel-Arbeitsmappe", "exe" besitzt den Typ "Anwendung", "txt" den Typ "Textdatei" und so weiter.

Nachfolgend werden zwei gänzlich verschiedene Lösungen vorgestellt. Das Codebeispiel #1 enthält verglichen mit dem zweiten Codebeispiel zwar sehr viel mehr Programmcode, dafür funktioniert die Ermittlung des Dateitypes exakt gleich wie die von Windows verwendete Technik. Obwohl der Programmcode relativ lang ist, dauert die Dateityp-Ermittlung nur sehr kurz (weniger als 0.01 Sekunden).

Codebeispiel #1: Windows API
Das erste Codebeispiel zeigt die favorisierte Lösung, und besitzt folgende Merkmale:
- Da nur eine Dateinamenerweiterung angegeben wird, muss keine Datei mit dieser Dateinamenerweiterung existieren.
- Wenn die angegebene Dateinamenerweiterung nicht in der Registry eingetragen ist, sprich keinem Dateityp zugeordnet ist, so gibt die Funktion GetRegisteredFiletype die Dateinamenerweiterung ohne den führenden Punkt, in Grossschrift und mit dem Zusatz "-Datei" zurück (z.B. "XYZ-Datei", "A-Datei", "HELLO-Datei").
- Wenn als Dateinamenerweiterung eine leere Zeichenfolge ("") oder nur einen Punkt (".") angegeben wird, so gibt die Funktion den Text "Datei" zurück.
- Wenn die Dateinamenerweiterung ein Leerzeichen enthält (egal an welcher Stelle), so wird ebenfalls "Datei" zurückgegeben.

Codebeispiel #2: FileSystemObjekt-Bibliothek
Die als Codebeispiel 2 vorgestellte Lösung ist erheblich kürzer, besitzt aber ein paar Nachteile beziehungsweise Unterschiede zu der von Windows verwendeten Technik:
- Die angegebene Datei muss vorhanden sein.
- Der Zusatz "Datei" wird in englischer Sprache, also "File" zurückgegeben.
- Wenn die Dateinamenerweiterung ein Leerzeichen enthält (egal an welcher Stelle), so wird die Dateinamenerweiterung in Grossbuchstaben mit dem Zusatz "File" (ohne Bindestrich) statt "Datei" zurückgegeben.

.VBA-Code #1
'Deklarationsbereich
Public Const REG_EXPAND_SZ = 2
Public Const ERROR_SUCCESS = 0
Public Const HKEY_CLASSES_ROOT = &H80000000
Public Declare Function RegOpenKey Lib "advapi32" Alias "RegOpenKeyA" (ByVal hKey As Long, _

   ByVal lpSubKey As String, phkResult As Long) As Long
Public 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
Public Declare Function RegCloseKey& Lib "advapi32" (ByVal hKey&)

'Codemodul
Public Function GetRegisteredFiletype(ByVal strExtension As String) As String
  Dim strOBJECT As String
  Dim strTYPE As String
  If strExtension = "" Or strExtension = "." Or InStr(strExtension, " ") Then
    GetRegisteredFiletype = "Datei"
    Exit Function
  End If
  strOBJECT = GetRegString(HKEY_CLASSES_ROOT, strExtension, "")
  If strOBJECT = "" Then
    GetRegisteredFiletype = UCase$(Right$(strExtension, Len(strExtension) - 1)) & "-Datei"
  Else
    strTYPE = GetRegString(HKEY_CLASSES_ROOT, strOBJECT, "")
    If strTYPE = "" Then
      GetRegisteredFiletype = UCase$(Right$(strExtension, Len(strExtension) - 1)) & "-Datei"
    Else
      GetRegisteredFiletype = strTYPE
    End If
  End If
End Function

Public 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, vbExclamation

      GetRegString = ""
    End If
  End If
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox GetRegisteredFiletype(".xls")    'Dateinamenerweiterung immer mit Punkt angeben!
End Sub

.VBA-Code #2
Public Sub GetFiletype()
  MsgBox CreateObject("Scripting.FileSystemObject").GetFile("C:\Daten\EineMappe.xls").Type
End Sub

.Hinweis
Beachten Sie bitte, dass bei der ersten Lösung (Codebeispiel #1) die Funktion GetRegisteredFiletype mit einer Dateinamenerweiterung (und vorangestelltem Punkt) aufgerufen werden muss. Übergeben Sie der Funktion keinen Dateinamen, sondern immer nur seine Erweiterung. Bei Codebeispiel #2 dagegen muss der vollständige Dateiname (inkl. Pfad) angegeben werden, wobei die Datei existieren muss.

Weitere Informationen

Fragen und Antworten: Wo finde ich Informationen über Dateitypen und Dateinamenerweiterungen?

 

Verwandte Codebeispiele

Neue Dateinamenerweiterung mit Dateitypzuordnung registrieren

Dateinamenerweiterungen mit zugeordnetem Dateityp auflisten

Dateitypen mit den definierten Öffnen-Befehlen auflisten

Öffnen-Befehl eines Dateityps ermitteln

Öffnen-Befehl eines Dateityps ändern

To Top


Neue Programmgruppe im Start/Programme-Menü anlegen

.Beschreibung
Wenn man in Windows auf die Start-Schaltfläche klickt und dann den Eintrag "Programme" markiert, erscheint ein Untermenü mit mehreren Programmen und Programmgruppen.

Eine im Programme-Menü angezeigte Programmgruppe ist nichts anderes als ein Ordner, der sich an einem bestimmten Ort irgendwo im Windows-Verzeichnis befindet. Zum Anlegen einer neuen Programmgruppe genügt es daher, ein neues Verzeichnis zu erstellen, was bekanntlich sehr einfach mit MkDir erledigt wird. Die einzige Schwierigkeit besteht darin, herauszufinden, in welchem Pfad der neue Ordner angelegt werden muss. Dazu werden die zwei Windows API-Funktionen SHGetSpecialFolderLocation2lng und SHGetPathFromIDList benötigt.

Das nachstehende Beispiel zeigt, wie eine neue Programmgruppe namens "Neue Gruppe" angelegt wird (der Name ist in der Konstante strNewGroup abgelegt).

.VBA-Code
'Deklarationsbereich
Public Type DummyStruct
  cb As Long
  id As Long
End Type
Public Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, _

   ByVal lpBuffer As String) As Long
Public Declare Function SHGetSpecialFolderLocation2lng Lib "shell32.dll" _

   Alias "SHGetSpecialFolderLocation" (ByVal hwndOwner As Long, ByVal nFolder As Long, _
   pidl As DummyStruct) As Long

'Codemodul
Public Sub AddProgramGroup()
  Dim strProgramFolder As String

  Const strNewGroup As String = "Neue Gruppe"
  Dim strPath As String
  Dim udtDummy As DummyStruct

  SHGetSpecialFolderLocation2lng 0&, &H2, udtDummy
  strPath = String(260, 0)
  SHGetPathFromIDList ByVal udtDummy.cb, ByVal strPath
  strProgramFolder = Left$(strPath, InStr(strPath, Chr$(0)) - 1)
  MkDir strProgramFolder & "\" & strNewGroup

End Sub

.Hinweis
Wenn bereits eine gleichnamige Programmgruppe vorhanden ist, tritt bei MkDir der Laufzeitfehler 75 "Fehler beim Zugriff auf Pfad/Datei" auf.

To Top


Prüfen, ob eine Dokumentdatei eine Vorschaugrafik enthält

.Beschreibung
Bekanntlich kann eine Dokumentdatei eine Vorschaugrafik enthalten. Eine derartige Vorschaugrafik wird erzeugt, indem man - im Falle von Microsoft Excel, Microsoft Word und Microsoft PowerPoint - die Option "Vorschaugrafik speichern" auf dem Eigenschaften-Dialogfenster einschaltet (Menü Datei/Eigenschaften).

Wenn Sie herausfinden möchten, ob eine Datei eine Vorschaugrafik besitzt, so kommen Sie nicht um den Einsatz der Objektbibliothek "OLE Document Properties Object Library" (Datei DSOFile.dll) umhin. Weder das Objektmodell von Microsoft Excel noch dasjenige von Microsoft Office bieten nämlich eine entsprechende Abfragemöglichkeit.

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

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

  If IsEmpty(objDSODocument.Icon) = True Then
    MsgBox "Das Dokument enthält keine Vorschaugrafik."
  Else
    MsgBox "Das Dokument enthält eine Vorschaugrafik."

  End If
  Set objDSODocument = Nothing
  Set objDSOReader = Nothing
End Sub

.Hinweis
Bitte beachten Sie, dass die Dokumentdatei nicht gesperrt, d.h. nicht in Bearbeitung sein darf. Der obige VBA-Programmcode kann somit nicht in der zu überprüfenden Arbeitsmappe ablaufen.

Verwandte Codebeispiele

Datei-Eigenschaften-Dialog anzeigen

Vorschaugrafik einer Dokument-Datei anzeigen

Vorschaugrafik einer geöffneten Arbeitsmappe anzeigen

Vorschaugrafik einer Arbeitsmappe generieren/Entfernen

 

Weitere Informationen

VBA-Spezialthema: OLE Document Properties Object Library (DSOFile)

To Top


Datei anhand 'Öffnen mit'-Dialog mit einem bestimmten Programm öffnen

.Beschreibung
Manchmal wäre es schön, wenn man dem Benutzer eine Liste der installierten Programme anzeigen könnte, damit er selbst auswählen kann, mit welchem Programm die Datei geöffnet werden soll. Das nachstehende Beispiel blendet den "Öffnen mit"-Dialog von Windows ein.

Der Dateipfad muss nicht in Anführungszeichen (") geschrieben werden, auch wenn er Leerzeichen enthält (z.B. bei C:\Neue Daten\Eine Datei.txt).

Weder der Pfad noch die Datei (im Beispiel "C:\Daten\EineDatei.xyz") müssen zwingend existieren, damit der Dialog angezeigt werden kann. Wenn der Benutzer jedoch im Dialog auf OK klickt, erscheint eine Fehlermeldung, die je nach ausgewähltem Programm einen anderen Meldungstext zeigt.

.VBA-Code
Public Sub SelectProgramAndOpenFile()
  Shell "rundll32.exe shell32.dll,OpenAs_RunDLL C:\Daten\EineDatei.xyz"
End Sub

Verwandte Codebeispiele

Programm auswählen und starten

To Top


Programm auswählen und starten

.Beschreibung
Möchten Sie in einem Dialogfenster eine Liste der installierten Programmen ausgeben, damit der Benutzer selbständig ein Programm auswählen und starten kann? Nichts leichter als das! Eine einzige Codezeile genügt nämlich.

.VBA-Code
Public Sub SelectAndRunProgram()
  Shell "rundll32.exe shell32.dll,OpenAs_RunDLL"
End Sub

Verwandte Codebeispiele

Datei anhand 'Öffnen mit'-Dialog mit einem bestimmten Programm öffnen

To Top


Pfad der Microsoft Excel-Programmdatei (Excel.exe) ermitteln

.Beschreibung
Dieses Codebeispiel zeigt, wie man den Pfad der exe-Datei von Microsoft Excel zuverlässig herausfindet.

Die Class-ID von Microsoft Excel ist immer gleich (00020820-0000-0000-C000-000000000046).

Die Funktion GetRegString wird zum Finden und Lesen des gesuchten Registry-Eintrages (HKCR\CLSID\{00020820-0000-0000-C000-000000000046}\LocalServer) benötigt.

.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_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

'*** Aufruf ***
Sub TestCall()
  MsgBox "Pfad von Excel: " & GetRegString(HKEY_CLASSES_ROOT, "CLSID\{00020820-0000-0000-C000-000000000046}\LocalServer", "")
End Sub

.Hinweis
Wenn der Excel-Pfad nicht angezeigt wird, sollten Sie es mit "LocalServer32" anstelle von "LocalServer" versuchen (siehe Prozedur TestCall). Gewöhnlich sind beide Schlüssel in der Registry eingetragen. Es kann jedoch sein, dass je nach Excel-Version nur "LocalServer32" vorhanden ist.

Tipp! Tipp!
Mit dem oben vorgestellten VBA-Programmcode können Sie auch den Pfad der Programmdatei von Microsoft Word (Word.exe) herausfinden. Geben Sie dazu in der Prozedur TestCall den Suchstring "CLSID\{00020906-0000-0000-C000-000000000046}\LocalServer32" an. Auch die Programmdatei von Microsoft PowerPoint kann so ermittelt werden (Suchstring "CLSID\{64818D10-4F9B-11CF-86EA-00AA00B929E8}\LocalServer32").

Verwandte Codebeispiele

Prüfen, ob ein Programm installiert ist

Pfad der exe-Datei eines installierten Programmes anhand des Dateinamens der exe-Datei ermitteln

Excel-Version ermitteln

Version der installierten Microsoft Excel-Anwendung ermitteln

Versionsnummer einer ausführbaren Datei abfragen

Versionsinformationen einer ausführbaren Datei abfragen

To Top


Version der installierten Microsoft Excel-Anwendung ermitteln

.Beschreibung
Wenn man die Version von Microsoft Excel herausfinden möchte, ohne die Anwendung starten zu müssen, kann man die GetFileVersion-Methode aus der FileSystemObject-Objektbibliothek einsetzen. Die GetFileVersion-Methode macht nichts anderes, als die Versionsnummer der Programmdatei "Excel.exe" abzufragen. Dazu muss man allerdings den Pfad dieser Programmdatei kennen und bei GetFileVersion angeben.

.VBA-Code
Public Sub GetExcelVersion()
  Dim objFSO As Object
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  MsgBox "Version von Microsoft Excel (Excel.exe): " & objFSO.GetFileVersion("C:\Programme\Microsoft Office\Office\Excel.exe")
  Set objFSO = Nothing
End Sub

Tipp! Tipp!
Wenn Sie den Pfad der Programmdatei "Excel.exe" nicht kennen, können Sie ihn via Windows Registry herausfinden. Wie das gemacht wird, zeigt das Codebeispiel Pfad der Microsoft Excel-Programmdatei (Excel.exe) ermitteln.

Verwandte Codebeispiele

Excel-Version ermitteln

Versionsnummer einer ausführbaren Datei abfragen

Versionsinformationen einer ausführbaren Datei abfragen

Pfad der Microsoft Excel-Programmdatei (Excel.exe) ermitteln

To Top


Pfad aus Verzeichnis- und Dateiname bilden

.Beschreibung
In der FileSystemObject-Objektbibliothek existiert eine spezielle Methode, mit der aus einem Pfad- und einem Dateinamen ein neuer Pfad gebildet werden kann. Würde man dies mit reinem VBA programmieren, so würde man

  strPath & "\" & strFile

schreiben. Um Fehler zu vermeiden, müsste geprüft werden, ob der Verzeichnis-Pfad einen abschliessenden Backslash '\' besitzt und falls ja, kein Backslash einfügen.

  If Right$(strPath, 1) <> "\" Then
    strPath & "\" & strFile
  Else
    strPath & strFile
  End If

Der Vorteil der BuildPath-Methode ist, dass überzählige oder nicht existierende Pfadtrennzeichen (Backslash '\') automatisch entfernt bzw. hinzugefügt werden.

.VBA-Code
Public Sub BuildPath()
  MsgBox "Pfad: " & CreateObject("Scripting.FileSystemObject").BuildPath("C:\Daten", "EineMappe.xls")
End Sub

.Hinweis
Weder das angegebene Verzeichnis noch die Datei müssen vorhanden sein.

To Top


Zufälliger Name für eine temporäre Datei generieren

.Beschreibung
Wenn man Daten vorübergehend in eine Datei zwischenspeichern möchte, so benötigt man dazu gewöhnlich eine temporäre Datei. Mit der GetTempName-Methode des FileSystemObject-Objektes erhält man einen zufälligen Namen, der dann als Dateiname verwendet werden kann. Die Datei wird wohlgemerkt nicht automatisch angelegt.

Der von GetTempName zurückgegebene Name setzt sich immer aus dem Präfix "rad", einem fünfstelligen Hex-Wert und der Dateinamenerweiterung "tmp" zusammen. Die Zusammensetzung des Namens kann nicht verändert werden. Hier drei Beispiele von zufällig generierten Dateinamen:
- rad4ADF3.tmp
- rad1CFF0.tmp
- radD221D.tmp

Übrigens kann der gelieferte Name auch für andere Zwecke verwendet werden, sprich nicht nur für eine temporäre Datei. Wenn Sie beispielsweise einen temporären Ordner benötigen, so kann der generierte Name ohne weiteres als neuer Ordnername benutzt werden.

.VBA-Code
Public Sub GetTempFilename()
  MsgBox CreateObject("Scripting.FileSystemObject").GetTempName
End Sub

.Hinweis
Die Wahrscheinlichkeit, dass GetTempName unmittelbar nacheinander den identischen Dateinamen zurückgibt, ist sehr klein. Es gibt 1'048'576 Möglichkeiten, einen fünfstelligen Hex-Wert zu bilden.

To Top


Temporäre Datei mit einem eindeutigen Namen in einem Ordner erstellen

.Beschreibung
Hier wird vorgestellt, wie man eine temporäre Datei mit einem eindeutigen Dateinamen in einem frei wählbaren Verzeichnis erstellen kann. Der Vorteil der hier gezeigten Lösung ist, dass die Datei automatisch angelegt wird und der Name der Datei in jedem Fall eindeutig ist, und zwar innerhalb des angegebenen Verzeichnisses. Zudem können Sie festlegen, welches Präfix der Dateiname verwenden soll. Das Präfix kann bis zu 3 Zeichen lang sein. Wenn mehr Zeichen angegeben werden, werden nur die ersten 3 Zeichen berücksichtigt. Sie können sogar bestimmen, ob die Funktion keine Datei anlegen sondern nur den Dateinamen zurückgeben soll (in diesem Fall ist der Dateiname allerdings nicht eindeutig). Der ermittelte Dateiname besitzt immer die Dateinamenerweiterung "tmp".

In der Aufruf-Prozedur TestCall wird eine temporäre Datei im Ordner "C:\Daten" erstellt, welche mit dem Präfix "~AB" beginnt. Die erstellte Datei heisst somit beispielsweise "~AB1C.tmp" (oder ähnlich). Wenn Sie die Prozedur ein zweites Mal ausführen, lautet der Dateiname "~AB1D.tmp".

.VBA-Code (Allgemein)
'Deklarationsbereich
Const gintMAX_PATH_LEN% = 260
Declare Function GetTempFilename32 Lib "kernel32" Alias "GetTempFileNameA" (ByVal strWhichDrive As String, _

   ByVal lpPrefixString As String, ByVal wUnique As Integer, ByVal lpTempFilename As String) As Long

'Codemodul
Function GetTempFilename(ByVal strDestPath As String, ByVal lpPrefixString As String, _
    ByVal wUnique As Integer, lpTempFilename As String) As Boolean
  lpTempFilename = String(gintMAX_PATH_LEN, vbNullChar)
  GetTempFilename = GetTempFilename32(strDestPath, lpPrefixString, wUnique, lpTempFilename) > 0
  lpTempFilename = StripTerminator(lpTempFilename)
End Function

Function StripTerminator(ByVal strString As String) As String
  Dim intZeroPos As Integer
  intZeroPos = InStr(strString, Chr$(0))
  If intZeroPos > 0 Then
    StripTerminator = Left$(strString, intZeroPos - 1)
  Else
    StripTerminator = strString
  End If
End Function

.VBA-Code #1
'*** Aufruf ***
Sub TestCall()
  Dim strFilename As String
  strFilename = ""
  GetTempFilename "C:\Daten", "~AB", 0, strFilename
  MsgBox "Die erstellte temporäre Datei heisst " & strFilename
End Sub

.VBA-Code #2
'*** Aufruf ***
Sub TestCall()
  Dim strFilename As String
  strFilename = ""
  GetTempFilename "C:\Daten", "~AB", 1, strFilename
  MsgBox "Die temporäre Datei heisst " & strFilename
End Sub

To Top


Temporäre Datei im Temp-Verzeichnis von Windows erstellen

.Beschreibung
Dateiname ermitteln mit GetTempName

Temp-Verzeichnis ermitteln mit Environ("Temp")

Dateipfad zusammensetzen mit BuildPath

.VBA-Code
Public Sub WriteTempFile()
  Dim objFSO As Object
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  Open objFSO.BuildPath(Environ("temp"), objFSO.GetTempName) For Output As #1

  'Programmcode für Daten in temporäre Datei schreiben...
  Close #1
  Set objFSO = Nothing

End Sub

To Top


Aktueller Bearbeiter einer Arbeitsmappe ohne Microsoft Excel herausfinden

.Beschreibung
Beschreibung folgt in Kürze...

.VBA-Code
Public Sub GetCurrentFileUser()

End Sub

To Top


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

.Beschreibung
Das hier vorgestellte VBA-Beispiel demonstriert, wie man ohne viel Programmcode eine Suchfunktion für beliebige Dateien realisieren kann. Der zu suchende Dateiname darf auch die Platzhalter * und ? enthalten. Die gefundenen Dateien werden in einer öffentlichen Array-Variable (astrFiles) eingetragen, damit sie nach abgeschlossener Suche weiterverarbeitet werden können. Am Schluss der Suche werden Gesamtgrösse und Anzahl der gefundenen Dateien sowie der Dateiname (inkl. Pfad) der ersten gefundenen Datei im Direktfenster des VBA-Editors angezeigt.

Die Funktion kann bei Bedarf während der Suche das gerade durchsuchte Verzeichnis sowie jede gefundene Datei ausgeben (siehe die beiden auskommentierten "Debug.Print"-Codezeilen).

In der Beispielprozedur TestCall werden alle Dateien namens "A*.xls" gesucht, die sich im Ordner "C:\Daten" und seinen Unterordnern befinden.

.VBA-Code
'Deklarationsbereich
Public objFSO As Object
Public objFolder As Object

Public astrFiles() As String

'Codemodul
Public Function FindFile(ByVal sFol As String, ByVal sFile As String, nDirs As Long, nFiles As Long) As Long
  Dim tFld As Folder
  Dim tFil As File
  Dim FileName As String
  On Error GoTo ErrorHandler
  Set objFolder = objFSO.GetFolder(sFol)
  FileName = Dir(objFSO.BuildPath(objFolder.Path, sFile), vbNormal Or vbHidden Or vbSystem Or vbReadOnly)
  nDirs = nDirs + 1
  'Debug.Print "Searching " & objFolder.Path & "   (Folder " & nDirs & ")"
  While Len(FileName) <> 0
    FindFile = FindFile + FileLen(objFSO.BuildPath(objFolder.Path, FileName))
    nFiles = nFiles + 1
    'Debug.Print "Found " & objFSO.BuildPath(objFolder.Path, FileName) & "   (File " & nFiles & ")"
    ReDim Preserve astrFiles(nFiles)
    astrFiles(nFiles) = fso.BuildPath(fld.Path, FileName)
    FileName = Dir()
  Wend
  If objFolder.SubFolders.Count > 0 Then
    For Each tFld In objFolder.SubFolders
      FindFile = FindFile + FindFile(tFld.Path, sFile, nDirs, nFiles)
    Next
  End If
  Exit Function
ErrorHandler:

  FileName = ""
  Resume Next
End Function

'*** Aufruf ***
Sub TestCall()
  Erase astrFiles        
'Array-Variable astrFiles muss explizit geleert werden, weil sie Public ist

  Set objFSO = CreateObject("Scripting.FileSystemObject")
  Debug.Print "Grösse der gefundenen Dateien in Bytes: " & FindFile("C:\Daten", "A*.xls", 0, 0)
  On Error Resume Next   'Falls die Array-Variable astrFiles leer ist
  Debug.Print "Anzahl gefundene Dateien: " & UBound(astrFiles)
  Debug.Print "Erste gefundene Datei: " & astrFiles(1)
  Set objFSO = Nothing
End Sub

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

VBA-Spezialthema: Dateien und Ordner suchen

VBA-Spezialthema: FileSearch

 

Verwandte Codebeispiele

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

Datei in mehreren Ordnern suchen (alle Fundstellen anzeigen)

Datei über ein gesamtes Laufwerk suchen

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

To Top


Datei in mehreren Ordnern suchen (alle Fundstellen anzeigen)

.Beschreibung
Wenn Sie eine Datei in mehreren, ganz bestimmten Ordnern suchen möchten, dann empfiehlt sich der Einsatz des FileSearch-Objektes von Microsoft Office. Es besitzt die Möglichkeit, ganz ohne speziellen Programmieraufwand statt eines einzigen mehrere Ordner durchsuchen zu können. Es ist sogar möglich, zusätzlich alle Unterordner der angegebenen Ordner bei der Suche zu berücksichtigen.

» Codebeispiel #1: Sucht die Datei "Statistik.xls" in den Ordnern "C:\Daten\Januar", "C:\Daten\Februar" und "D:\Backup". Die gefundenen Dateien werden auf einem neuen Arbeitsblatt der aktiven Arbeitsmappe aufgelistet. Die Liste ist nach Dateipfad sortiert. Nebst Dateipfad wird auch der Dateiname und der Verzeichnisname aufgeführt (damit die Liste komfortabel nach diesen beiden Kriterien mit dem AutoFilter sortiert werden kann).

» Codebeispiel #2: Sucht alle Dateien mit Name "Statistik" (beliebige Dateinamenerweiterung) in den Ordnern "C:\Daten\Januar", "C:\Daten\Februar" und "D:\Backup", sowie in allen deren Unterordnern. Die gefundenen Dateien werden auf einem neuen Arbeitsblatt der aktiven Arbeitsmappe aufgelistet. Nebst Dateipfad werden auch Dateiname, Verzeichnisname und Dateigrösse angezeigt (damit die Liste komfortabel nach diesen Kriterien mit dem AutoFilter sortiert werden kann). Die Liste ist nach Dateigrösse sortiert.

.VBA-Code #1
Public Sub SearchFileInFolders1()
  Dim lngFiles As Integer
  Dim wksSheet As Worksheet
  Dim objFSO As Object
  With Application.FileSearch
    .NewSearch
    .LookIn = "C:\Daten\Januar;C:\Daten\Februar;D:\Backup"
    .SearchSubFolders = False
    .FileType = msoFileTypeAllFiles
    .FileName = "Statistik.xls"
    If .Execute() > 0 Then
      Set wksSheet = ActiveWorkbook.Worksheets.Add
      With wksSheet
        .Range("A1:D1").Value = Array("Nr.", "Dateipfad", "Datei", "Verzeichnis")
        .Range("A1:D1").Font.Bold = True
      End With
      Set objFSO = CreateObject("Scripting.FileSystemObject")
      For lngFiles = 1 To .FoundFiles.Count
        wksSheet.Cells(lngFiles + 1, 1).Value = lngFiles
        wksSheet.Cells(lngFiles + 1, 2).Value = .FoundFiles(lngFiles)
        wksSheet.Cells(lngFiles + 1, 3).Value = objFSO.GetFile(.FoundFiles(lngFiles)).Name
        wksSheet.Cells(lngFiles + 1, 4).Value = objFSO.GetFile(.FoundFiles(lngFiles)).ParentFolder
      Next lngFiles
      wksSheet.Columns("A:D").AutoFit
      Set objFSO = Nothing
      Set wksSheet = Nothing
    Else
      MsgBox "Es wurden keine Dateien gefunden.", vbInformation
    End If
  End With
End Sub

.VBA-Code #2
Public Sub SearchFileInFolders2()
  Dim lngFiles As Integer
  Dim wksSheet As Worksheet
  Dim objFSO As Object
  With Application.FileSearch
    .NewSearch
    .LookIn = "C:\Daten\Januar;C:\Daten\Februar;D:\Backup"
    .SearchSubFolders = True
    .FileType = msoFileTypeAllFiles
    .FileName = "Statistik.*"
    If .Execute(msoSortBySize) > 0 Then
      Set wksSheet = ActiveWorkbook.Worksheets.Add
      With wksSheet
        .Range("A1:E1").Value = Array("Nr.", "Dateipfad", "Datei", "Verzeichnis", "Grösse")
        .Range("A1:E1").Font.Bold = True
      End With
      Set objFSO = CreateObject("Scripting.FileSystemObject")
      For lngFiles = 1 To .FoundFiles.Count
        wksSheet.Cells(lngFiles + 1, 1).Value = lngFiles
        wksSheet.Cells(lngFiles + 1, 2).Value = .FoundFiles(lngFiles)
        wksSheet.Cells(lngFiles + 1, 3).Value = objFSO.GetFile(.FoundFiles(lngFiles)).Name
        wksSheet.Cells(lngFiles + 1, 4).Value = objFSO.GetFile(.FoundFiles(lngFiles)).ParentFolder
        wksSheet.Cells(lngFiles + 1, 5).Value = objFSO.GetFile(.FoundFiles(lngFiles)).Size

      Next lngFiles
      wksSheet.Columns("A:E").AutoFit
      Set objFSO = Nothing
      Set wksSheet = Nothing
    Else
      MsgBox "Es wurden keine Dateien gefunden.", vbInformation
    End If
  End With
End Sub

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

VBA-Spezialthema: Dateien und Ordner suchen

VBA-Spezialthema: FileSearch

 

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 über ein gesamtes Laufwerk suchen

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

To Top


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

.Beschreibung
...

» Codebeispiel #1: Sucht die grösste Datei.

» Codebeispiel #2: Sucht die kleinste Datei.

.VBA-Code #1
Public Sub SearchLargestFileInFolders()
  With Application.FileSearch
    .NewSearch
    .LookIn = "C:\Daten\Januar;C:\Daten\Februar;D:\Backup"
    .SearchSubFolders = False
    .FileType = msoFileTypeAllFiles
    .Filename = "EineMappe.xls"
    If .Execute(msoSortBySize) > 0 Then
      MsgBox "Grösste Datei '" & .Filename & "' gefunden." & vbCrLf & vbCrLf & _
          "Dateipfad: " & .FoundFiles(1) & vbCrLf & _
          "Dateigrösse: " & Format$(FileLen(.FoundFiles(1)), "#,##0") & " Bytes", vbInformation
    Else
      MsgBox "Die Datei wurde nicht gefunden.", vbInformation
    End If
  End With
End Sub

.VBA-Code #2
Public Sub SearchSmallestFileInFolders()
  With Application.FileSearch
    .NewSearch
    .LookIn = "C:\Daten\Januar;C:\Daten\Februar;D:\Backup"
    .SearchSubFolders = False
    .FileType = msoFileTypeAllFiles
    .Filename = "EineMappe.xls"
    If .Execute(msoSortBySize, msoSortOrderDescending) > 0 Then
      MsgBox "Kleinste Datei '" & .Filename & "' gefunden." & vbCrLf & vbCrLf & _
          "Dateipfad: " & .FoundFiles(1) & vbCrLf & _
          "Dateigrösse: " & Format$(FileLen(.FoundFiles(1)), "#,##0") & " Bytes", vbInformation
    Else
      MsgBox "Die Datei wurde nicht gefunden.", vbInformation
    End If
  End With
End Sub

To Top


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

.Beschreibung
Mit dieser kleinen Funktion kann überprüft werden, ob ein Pfadname ein UNC-Pfad ist. Die Funktion gibt entweder Wahr (True) oder Falsch (False) zurück.

.VBA-Code
Public Function IsUNCName(ByVal strPath As String) As Boolean
  Const strUNCPattern As String = "\\//\"   'Prüfen nach \\, //, \/, /\
  IsUNCName = CBool((InStr(strUNCPattern, Left$(strPath, 2)) > 0) And (Len(strPath) > 1))
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox "Pfadname ist ein UNC-Pfad: " & IsUNCName("C:\Daten")

  MsgBox "Pfadname ist ein UNC-Pfad: " & IsUNCName("\\Server\Freigabe\Daten")
End Sub

.Hinweis
Die obige Funktion stammt von Microsoft. Sie ist für eine abschliessende Prüfung allerdings ein bisschen zu einfach. Wenn man als Pfad beispielsweise lediglich zwei Backslash-Zeichen ("\\") angibt, meint die Funktion bereits, es handle sich um einen UNC-Pfad. Verwenden Sie besser die GetDriveName-Methode aus der FileSystemObject-Bibliothek. Wie sie eingesetzt wird, zeigt das Codebeispiel Laufwerk aus einem UNC-Pfad extrahieren.

Verwandte Codebeispiele

UNC-Pfad eines Netzlaufwerkes ermitteln

Laufwerk aus einem UNC-Pfad extrahieren

Share-Name (Freigabename) eines Laufwerkes abfragen

To Top


Dateien eines Ordners löschen

.Beschreibung
Zum Löschen aller Dateien in einem Ordner wird die Kill-Anweisung von VBA benutzt. Die Kill-Anweisung besitzt den grossen Vorteil, dass die beiden Platzhalterzeichen ? und * unterstützt werden (allerdings nur unter Windows, nicht aber auf Macintosh!). Bedenken Sie jedoch, dass dieser Vorteil eine gewisse Gefahr mit sich bringt, weil bei unsachgemässer Verwendung eines Platzhalters im schlimmsten Fall sehr viele, gar nicht zu Löschen beabsichtigte Dateien unwiderruflich gelöscht werden. Beispielsweise löscht die Anweisung "Kill *.*" sämtliche Dateien im Windows-Verzeichnis, sofern dieses gerade das aktuelle Verzeichnis ist (kann mit CurDir abgefragt werden). Die gelöschten Dateien werden nicht in den Windows-Papierkorb verschoben - und können somit nicht mehr zurückgeholt werden.

Bitte beachten Sie auch folgende Punkte:
- Wenn der Ordner bereits leer ist oder nur noch versteckte Dateien enthält, kann Kill keine Löschung durchführen, was zum Laufzeitfehler 53 "Datei nicht gefunden" führt.
- Wenn der Ordner eine schreibgeschützte Datei enthält, so erscheint der Laufzeitfehler 75 "Fehler beim Zugriff auf Pfad/Datei", weil die Datei nicht gelöscht werden kann.
- Wenn sich im Ordner eine gesperrte, z.B. eine aktuell geöffnete Datei befindet, wird der Laufzeitfehler 70 "Zugriff verweigert" ausgegeben.
- Wenn der Pfad auf ein nicht bereites Laufwerk verweist, z.B. auf ein Diskettenlaufwerk ohne eingelegte Diskette, so tritt der Laufzeitfehler 71 "Datenträger nicht bereit" auf.

Wegen der Vielzahl möglicher Laufzeitfehler sollte im Zusammenhang mit Kill immer eine Fehlerbehandlungsroutine benutzt werden (On Error GoTo <ErrorHandler>).

.VBA-Code #1
Public Sub KillFiles1()
  Kill "C:\Daten\*.*"
End Sub

.VBA-Code #2
Public Sub KillFiles2()
  On Error GoTo ErrorHandler
  Kill "C:\Daten\*.*"
  Exit Sub
ErrorHandler:
  If Err.Number <> 0 Then
    MsgBox "Fehler " & Err.Number & " aufgetreten!", vbExclamation
  End If
  Resume Next
End Sub

.Hinweis
Mit der hier vorgestellten Kill-Anweisung können die Unterordner bzw. die in den Unterordnern liegenden Dateien nicht gelöscht werden. Wie sie eingesetzt wird, zeigt das Codebeispiel Laufwerk aus einem UNC-Pfad extrahieren.

Weitere Informationen

VBA-Befehle und -Funktionen

Phil's Office Secrets: Kompatibilität zwischen Excel für Windows und Excel für Macintosh: Kill-Anweisung

 

Verwandte Codebeispiele

Datei löschen

Mehrere Dateien löschen

Dateien eines Ordners und allen Unterordnern löschen

Unterordner eines Ordners löschen

Mehrere Dateien verschieben

Mehrere Dateien kopieren

To Top


Unterordner eines Ordners löschen

.Beschreibung
Das Löschen aller in einem Ordner vorhandenen Unterordner ist äusserst einfach, wenn man die DeleteFolder-Methode aus der FileSystemObject-Bibliothek benutzt. Man muss nur den gewünschten Ordner gefolgt von einem Backslash und einem Stern (d.h. "\*") angeben, und schon werden seine Unterordner komplett gelöscht. Der Ordner selbst sowie die in ihm enthaltenen Dateien werden bei dieser Lösung nicht gelöscht.

Wenn Sie die Unterordner ohne die FileSystemObject-Bibliothek löschen möchten, steht Ihnen eine alternative Lösung zur Verfügung: Benutzen Sie den alten MS DOS-Befehl RD bzw. RMDIR. Mit diesem kann man ganze Verzeichnisbäume löschen, indem man den Parameter "/S" angibt ("S" steht für Subdirectories). Man sollte jedoch zusätzlich den Parameter "/Q" angeben ("Q" steht für Quiet), damit keine Sicherheitsrückfrage bezüglich Löschen von Unterverzeichnissen erscheint.

Beachten Sie bitte diese zwei Punkte in Bezug auf die DeleteFolder-Methode:
1. Wenn ein Unterordner eine schreibgeschützte Datei enthält, so erscheint der Laufzeitfehler 70 "Zugriff verweigert". Der Fehler erscheint erst, wenn DeleteFolder versucht, genau diese Datei zu löschen. Alle bis zum Auftreten der Fehlermeldung bereits gelöschten Unterordner und Dateien bleiben gelöscht.
2. Wenn ein Unterordner schreibgeschützt ist, so tritt ebenfalls der Laufzeitfehler 70 "Zugriff verweigert" auf. Die in dem schreibgeschützten Unterordner enthaltenen Dateien werden gelöscht; der Unterordner selbst jedoch nicht.

Die DeleteFolder-Methode besitzt ein Argument namens Force. Damit der Laufzeitfehler 70 nicht erscheint bzw. die Schreibgeschützt-Attribute der Ordner und Dateien ignoriert werden, muss der Parameter auf True gesetzt werden (siehe Codebeispiel #2).

Achtung!
Benutzen Sie das Force-Argument mit der nötigen Vorsicht! Wenn Sie bei DeleteFolder beispielsweise irrtümlich "C:\*" angeben, so wird die gesamte Festplatte "C:" gelöscht (ausser die direkt im Stammverzeichnis C: liegenden Dateien). Eine solche Löschung kann nicht rückgängig gemacht werden.

» Das Codebeispiel #1 verwendete die DeleteFolder-Methode.

» Das Beispiel #2 benutzt ebenfalls die DeleteFolder-Methode, wobei der Force-Parameter auf True gesetzt wird, damit auch schreibgeschützte Dateien und Ordner gelöscht werden bzw. der Laufzeitfehler 70 nicht auftritt.

» Das Codebeispiel #3 löscht den Ordner "SubFolder", der sich im Ordner "C:\AlteDaten" befindet, mitsamt seinen Unterverzeichnissen anhand des MS DOS-Befehls RD bzw. RMDIR. Schalter 's': Auch Unterverzeichnisse löschen. Schalter 'q': Keine Rückfrage bei Unterverzeichnissen löschen.

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

.VBA-Code #2
Public Sub DeleteSubFolders2()
  CreateObject("Scripting.FileSystemObject").DeleteFolder "C:\AlteDaten\*", True
End Sub

.VBA-Code #3
Public Sub DeleteSubFolders3()
  ChDrive "C:"

  ChDir "C:\AlteDaten"
  Shell "CMD /C RD /S /Q SubFolder", vbMinimizeNoFocus
End Sub

.Hinweis
Codebeispiele #1 und #2: Wenn Sie den Pfad mit "C:\AlteDaten\*." oder "C:\AlteDaten\*.*" angeben, werden ebenfalls nur die Unterverzeichnisse gelöscht. Die Angabe "*.*" verleitet zur Annahme, dass auch die Dateien des angegebenen Ordners gelöscht werden, was aber nicht der Fall ist. Der Grund liegt an der Methode, die ja DeleteFolder heisst und somit ausschliesslich Ordner berücksichtigt.

Verwandte Codebeispiele

Datei löschen

Mehrere Dateien löschen

Ordner löschen

Datenträger/Laufwerk löschen

 

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Mehrfach vorhandene Dateien auflisten

.Beschreibung
Dieses Codebeispiel listet alle Dateien auf, die in einem bestimmten Suchbereich mehrfach vorhanden sind.

.VBA-Code
Public Sub ListMultipleFiles()

End Sub

To Top


Datei in die Liste der zuletzt bearbeiteten Dokumente von Windows aufnehmen

.Beschreibung
Im Windows-Startmenü gibt es den Menübefehl "Dokumente", welcher eine Liste mit den zuletzt benutzten Dokumenten zeigt. Diese Liste wird von Windows verwaltet. Obwohl die Listeneinträge nichts anderes sind als gewöhnliche Verknüpfungen in Form von lnk-Dateien, die sich im Ordner "Recent" (ein Ordner im Profil-Verzeichnis des Benutzers) handelt, ist es nicht möglich, durch Erstellen einer Datei-Verknüpfung der Liste einen weiteren Eintrag hinzuzufügen. Man muss eine API-Funktion von Windows benutzen, damit eine Datei bzw. eine Verknüpfung mit der Datei eingetragen wird.

SHAddToRecentDocs 2, "C:\Daten\*.jpg"

SHAddToRecentDocs 2, "C:\Daten\Mappe*.xls"

SHAddToRecentDocs 2, "C:\Daten\??.txt"

 

Man könnte den neuen Listeneintrag auch via Windows Registry erstellen. Dies ist jedoch erheblich komplizierter als die hier vorgeschlagene Lösung.

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs

 

.VBA-Code
'Deklarationsbereich
Declare Function SHAddToRecentDocs Lib "shell32.dll" (ByVal dwFlags As Long, ByVal dwData As String) As Long

'*** Aufruf ***
Sub TestCall()
  SHAddToRecentDocs 2, "C:\Daten\EineMappe.xls"
End Sub

Verwandte Codebeispiele

Liste der zuletzt bearbeiteten Dokumente von Windows löschen

Zuletzt bearbeitete Dokumente von Windows auflisten

To Top


Liste der zuletzt bearbeiteten Dokumente von Windows löschen

.Beschreibung
Wenn man in Windows auf die Start-Schaltfläche klickt und dann den Eintrag "Dokumente" auswählt, erscheint eine Liste derjenigen Dokumente, die zuletzt bearbeitet wurden. Diese Liste lässt sich sehr einfach leeren. Da es sich bei der Liste um nichts anderes als einen Ordner handelt, kann man die in diesem Ordner anhand der Kill-Anweisung von VBA löschen. Den Pfad des Ordners erhält man am einfachsten über die SpecialFolders-Auflistung der Windows Script Host-Objektbibliothek.

.VBA-Code
Public Sub ClearRecentDocumentsList()
  Dim strRecentFolder As String
  Dim objWSHShell As Object
  Set objWSHShell = CreateObject("WScript.Shell")
  strRecentFolder = objWSHShell.SpecialFolders("recent")
  Kill strRecentFolder & "\*.*"

  Set objWSHShell = Nothing
End Sub

Verwandte Codebeispiele

Datei in die Liste der zuletzt bearbeiteten Dokumente von Windows aufnehmen

Zuletzt bearbeitete Dokumente von Windows auflisten

To Top


Bildschirmschoner von Windows aktivieren

.Beschreibung
Ein Bildschirmschoner von Windows ist ein Programm, welches nicht wie andere Programme als exe-Datei sondern als scr-Datei (scr steht für "Screensaver") auf der Festplatte gespeichert ist. Gewöhnlich befinden sich die scr-Dateien im Windows System-Verzeichnis. Ein Bildschirmschoner wird aktiviert, indem man die gewünschte scr-Datei ausführt, und zwar mit dem Parameter '/s' (s steht für "Start").

Hier ein Beispiel, wie der Bildschirmschoner "3D Rohre" (Datei "sspipes.scr") aufgerufen wird.

.VBA-Code
Public Sub ActivateScreensaver()
  Shell "sspipes.scr /s", vbNormalFocus

End Sub

Verwandte Codebeispiele

Bildschirmschoner von Windows ändern/einstellen

To Top


Bildschirmschoner von Windows ändern/einstellen

.Beschreibung
Auf der Registerseite "Bildschirmschoner" des Windows-Dialoges "Eigenschaften von Anzeige" kann der Bildschirmschoner ausgewählt und eingestellt werden. Dieser Dialog kann auch mit VBA geöffnet und der aktuelle Bildschirmschoner angezeigt werden.

Welcher Bildschirmschoner gerade eingestellt ist, ist in der Windows-Registry eingetragen. Der Registry-Schlüssel heisst "HKEY_CURRENT_USER\Control Panel\Desktop" und der Eintrag für den Dateinamen des Schoners "SCRNSAVE.EXE".

C:\Windows\System32\sspipes.scr

rundll32.exe desk.cpl,InstallScreenSaver %l

Shell "rundll32.exe desk.cpl,InstallScreenSaver "

 

.VBA-Code
Public Sub InstallScreensaver()
  Dim strRC As String
  Dim objWSHShell As Object
  Set objWSHShell = CreateObject("WScript.Shell")
  strRC = objWSHShell.RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\SCRNSAVE.EXE")
  Set objWSHShell = Nothing
  Shell "rundll32.exe desk.cpl,InstallScreenSaver " & strRC

End Sub

Verwandte Codebeispiele

Bildschirmschoner von Windows aktivieren

To Top


Versionsinformationen einer ausführbaren Datei abfragen

.Beschreibung
Jede ausführbare Datei

exe

dll

olb

scr

cpl

sys (nicht alle)

drv

oxc

acm

tsp

vwp

com (nicht alle)

.VBA-Code
Public Sub GetFileVersionInfo()

End Sub

Verwandte Codebeispiele

Versionsnummer einer ausführbaren Datei abfragen

Ziel-Betriebssystem einer ausführbaren Datei abfragen

Excel-Version ermitteln

Version der installierten Microsoft Excel-Anwendung ermitteln

To Top


Prüfen, ob ein Laufwerk verfügbar und bereit ist

.Beschreibung
Wenn Sie überprüfen wollen, ob ein bestimmtes Laufwerk verfügbar und bereit ist, benutzen Sie am besten die für diesen Zweck angebotenen Möglichkeiten der FileSystemObject-Bibliothek. Dieses Codebeispiel zeigt, wie kontrolliert werden kann, ob ein Laufwerk verfügbar ist, und falls ja, ob es bereit ist.

.VBA-Code
Public Sub IsDriveAvailableAndReady()
  On Error Resume Next
  If CreateObject("Scripting.FileSystemObject").GetDrive("F:").IsReady = True Then
    If Err.Number = 68 Then
      MsgBox "Das Laufwerk ist nicht verfügbar."
      Err.Clear
    Else
      MsgBox "Das Laufwerk ist verfügbar und bereit."
    End If
  Else
    MsgBox "Das Laufwerk ist verfügbar aber nicht bereit."
  End If
End Sub

Verwandte Codebeispiele

Prüfen, ob das Laufwerk A: bereit ist

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

 

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Prüfen, ob ein Ordner schreibgeschützt ist

.Beschreibung
...

.VBA-Code
Public Sub IsFolderReadOnly()
  If GetAttr("C:\Daten") And vbReadOnly Then

    MsgBox "Der Ordner ist schreibgeschützt."
  End If
End Sub

Verwandte Codebeispiele

Prüfen, ob eine Datei schreibgeschützt ist

 

Weitere Informationen

VBA-Befehle und -Funktionen

To Top


Prüfen, ob ein Pfad ein Laufwerk darstellt

.Beschreibung
...

Funktioniert nur bei Nicht-FAT-Laufwerken.

.VBA-Code
Public Sub IsDrive()
  If GetAttr("D:\") = 22 Then
    MsgBox "Der Pfad stellt ein Laufwerk dar."
  End If
End Sub

Weitere Informationen

VBA-Befehle und -Funktionen

To Top


Anzahl Unterordner eines Ordners abfragen

.Beschreibung
Anzahl direkte Unterordner.

...

.VBA-Code
Public Sub GetNumberOfSubFolders()
  MsgBox CreateObject("Scripting.FileSystemObject").GetFolder("C:\Daten").SubFolders.Count

End Sub

Weitere Informationen

VBA-Spezialthema: FileSystemObject (FSO)

To Top


Ordner suchen (erste Fundstelle anzeigen)

.Beschreibung
Das Suchen eines Ordners in allen Unterordnern eines bestimmten Ordners oder sogar auf einem gesamten Laufwerk lässt sich anhand einer rekursiven Suchfunktion recht einfach bewerkstelligen. Der hier vorgestellte Programmcode zeigt, wie ein Ordner in Unterordnern gesucht wird. Beim Antreffen eines Ordners, dessen Name mit dem gesuchten Ordner übereinstimmt, wird die Suche abgebrochen und der Pfad des gefundenen Ordners angezeigt. Die Platzhalterzeichen * und ? dürfen im Suchbegriff verwendet werden.

Im Beispiel wird ein Ordner gesucht, dessen Name mit "Monat" beginnt und sich im Verzeichnis "C:\Daten" befindet.

.VBA-Code
'Codemodul
Public Function SearchFolder(Foldername As String, StartPath As String, FolderList As Collection) As Long
  Dim SubFolderList As New Collection
  Dim strResult As String
  Dim lngCounter As Long
  On Error Resume Next
  If Right(StartPath, 1) <> "\" Then
    StartPath = StartPath & "\"
  End If
  strResult = Dir(StartPath & Foldername, vbDirectory)
  Do While strResult <> ""
    If strResult <> "" Then
      If GetAttr(StartPath & strResult) And vbDirectory Then
        If strResult <> "." And strResult <> ".." Then
          FolderList.Add StartPath & strResult, StartPath & strResult
          SearchFolder = FolderList.Count

          Exit Function
        End If
      End If
    End If
    strResult = Dir()
  Loop
  strResult = Dir(StartPath & "*", vbDirectory)
  Do While strResult <> ""
    If GetAttr(StartPath & strResult) And vbDirectory Then
      If strResult <> "." And strResult <> ".." Then
        SubFolderList.Add StartPath & strResult, strResult
      End If
    End If
    strResult = Dir()
  Loop
  For lngCounter = 1 To SubFolderList.Count

    If FolderList.Count > 0 Then Exit For
    SearchFolder Foldername, SubFolderList(lngCounter), FolderList
  Next lngCounter
  SearchFolder = FolderList.Count
End Function

'*** Aufruf ***
Sub TestCall()
  Dim colList As New Collection
  Dim lngCounter As Long

  For lngCounter = 1 To SearchFolder("Monat*", "C:\Daten", colList)
    MsgBox colList(lngCounter)
  Next lngCounter

End Sub

Verwandte Codebeispiele

Ordner suchen (alle Fundstellen anzeigen)

 

Weitere Informationen

VBA-Befehle und -Funktionen

To Top


Ordner suchen (alle Fundstellen anzeigen)

.Beschreibung
Das Suchen eines Ordners in allen Unterordnern eines bestimmten Ordners oder sogar auf einem gesamten Laufwerk lässt sich anhand einer rekursiven Suchfunktion recht einfach bewerkstelligen.

.VBA-Code
'Codemodul
Public Function SearchFolder(Foldername As String, StartPath As String, FolderList As Collection) As Long
  Dim SubFolderList As New Collection
  Dim strResult As String
  Dim lngCounter As Long
  On Error Resume Next
  If Right(StartPath, 1) <> "\" Then
    StartPath = StartPath & "\"
  End If
  strResult = Dir(StartPath & Foldername, vbDirectory)
  Do While strResult <> ""
    If strResult <> "" Then
      If GetAttr(StartPath & strResult) And vbDirectory Then
        If strResult <> "." And strResult <> ".." Then
          FolderList.Add StartPath & strResult, StartPath & strResult
        End If
      End If
    End If
    strResult = Dir()
  Loop
  strResult = Dir(StartPath & "*", vbDirectory)
  Do While strResult <> ""
    If GetAttr(StartPath & strResult) And vbDirectory Then
      If strResult <> "." And strResult <> ".." Then
        SubFolderList.Add StartPath & strResult, strResult
      End If
    End If
    strResult = Dir()
  Loop
  For lngCounter = 1 To SubFolderList.Count
    SearchFolder Foldername, SubFolderList(lngCounter), FolderList
  Next lngCounter
  SearchFolder = FolderList.Count
End Function

'*** Aufruf ***
Sub TestCall()
  Dim colList As New Collection
  Dim lngCounter As Long

  For lngCounter = 1 To SearchFolder("Monat*", "C:\Daten", colList)
    MsgBox colList(lngCounter)
  Next lngCounter

End Sub

Verwandte Codebeispiele

Ordner suchen (erste Fundstelle anzeigen)

 

Weitere Informationen

VBA-Befehle und -Funktionen

To Top


Codemodul eines VBA-Projektes als Datei exportieren

.Beschreibung
Dieses Beispiel zeigt, wie ein Codemodul eines VBA-Projektes exportiert werden kann.

.VBA-Code
Public Sub ExportModule()
  Application.VBE.ActiveVBProject.VBComponents("Modul1").Export "C:\Daten\Modul1.bas"
End Sub

To Top


Verweise eines VBA-Projektes auflisten

.Beschreibung
Die hier vorgestellte Prozedur dient zum Erstellen einer Liste der Verweise eines VBA-Projektes.

.VBA-Code
Public Sub ListProjectReferences()
  Dim intCounter As Integer
  Dim objReference As Object
  Dim wksSheet As Worksheet
  Set wksSheet = ActiveWorkbook.Worksheets.Add
  With wksSheet
    .Range("A1:H1").Value = Array("Verweis", "Datei", "Beschreibung", "Integriert", "Vorhanden", "GUID", "Version", "Typ")
    .Range("A1:H1").Font.Bold = True
    intCounter = 1
    For Each objReference In Application.VBE.ActiveVBProject.References
      intCounter = intCounter + 1
      .Cells(intCounter, 1).Value = objReference.Name
      .Cells(intCounter, 2).Value = objReference.FullPath
      If objReference.Description <> "" Then
        .Cells(intCounter, 3).Value = objReference.Description
      Else
        .Cells(intCounter, 3).Value = objReference.Name
      End If
      If objReference.BuiltIn = True Then
        .Cells(intCounter, 4).Value = "Ja"
      Else
        .Cells(intCounter, 4).Value = "Nein"
      End If
      If objReference.IsBroken = False Then
        .Cells(intCounter, 5).Value = "Ja"
      Else
        .Cells(intCounter, 5).Value = "Nein"
      End If
      .Cells(intCounter, 6).Value = objReference.GUID
      .Cells(intCounter, 7).Value = "'" & objReference.Major & "." & objReference.Minor
      If objReference.Type = 0 Then
        .Cells(intCounter, 8).Value = "Bibliothek"
      ElseIf objReference.Type = 1 Then
        .Cells(intCounter, 8).Value = "Projekt"
      Else
        .Cells(intCounter, 8).Value = "(Unbekannt)"
      End If
    Next
    .Range("A1:H1").EntireColumn.AutoFit
    .Range("A1:A" & CStr(intCounter)).EntireRow.AutoFit
  End With
  Set wksSheet = Nothing
End Sub

To Top


Programmbibliothek (DLL) registrieren

.Beschreibung
Registrieren von dll- und ocx-Dateien.

Im Beispiel wird die Datei "C:\Windows\System32\Eine DLL-Datei.dll" registriert.

.VBA-Code
Public Sub RegisterDLL()
  Const strDLLFile As String = "C:\Windows\System32\Eine DLL-Datei.dll"
  Shell "regsvr32.exe /s " & Chr$(34) & strDLLFile & Chr$(34), vbHide
End Sub

Verwandte Codebeispiele

Klassenbibliothek registrieren

To Top


Klassenbibliothek registrieren

.Beschreibung
Klassenbibliotheken enthalten Klassen, die in einem VBA-/VB-Programm als Objekte instanziert werden können. Solche Bibliotheken liegen als Dateien vor, welche gewöhnlich die Dateinamenerweiterung ".tlb" oder ".olb" besitzen. Eher selten wird die Dateinamenerweiterung ".dll" verwendet, und noch seltener ".exe". Eine Datei mit der Dateinamenerweiterung "tlb" ist üblicherweise eine Typenbibliothek. Eine Datei mit der Erweiterung "olb" ist eine Objektbibliothek.

Zum Registrieren einer Typen-/Objektbibliothek stellt Microsoft ein kleines Befehlszeilen-Utility namens "Microsoft Type Library Registration Tool" (Datei regtlib.exe) zur Verfügung. Mit diesem Programm kann man tlb-, olb-, dll- und exe-Dateien registrieren bzw. deregistrieren.

regtlib [-q][-h][-u] -o <odl file> | <tlb,olb,exe or dll filename(s)>
-q indicates to produce no messages
-o register importlib typelibs found in .ODL file(s)
-h<path> Directory for help file of typelib
-u unregister the typelib

.VBA-Code
Public Sub RegisterTypeLib()
  Const strTypeLibFile As String = "C:\Windows\System32\Eine Typenbibliothek.tlb"
  Shell "regtlib.exe -q " & Chr$(34) & strTypeLibFile & Chr$(34), vbHide
End Sub

Verwandte Codebeispiele

Programmbibliothek (DLL) registrieren

To Top


Betriebssystem abfragen

.Beschreibung
Es gibt mehrere recht ähnliche Möglichkeiten, wie man das aktuell verwendete Betriebssystem bzw. die Systemplattform herausfinden kann.

» Codebeispiel #1: Suchen der Zeichenfolge "Windows" in der OperatingSystem-Eigenschaft des Application-Objektes mittels InStr-Funktion. Dieser Code funktioniert mit Microsoft Excel und Microsoft PowerPoint, aber nicht mit Microsoft Word.

» Codebeispiel #2: Wie Beispiel #1, jedoch anhand von Like mit Platzhalterzeichen '*'. Dieser Code funktioniert mit Microsoft Excel und Microsoft PowerPoint, aber nicht mit Microsoft Word.

» Codebeispiel #3: Wie Beispiel #2; diesmal wird verglichen mit "*Macintosh*" statt mit "*Windows*". Dieser Code funktioniert mit Microsoft Excel und Microsoft PowerPoint, aber nicht mit Microsoft Word.

» Codebeispiel #4: Auswerten der INFO-Funktion mit Infotyp "System" mittels Evaluate-Methode. Dieser Code funktioniert ausschliesslich mit Microsoft Excel.

.VBA-Code #1
Public Sub CheckOperatingSystem1()
  Dim strOpSys As String
  strOpSys = Application.OperatingSystem
  If InStr(strOpSys, "Windows") > 0 Then
    'Windows
  Else
    'Macintosh
  End If

End Sub

.VBA-Code #2
Public Sub CheckOperatingSystem2()
  Dim strOpSys As String
  strOpSys = Application.OperatingSystem
  If strOpSys Like "*Windows*" Then
    'Windows
  Else
    'Macintosh
  End If

End Sub

.VBA-Code #3
Public Sub CheckOperatingSystem3()
  Dim strOpSys As String
  strOpSys = Application.OperatingSystem
  If strOpSys Like "*Macintosh*" Then
    'Macintosh
  Else
    'Windows
  End If

End Sub

.VBA-Code #4
Public Sub CheckOperatingSystem4()
  If LCase(Evaluate("INFO(""System"")")) = "pcdos" Then
    'Windows
  Else
    'Macintosh
  End If
End Sub

.Hinweis
Die Umwandlung in Kleinbuchstaben mittels LCase erfolgt hier nur sicherheitshalber. In der Excel-Referenz steht, dass der Rückgabewert der Funktion die Kleinschrift verwendet, d.h. "pcdos" beziehungsweise "mac". Wenn man die INFO-Funktion jedoch in eine Zelle eingibt, so wird das Ergebnis in Grossschrift angezeigt, also "PCDOS" beziehungsweise "MAC". Theorie und Praxis stimmen somit nicht überein, weshalb man eine explizite Schriftkonvertierung anhand von LCase (oder UCase) durchführen sollte.

Man kann anstelle von "System" auch den Infotyp "Sysversion" verwenden. Dann erhält man die gleiche Zeichenfolge wie bei der Application-Eigenschaft OperatingSystem. Der Nachteil ist hierbei, dass man die Zeichenfolge - wie weiter oben beschrieben - mittels InStr oder Like noch genauer auswerten muss. Beim Infotyp "System" ist dies nicht notwendig.

Weitere Möglichkeiten das Betriebssystem zu bestimmen und Lösungen von Microsoft Word finden Sie auf dieser Seite:

Weitere Informationen

Phil's Office Secrets: Kompatibilität von Excel für Windows und Excel für Macintosh

To Top


Anzahl Druckseiten eines Arbeitsblattes ermitteln

.Beschreibung
Mit einer einfachen Excel 4.0-Makrofunktion lässt sich die Anzahl Druckseiten eines beliebigen Arbeitsblattes ermitteln. Das gewünschte Arbeitsblatt muss für die Abfrage aktiv sein. Das Codebeispiel ermittelt die Anzahl Seiten des aktiven Blattes.

.VBA-Code
Public Sub GetNumberOfPages()
  MsgBox "Anzahl Druckseiten: " & ExecuteExcel4Macro("GET.DOCUMENT(50)")
End Sub

Verwandte Codebeispiele

Anzahl Druckseiten einer gesamten Arbeitsmappe abfragen

To Top


Komprimierungsgrösse einer komprimierten Datei ermitteln

.Beschreibung
Die neueren Windows-Betriebssystemversionen wie Windows NT 4, Windows 2000, Windows XP usw. unterstützen die Komprimierung von einzelnen Dateien. Mit einer speziellen API-Funktion kann die komprimierte Grösse (also quasi der reduzierte Speicherplatzbedarf auf dem Datenträger) abgefragt werden.

.VBA-Code
'Deklarationsbereich
Declare Function GetCompressedFileSize Lib "kernel32" Alias "GetCompressedFileSizeA" _
   (ByVal lpFileName As String, lpFileSizeHigh As Long) As Long

Public Sub GetCompressedSize()
  MsgBox "Komprimierte Grösse der Datei: " & GetCompressedFileSize("C:\Daten\EineMappe.xls", 0&)
End Sub

.Hinweis
Die komprimierte Grösse kann verständlicherweise nur dann geliefert werden, wenn die Datei tatsächlich komprimiert ist. Das können Sie mit der GetAttr-Funktion von VBA in Verbindung mit dem Wert 2048 herausfinden. Mehr dazu siehe unter anderem hier:

Verwandte Codebeispiele

Prüfen, ob eine Datei komprimiert ist

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

To Top


Pfad-Umgebungsvariable abfragen

.Beschreibung
Die Pfad-Umgebungsvariable von Windows enthält alle Verzeichnispfade, die bei der Suche nach einer Datei eingeschlossen werden sollen. Die einfachste Variante, an den Inhalt dieser Variable zu kommen, stellt die Verwendung der Environ-Funktion von VBA dar (siehe Codebeispiel #5). Die an sich "beste" Lösung zeigt das Codebeispiel #1 (bzw. #2), weil hier der Zugriff sowohl auf die Pfad-Umgebungsvariable des Systems (Windows) als auch des Prozesses (aktuelle Windows-Sitzung) möglich ist.

» Codebeispiel #1: Hier wird die Environment-Eigenschaft des Shell-Objektes aus der Windows Script Host-Objektbibliothek abgefragt. Da die Eigenschaft ein spezielles Collection-Objekt mit mehreren Werten zurückgibt, wird eine Deklaration mit "Dim objEnv As Object" notwendig - also mit dem Datentyp Object. Wenn das Environment-Argument, d.h. "SYSTEM" oder "PROCESS", falsch geschrieben wird, tritt der Laufzeitfehler 5 "Unzulässiger Prozeduraufruf oder ungültiges Argument" auf.

» Codebeispiel #2: Das Codebeispiel #2 zeigt den gleichen Lösungsansatz wie Beispiel #1 und macht auch das gleiche. Da hier auf ein Collection-Objekt verzichtet wird, muss das gewünschte Element ("PATH") unmittelbar nach der Klammer der Enviromnent-Eigenschaft angegeben werden. Diese Schreibweise ist etwas ungewöhnlich, funktioniert aber tadellos.

» Codebeispiel #3: Diese Lösung verwendet die ExpandEnvironmentStrings-Methode. Beachten Sie bitte, dass der Bezeichner "PATH" unbedingt in Prozentzeichen (%) eingefasst werden muss. Anderenfalls wird schlicht die Zeichenfolge "PATH" anstelle der effektiven Verzeichnispfade zurückgegeben.

» Codebeispiel #4: Dieses Codebeispiel entspricht dem Codebeispiel #2 und ist lediglich eine gekürzte Fassung.

» Codebeispiel #5: Bei dieser Lösung wird die Environ-Funktion von VBA benutzt.

.VBA-Code #1
Public Sub GetEnvironmentPath1()
  Dim wshShell As Object
  Dim objEnv As Object
  Set wshShell = CreateObject("WScript.Shell")
  Set objEnv = wshShell.Environment("SYSTEM")
  MsgBox "Path-Variable von SYSTEM: " & objEnv("PATH")
  Set objEnv = wshShell.Environment("PROCESS")
  MsgBox "Path-Variable von PROCESS: " & objEnv("PATH")
  Set objEnv = Nothing
  Set wshShell = Nothing

End Sub

.VBA-Code #2
Public Sub GetEnvironmentPath2()
  MsgBox "Path-Variable von SYSTEM: " & CreateObject("WScript.Shell").Environment("SYSTEM")("PATH")
  MsgBox "Path-Variable von PROCESS: " & CreateObject("WScript.Shell").Environment("PROCESS")("PATH")

End Sub

.VBA-Code #3
Public Sub GetEnvironmentPath3()
  Dim wshShell As Object
  Set wshShell = CreateObject("WScript.Shell")
  MsgBox "Path-Variable von PROCESS: " & wshShell.ExpandEnvironmentStrings("%PATH%")
  Set wshShell = Nothing

End Sub

.VBA-Code #4
Public Sub GetEnvironmentPath4()
  MsgBox "Path-Variable von PROCESS: " & CreateObject("WScript.Shell").ExpandEnvironmentStrings("%PATH%")
End Sub

.VBA-Code #5
Public Sub GetEnvironmentPath5()
  MsgBox "Path-Variable von PROCESS: " & Environ("PATH")
End Sub

.Hinweis
Bitte beachten Sie, dass die Environ-Funktion auf dem Macintosh nicht verfügbar ist. Wird sie trotzdem auf dem Macintosh verwendet, tritt der Laufzeitfehler 5 "Unzulässiger Prozeduraufruf oder ungültiges Argument" auf. Da es auf dem Mac keine Umgebungsvariablen analog zu Windows gibt, können auch die anderen hier vorgestellten Lösungen nicht benutzt werden.

Verwandte Codebeispiele

Pfad-Umgebungsvariable ändern

Umgebungsvariablen auflisten

To Top


Pfad-Umgebungsvariable ändern

.Beschreibung
Die Pfad-Umgebungsvariable lässt sich ohne weiteres ändern. Genauer gesagt wird dabei ein Verzeichnispfad aus der Variable entfernt oder ein weiteres Verzeichnis hinzugefügt.

.VBA-Code
Public Sub ModifyEnvironmentPath()

End Sub

Verwandte Codebeispiele

Pfad-Umgebungsvariable abfragen

Umgebungsvariablen auflisten

To Top


Default-Verzeichnis von Windows-Benutzern abfragen

.Beschreibung
Windows besitzt ein so genanntes Standardverzeichnis für Benutzer. Der Pfad dieses Verzeichnisses ist als Umgebungsvariable abgelegt.

.VBA-Code #1
Public Sub GetHomePath1()
  Dim wshShell As Object
  Set wshShell = CreateObject("WScript.Shell")
  MsgBox "Standardverzeichnis: " & wshShell.ExpandEnvironmentStrings("%HOMEDRIVE%") & wshShell.ExpandEnvironmentStrings("%HOMEPATH%")
  Set wshShell = Nothing
End Sub

.VBA-Code #2
Public Sub GetHomePath2()
  MsgBox "Standardverzeichnis: " & CreateObject("WScript.Shell").Environment("PROCESS")("HOMEDRIVE") & _
      CreateObject("WScript.Shell").Environment("PROCESS")("HOMEPATH")
End Sub

.VBA-Code #3
Public Sub GetHomePath3()
  MsgBox "Standardverzeichnis: " & Environ("HOMEDRIVE") & Environ("HOMEPATH")
End Sub

Weitere Informationen

VBA-Spezialthema: Windows Script Host (WSH)

VBA-Befehle und -Funktionen

To Top


Zellen mit Zellbezügen auf andere Dateien auflisten

.Beschreibung
Microsoft Excel bietet keine Standardfunktionalität für das Auflisten von externen Bezügen (Verknüpfungen andere Quelldateien). Der hier vorgestellte VBA-Code sucht alle Zellen eines Arbeitsblattes, die in der Zellformel einen Pfad enthalten und erstellt mit dem Suchergebnis eine Liste auf einem neuen Arbeitsblatt. Gesucht wird die Zeichenfolge ":\", die auf eine Pfadangabe hindeutet. Die Liste besitzt drei Spalten: Zelladresse, Zellformel und Zellwert.

.VBA-Code
'Deklarationsbereich
Public astrCellAddress() As String
Public astrCellFormula() As String
Public astrCellText() As String

'Codemodul

Public Sub ListExternalLinks()
  Dim wksSheet As Worksheet
  Dim lngFoundCounter As Integer
  Dim lngCounter As Integer
  Dim bolFoundAll As Boolean

  Erase astrCellAddress
  Erase astrCellFormula
  Erase astrCellText

  ActiveSheet.Range("A1").Select

  On Error Resume Next
  Cells.Find(What:=":\", after:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, _
      SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Activate
  If Err.Number > 0 Then
    MsgBox "Das Tabellenblatt enthält keine Zellen mit externen Bezügen.", vbInformation
    Exit Sub
  End If
  On Error GoTo 0

  lngFoundCounter = lngFoundCounter + 1
  ReDim Preserve astrCellAddress(lngFoundCounter)
  ReDim Preserve astrCellFormula(lngFoundCounter)
  ReDim Preserve astrCellText(lngFoundCounter)
  astrCellAddress(lngFoundCounter) = Selection.Address(False, False)
  astrCellFormula(lngFoundCounter) = Selection.Formula
  astrCellText(lngFoundCounter) = Selection.Text

  Do While Not bolFoundAll
    Cells.FindNext(after:=ActiveCell).Activate
    For lngCounter = 1 To lngFoundCounter
      If astrCellAddress(lngCounter) = Selection.Address(False, False) Then
        bolFoundAll = True
        Exit For
      Else
        bolFoundAll = False
      End If
    Next lngCounter

    If bolFoundAll = False Then
      lngFoundCounter = lngFoundCounter + 1
      ReDim Preserve astrCellAddress(lngFoundCounter)
      ReDim Preserve astrCellFormula(lngFoundCounter)
      ReDim Preserve astrCellText(lngFoundCounter)
      astrCellAddress(lngFoundCounter) = Selection.Address(False, False)
      astrCellFormula(lngFoundCounter) = Selection.FormulaLocal
      astrCellText(lngFoundCounter) = Selection.Text
    End If
  Loop

  Set wksSheet = ActiveWorkbook.Worksheets.Add
  With wksSheet
    .Range("A1").Value = "Zelle"
    .Range("B1").Value = "Externer Bezug"
    .Range("C1").Value = "Zellwert"
    .Range("A1:C1").Font.Bold = True
    For lngCounter = 1 To lngFoundCounter
      .Cells(lngCounter + 1, 1).Value = astrCellAddress(lngCounter)
      .Cells(lngCounter + 1, 2).Value = "'" & astrCellFormula(lngCounter)
      .Cells(lngCounter + 1, 3).Value = astrCellText(lngCounter)
    Next lngCounter
  End With
  wksSheet.Columns("A:C").AutoFit

  Set wksSheet = Nothing
End Sub

To Top


Zellbereich als Bilddatei im GIF- oder JPEG-Datei exportieren

.Beschreibung
Mit der hier vorgestellten Prozedur wird ein Zellbereich eines Arbeitsblattes als Bilddatei gespeichert. Zur Verfügung stehen die Dateiformate GIF und JPEG (bzw. JPG). In diesem Beispiel wird der benutzte Zellbereich des aktiven Arbeitsblattes verwendet.

.VBA-Code
Public Sub ExportRangeAsPicture()
  Dim chrPicture As Chart
  Dim strSheetName As String
  Application.ScreenUpdating = False
  strSheetName = ActiveSheet.Name
  ActiveSheet.Range(ActiveSheet.UsedRange.Address).CopyPicture Appearance:=xlScreen, Format:=xlPicture
  Set chrPicture = Charts.Add
  chrPicture.Paste
  chrPicture.Export Environ("Temp") & "\" & strSheetName & ".gif"   'oder ".jpg"
  Application.DisplayAlerts = False
  chrPicture.Delete
  Application.DisplayAlerts = True
  Set chrPicture = Nothing
  Application.ScreenUpdating = True

End Sub

Weitere Informationen

VBA-Spezialthema: Excel-Objektmodell

To Top


Druckbereich eines Arbeitsblattes auf andere Arbeitsblätter übernehmen

.Beschreibung
Der festgelegte Druckbereich eines Arbeitsblattes lässt sich sehr einfach auf ein anderes Arbeitsblatt anwenden.

» Im Codebeispiel #1 wird der Druckbereich des Blattes "Tabelle1" auf das Blatt "Tabelle2" übernommen.

» Das Codebeispiel #2 zeigt, wie der Druckbereich des aktiven Arbeitsblattes auf alle anderen Tabellenblätter der Arbeitsmappe übertragen wird. Nebenbei erwähnt stellen 'Spezialitäten' des Zielblattes keine Probleme dar. Es ist egal, ob das Blatt ausgeblendet oder geschützt ist, Zeilen/Spalten ausgeblendet oder Zellen verbunden sind.

.VBA-Code #1
Public Sub ApplyPrintArea1()
  Worksheets("Tabelle2").PageSetup.PrintArea = Worksheets("Tabelle1").PageSetup.PrintArea

End Sub

.VBA-Code #2
Public Sub ApplyPrintArea2()
  Dim wksSheet As Worksheet
  For Each wksSheet In ActiveWorkbook.Worksheets
    If wksSheet.Name <> ActiveSheet.Name Then
      wksSheet.PageSetup.PrintArea = ActiveSheet.PageSetup.PrintArea
    End If
  Next
End Sub

To Top


Bildobjekt in der Wiederholungszeile des Arbeitsblattes zentrieren

.Beschreibung
Mit der hier vorgestellten VBA-Prozedur wird eine Grafik (ein Bildobjekt) in der Wiederholungszeile eingemittet. Das Makro setzt voraus, dass auf dem aktiven Tabellenblatt ein Bildobjekt existiert, das den Namen "Bild" besitzt. Bei Verwendung eines anderen Namens muss die letzte Codezeile entsprechend angepasst werden.

Da zum Zentrieren der Druckbereich benötigt wird, wird er, falls noch nicht festgelegt, automatisch im Makro festgelegt. Als Bereich wird dann der benutzte Zellbereich verwendet. Vertikale Seitenwechsel werden automatisch erkannt und berücksichtigt.

.VBA-Code
Public Sub CenterPicture()
  Dim strPrintArea As String
  Dim dblPrintAreaWidth As Double
  With ActiveSheet
    If .PageSetup.PrintArea = "" Then
      'Druckbereich festlegen
      .PageSetup.PrintArea = .UsedRange.Address
    End If
    strPrintArea = .PageSetup.PrintArea
    If .VPageBreaks.Count = 0 Then
      'Breite des Druckbereiches berechnen
      dblPrintAreaWidth = _
         .Range(Left$(strPrintArea, InStr(strPrintArea, ":") - 1)).Left + _
         .Range(Mid$(strPrintArea, InStr(strPrintArea, ":") + 1)).Left + _
         .Range(Mid$(strPrintArea, InStr(strPrintArea, ":") + 1)).Width
    Else
      'Breite der ersten Seite des Druckbereiches berechnen
      dblPrintAreaWidth = _
         .Range(Left$(strPrintArea, InStr(strPrintArea, ":") - 1)).Left + _
         .Range(.VPageBreaks(1).Location.Address).Left
    End If
    'Bildobjekt auf der ersten Seite zentrieren
    .Shapes("Bild").Left = (dblPrintAreaWidth / 2) - (.Shapes("Bild").Width / 2)
  End With
End Sub

To Top


Screenshot eines Benutzerformulares in die Zwischenablage kopieren

.Beschreibung
Von Hand kann man einen Screenshot eines Benutzerformulares (UserForm) erzeugen, indem man die Tastenkombination Strg+Druck (Print Screen) drückt. Mit einem VBA-Programm geht das nicht ganz so einfach, weil es dafür weder eine entsprechende Funktion gibt noch die Tastenkombination simuliert werden kann (z.B. mittels SendKeys). Mit dem hier vorgestellten Programmcode lässt sich dies jedoch erledigen, wobei allerdings eine ganze Reihe API-Funktionen benötigt werden.

Kopieren Sie den nachstehenden VBA-Code in ein Codemodul. Fügen Sie dem VBA-Projekt ein neues Benutzerformular hinzu, von dem ein Screenshot erstellt werden soll. Rufen Sie die Prozedur MakeScreenshot zum Beispiel über eine Schaltfläche auf, die sich auf dem Benutzerformular befindet (vergleiche Prozedur TestCall am Ende des Codebeispiels).

.VBA-Code
'Deklarationsbereich
Type RECT_Type
  left As Long
  top As Long
  right As Long
  bottom As Long
End Type
Declare Function GetActiveWindow Lib "User32" () As Long
Declare Function GetDesktopWindow Lib "User32" () As Long
Declare Sub GetWindowRect Lib "User32" (ByVal Hwnd As Long, lpRect As RECT_Type)
Declare Function GetDC Lib "User32" (ByVal Hwnd As Long) As Long
Declare Function CreateCompatibleDC Lib "Gdi32" (ByVal hdc As Long) As Long
Declare Function CreateCompatibleBitmap Lib "Gdi32" (ByVal hdc As Long, ByVal nWidth As Long, _
   ByVal nHeight As Long) As Long
Declare Function SelectObject Lib "Gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Declare Function BitBlt Lib "Gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, _

   ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, _
   ByVal XSrc As Long, ByVal YSrc As Long, ByVal dwRop As Long) As Long
Declare Function OpenClipboard Lib "User32" (ByVal Hwnd As Long) As Long
Declare Function EmptyClipboard Lib "User32" () As Long
Declare Function SetClipboardData Lib "User32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Declare Function CloseClipboard Lib "User32" () As Long
Declare Function ReleaseDC Lib "User32" (ByVal Hwnd As Long, ByVal hdc As Long) As Long
Declare Function DeleteDC Lib "Gdi32" (ByVal hdc As Long) As Long
Const SRCCOPY = &HCC0020
Const CF_BITMAP = 2

'Codemodul
Public Sub MakeScreenshot()
  Dim FormHwnd As Long
  Dim DeskHwnd As Long
  Dim hdc As Long
  Dim hdcMem As Long
  Dim rect As RECT_Type
  Dim junk As Long
  Dim fwidth As Long
  Dim fheight As Long
  Dim hBitmap As Long

  DeskHwnd = GetDesktopWindow()
  FormHwnd = GetActiveWindow()
  Call GetWindowRect(FormHwnd, rect)

  fwidth = rect.right - rect.left
  fheight = rect.bottom - rect.top

  hdc = GetDC(DeskHwnd)
  hdcMem = CreateCompatibleDC(hdc)
  hBitmap = CreateCompatibleBitmap(hdc, fwidth, fheight)
  If hBitmap <> 0 Then
    junk = SelectObject(hdcMem, hBitmap)
    junk = BitBlt(hdcMem, 0, 0, fwidth, fheight, hdc, rect.left, rect.top, SRCCOPY)
    junk = OpenClipboard(DeskHwnd)
    junk = EmptyClipboard()
    junk = SetClipboardData(CF_BITMAP, hBitmap)
    junk = CloseClipboard()
  End If

  junk = DeleteDC(hdcMem)
  junk = ReleaseDC(DeskHwnd, hdc)
End Sub

'*** Aufruf ***
Sub TestCall()
  UserForm1.Repaint   '<- Hier Name des Benutzerformulares anpassen

  Call MakeScreenshot
End Sub

Verwandte Codebeispiele

Screenshot des Anwendungsfensters der aktuellen Excel-Sitzung in die Zwischenablage kopieren

Screenshot des gesamten Bildschirmes in die Zwischenablage kopieren

To Top


Screenshot des Anwendungsfensters der aktuellen Excel-Sitzung in die Zwischenablage kopieren

.Beschreibung
Mit diesem Codebeispiel wird ein Screenshot des Anwendungsfensters der aktuellen Sitzung von Microsoft Excel in die Zwischenablage kopiert.

.VBA-Code
Sub TestCall()

End Sub

Verwandte Codebeispiele

Screenshot eines Benutzerformulares in die Zwischenablage kopieren

Screenshot des gesamten Bildschirmes in die Zwischenablage kopieren

To Top


Screenshot des gesamten Bildschirmes in die Zwischenablage kopieren

.Beschreibung
Dieses Codebeispiel erstellt einen Screenshot des gesamten Bildschirminhaltes und kopiert ihn in die Zwischenablage.

.VBA-Code
'Deklarationsbereich
Type RECT_Type
  left As Long
  top As Long
  right As Long
  bottom As Long
End Type
Declare Function GetDesktopWindow Lib "User32" () As Long
Declare Sub GetWindowRect Lib "User32" (ByVal Hwnd As Long, lpRect As RECT_Type)
Declare Function GetDC Lib "User32" (ByVal Hwnd As Long) As Long
Declare Function CreateCompatibleDC Lib "Gdi32" (ByVal hdc As Long) As Long
Declare Function CreateCompatibleBitmap Lib "Gdi32" (ByVal hdc As Long, ByVal nWidth As Long, _
   ByVal nHeight As Long) As Long
Declare Function SelectObject Lib "Gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Declare Function BitBlt Lib "Gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, _

   ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, _
   ByVal XSrc As Long, ByVal YSrc As Long, ByVal dwRop As Long) As Long
Declare Function OpenClipboard Lib "User32" (ByVal Hwnd As Long) As Long
Declare Function EmptyClipboard Lib "User32" () As Long
Declare Function SetClipboardData Lib "User32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Declare Function CloseClipboard Lib "User32" () As Long
Declare Function ReleaseDC Lib "User32" (ByVal Hwnd As Long, ByVal hdc As Long) As Long
Declare Function DeleteDC Lib "Gdi32" (ByVal hdc As Long) As Long
Const SRCCOPY = &HCC0020
Const CF_BITMAP = 2

'Codemodul
Public Sub MakeScreenshot()
  Dim FormHwnd As Long
  Dim DeskHwnd As Long
  Dim hdc As Long
  Dim hdcMem As Long
  Dim rect As RECT_Type
  Dim junk As Long
  Dim fwidth As Long
  Dim fheight As Long
  Dim hBitmap As Long

  DeskHwnd = GetDesktopWindow()
  FormHwnd = DeskHwnd
  Call GetWindowRect(FormHwnd, rect)

  fwidth = rect.right - rect.left
  fheight = rect.bottom - rect.top

  hdc = GetDC(DeskHwnd)
  hdcMem = CreateCompatibleDC(hdc)
  hBitmap = CreateCompatibleBitmap(hdc, fwidth, fheight)
  If hBitmap <> 0 Then
    junk = SelectObject(hdcMem, hBitmap)
    junk = BitBlt(hdcMem, 0, 0, fwidth, fheight, hdc, rect.left, rect.top, SRCCOPY)
    junk = OpenClipboard(DeskHwnd)
    junk = EmptyClipboard()
    junk = SetClipboardData(CF_BITMAP, hBitmap)
    junk = CloseClipboard()
  End If

  junk = DeleteDC(hdcMem)
  junk = ReleaseDC(DeskHwnd, hdc)
End Sub

Verwandte Codebeispiele

Screenshot des Anwendungsfensters der aktuellen Excel-Sitzung in die Zwischenablage kopieren

Screenshot eines Benutzerformulares in die Zwischenablage kopieren

To Top


Zellbereich als Textdatei exportieren

.Beschreibung
Mit der hier vorgestellten Prozedur wird der selektierte Zellbereich des aktiven Arbeitsblattes in eine Textdatei exportiert. Der Vorteil dieser Prozedur ist, dass nur der selektierte Zellbereich und nicht das gesamte Tabellenblatt exportiert wird, alle Zellinhalte in doppelte Anführungszeichen (") geschrieben werden und  .

.VBA-Code
Public Sub ExportRangeToTextfile()
  Dim strDestFile As String
  Dim intFileNum As Integer
  Dim intColumnCount As Integer
  Dim lngRowCount As Long
  strDestFile = InputBox("Pfad- und Dateiname der Exportdatei:", "Zellbereich exportieren")
  If Trim$(strDestFile) = "" Then Exit Sub

  intFileNum = FreeFile()
  Open strDestFile For Output As #intFileNum
    For lngRowCount = 1 To Selection.Rows.Count
      For intColumnCount = 1 To Selection.Columns.Count
        Print #intFileNum, """" & Selection.Cells(lngRowCount, intColumnCount).Text & """";
        If intColumnCount = Selection.Columns.Count Then
          Print #intFileNum,
        Else
          Print #intFileNum, ",";    'Wenn notwendig das Komma durch ein Semikolon ersetzen
        End If
      Next intColumnCount
    Next lngRowCount
  Close #intFileNum
End Sub

.Hinweis
Bei einer Mehrfachselektion (mehrere Zellbereiche anhand der Strg-Taste markiert) wird nur der erste selektierte Bereich exportiert.

To Top


Dokument-Eigenschaften einer geöffneten Arbeitsmappe auflisten

.Beschreibung
Eine Microsoft Excel-Arbeitsmappe besitzt wie jedes Microsoft Office-Dokument zahlreiche Dokument-Eigenschaften. Der hier vorgestellte Programmcode fragt sämtliche Dokument-Eigenschaften der aktiven Arbeitsmappe ab und listet diese übersichtlich auf einem neuen Tabellenblatt auf. Die Liste besitzt drei Spalten: Eigenschaft, Wert und Typ.

.VBA-Code
Public Sub ListDocumentProperties()
  Dim intCounter As Integer
  Dim objDocProps As Office.DocumentProperties
  Dim wksSheet As Worksheet
  On Error Resume Next

  Set objDocProps = ActiveWorkbook.BuiltinDocumentProperties
  Set wksSheet = ActiveWorkbook.Worksheets.Add
  With wksSheet
    .Range("A1").Value = "Eigenschaft"
    .Range("B1").Value = "Wert"
    .Range("C1").Value = "Typ"
    .Range("A1:C1").Font.Bold = True
    For intCounter = 1 To objDocProps.Count
      .Cells(intCounter + 1, 1).Value = objDocProps(intCounter).Name
      .Cells(intCounter + 1, 2).Value = objDocProps(intCounter).Value
      If Err.Number <> 0 Then
        Err.Clear
        .Cells(intCounter + 1, 2).Value = "(Nicht verfügbar)"
      End If
      Select Case objDocProps(intCounter).Type
        Case 1
          .Cells(intCounter + 1, 3).Value = "Number (Zahl)"
        Case 2
          .Cells(intCounter + 1, 3).Value = "Boolean (Wahrheitswert)"
        Case 3
          .Cells(intCounter + 1, 3).Value = "Date (Datum)"
        Case 4
          .Cells(intCounter + 1, 3).Value = "String (Text)"
        Case 5
          .Cells(intCounter + 1, 3).Value = "Float (Zahl)"
      End Select
    Next intCounter
  End With
  wksSheet.Columns("A:C").AutoFit
  Set wksSheet = Nothing
  Set objDocProps = Nothing
End Sub

Verwandte Codebeispiele

Dokument-Eigenschaften der Dateien eines Ordners auflisten

To Top


Prüfen, ob ein Dateiname gültig ist

.Beschreibung
Wenn man herausfinden will, ob ein - beispielsweise vom Benutzer eingegebene - Dateiname gültig ist, so muss man überprüfen, ob der Name unerlaubte Zeichen enthält. Es gibt eine ganze Reihe verbotener Zeichen. Zudem gibt es ein paar Zeichen, die im Zusammenhang mit Microsoft Excel zwar erlaubt, aber nicht zu empfehlen sind.

Zu überprüfende Zeichen in Dateinamen:
1) Unter Windows können folgende Zeichen nicht verwendet werden:
    - Anführungszeichen (")
    - Schrägstrich (/)
    - umgekehrter Schrägstrich (\)
    - Doppelpunkt (:)
    - vertikale Linie (|)
    - Kleiner als (<)
    - Grösser als (>)
2) Das Fragezeichen (?) und der Stern (*) sind generell verboten, da diese Zeichen als Platzhalter dienen.
3) Die eckigen Klammern ([ und ]) sind in Excel-Dateinamen verboten, weil Excel dieses Zeichen in Verknüpfungsinformationen zum Einfassen des Dateinamens benutzt.
4) Bei Excel sollte man zudem kein Apostroph-Zeichen (') verwenden, weil Excel auch dieses Zeichen in Verknüpfungsinformationen benutzt.
5) Auch das Ausrufezeichen (!) ist bei Excel zu vermeiden, weil es ebenfalls in Verknüpfungsinformationen verwendet wird.

Eine Verknüpfungsinformation sieht beispielsweise so aus:
 
='C:\Daten\Excel\[Testmappe.xls]Tabelle1'!$A$4

» Das Codebeispiel #1 überprüft den eingegebenen Dateinamen, ob er unter Windows erlaubt ist.

» Das Codebeispiel #2 überprüft den eingegebenen Dateinamen, ob er für eine Microsoft Excel-Datei erlaubt ist.

.VBA-Code #1
Public Sub CheckFilenameWindows()
  Dim strFilename As String
  Dim intCounter As Integer
  strFilename = InputBox("Bitte Dateiname eingeben:", "Dateiname")
  If Trim$(strFilename) = "" Then Exit Sub
  For intCounter = 1 To Len(strFilename)
    If InStr("?*<>|/\:", Mid$(strFilename, intCounter, 1)) > 0 Or InStr(Chr$(34), Mid$(strFilename, intCounter, 1)) > 0 Then
      MsgBox "Bitte geben Sie einen gültigen Dateinamen ein." & vbCrLf & vbCrLf & _
          "Dateinamen dürfen keines dieser Zeichen enthalten:" & vbCrLf & "? * / \ : | < > """, vbInformation
      Exit Sub
    End If
  Next intCounter
End Sub

.VBA-Code #2
Public Sub CheckFilenameExcel()
  Dim strFilename As String
  Dim intCounter As Integer
  strFilename = InputBox("Bitte Excel-Dateiname eingeben:", "Dateiname")
  If Trim$(strFilename) = "" Then Exit Sub
  For intCounter = 1 To Len(strFilename)
    If InStr("?*<>|/\:[]'!", Mid$(strFilename, intCounter, 1)) > 0 Or InStr(Chr$(34), Mid$(strFilename, intCounter, 1)) > 0 Then
      MsgBox "Bitte geben Sie einen gültigen Dateinamen ein." & vbCrLf & vbCrLf & _
          "Excel-Dateinamen dürfen keines dieser Zeichen enthalten:" & vbCrLf & "? * / \ : | < > "" [ ] ' !", vbInformation
      Exit Sub
    End If
  Next intCounter
End Sub

Verwandte Codebeispiele

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

To Top


Prüfen, ob ein Dateipfad gültig ist

.Beschreibung
Ein vom Benutzer eingegebener Pfad sollte immer auf seine Gültigkeit überprüft werden.

Wenn man herausfinden will, ob ein - beispielsweise vom Benutzer eingegebene - Dateiname gültig ist, so muss man überprüfen, ob der Name unerlaubte Zeichen enthält. Es gibt eine ganze Reihe verbotener Zeichen. Zudem gibt es ein paar Zeichen, die im Zusammenhang mit Microsoft Excel zwar erlaubt, aber nicht zu empfehlen sind.

Zu überprüfende Zeichen in Dateinamen:
1) Unter Windows können folgende Zeichen nicht verwendet werden:
    - Anführungszeichen (")
    - Schrägstrich (/)
    - vertikale Linie (|)
    - Kleiner als (<)
    - Grösser als (>)
2) Das Fragezeichen (?) und der Stern (*) sind generell verboten, da diese Zeichen als Platzhalter dienen.
3) Die eckigen Klammern ([ und ]) sind in Excel-Dateinamen verboten, weil Excel dieses Zeichen in Verknüpfungsinformationen zum Einfassen des Dateinamens benutzt.
4) Bei Excel sollte man zudem kein Apostroph-Zeichen (') verwenden, weil Excel auch dieses Zeichen in Verknüpfungsinformationen benutzt.
5) Auch das Ausrufezeichen (!) ist bei Excel zu vermeiden, weil es ebenfalls in Verknüpfungsinformationen verwendet wird.

Eine Verknüpfungsinformation sieht beispielsweise so aus:
 
='C:\Daten\Excel\[Testmappe.xls]Tabelle1'!$A$4

Das Codebeispiel überprüft den vom Benutzer eingegebenen vollständigen Dateinamen (d.h. inklusive Pfad), ob er unter Windows erlaubt ist.

.VBA-Code
Public Sub CheckPathWindows()
  Dim strFilename As String
  Dim intCounter As Integer
  strFilename = InputBox("Bitte Pfad- und Dateiname eingeben:", "Pfad- und Dateiname")
  If Trim$(strFilename) = "" Then Exit Sub
  For intCounter = 1 To Len(strFilename)
    If InStr("?*<>|/\:", Mid$(strFilename, intCounter, 1)) > 0 Or InStr(Chr$(34), Mid$(strFilename, intCounter, 1)) > 0 Then
      MsgBox "Bitte geben Sie einen gültigen Dateinamen ein." & vbCrLf & vbCrLf & _
          "Dateinamen dürfen keines dieser Zeichen enthalten:" & vbCrLf & "? * / \ : | < > """, vbInformation
      Exit Sub
    End If
  Next intCounter
End Sub

Verwandte Codebeispiele

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

To Top


Arbeitsmappe unter einem anderen Dateinamen speichern

.Beschreibung
...

Eine geöffnete Arbeitsmappe kann mit der SaveAs-Methode des Workbook-Objektes unter einem anderen Dateinamen und/oder in einem anderen Verzeichnis gespeichert.

Name der geöffneten Arbeitsmappe ändert sich dadurch.

Ein bisschen erstaunlich ist, dass das Argument Filename nicht zwingend angegeben werden muss (es ist optional):
- Wird Filename nicht angegeben, speichert Excel die Arbeitsmappe mit ihrem momentan verwendeten Namen (z.B. "Buchhaltung.xls" bei einer bereits einmal gespeicherten Mappe; oder "Mappe1" bei einer neuen Mappe, wobei in diesem Fall die Dateiendung ".xls" automatisch hinzugefügt wird). Existiert im aktuellen Verzeichnis bereits eine Datei mit gleichem Namen, so erscheint die Rückfrage "Eine Datei mit dem Namen <Datei> existiert schon an diesem Platz. Soll sie ersetzt werden?".
- Wird für Filename nur ein Dateiname ohne Pfad angegeben, speichert Microsoft Excel die Arbeitsmappe im gerade aktuellen Verzeichnis (kann mit der CurDir-Funktion abgefragt werden).

Für Filename kann man entweder nichts, einen Dateinamen oder einen Dateipfad angeben, wobei bei letzterem auch relative Pfade erlaubt sind. Die alleinige Verwendung eines Verzeichnispfades - also ohne Angabe des Dateinamens - ist nicht möglich. Genau genommen ist es schon möglich, nur betrachtet Excel die Zeichen nach dem letzten Backslash als Dateiname. Wenn Sie beispielsweise eine Mappe mit ihrem derzeitigen Dateinamen im Verzeichnis "C:\Daten\Statistik" speichern möchten und daher bei SaveAs nur "C:\Daten\Statistik" angeben, wird die Mappe als Datei "Statistik.xls" im Verzeichnis "C:\Daten" gespeichert. Mehr dazu siehe Codebeispiel #2.

Beachten Sie, dass je nach Situation ein anderes Standard-Dateiformat verwendet wird (wenn das FileFormat-Argument nicht angegeben ist):
- Beim Speichern einer bereits einmal gespeicherten Arbeitsmappe ist das Standardformat das zuletzt angegebene Dateiformat. Wenn beispielsweise eine Arbeitsmappe, welche zuletzt mit dem Dateityp "Microsoft Excel 5.0/95-Arbeitsmappe" gespeichert wurde, mit der SaveAs-Methode gespeichert wird, bleibt der Dateityp unverändert auf "Microsoft Excel 5.0/95-Arbeitsmappe".
- Beim erstmaligen Speichern einer neuen Arbeitsmappe wird standardmässig das Dateiformat für Arbeitsmappen der eingesetzten Excel-Version verwendet. Entgegen weit verbreiteter Meinung wird also nicht das im Optionen-Dialog eingestellte bzw. das anhand der DefaultSaveFormat-Eigenschaft des Application-Objektes festgelegte Dateiformat verwendet.

Speichern ohne Namensänderung der geöffneten Mappe: SaveCopyAs

Es wird empfohlen, für die erstmalige Speicherung einer neuen Arbeitsmappe generell die SaveAs-Methode zu benutzen, damit Dateiname und Speicherort der Arbeitsmappe angegeben werden können. Bei der Save-Methode ist dies nicht möglich.

» Codebeispiel #1: Speichert die aktive Arbeitsmappe im Verzeichnis "C:\Daten" als Datei "EineMappe.xls".

» Codebeispiel #2: Speichert die aktive Arbeitsmappe im Verzeichnis "C:\Backup" mit ihrem bisherigen Dateinamen. Wenn die Mappe noch nie gespeichert wurde, wird als Dateiname der Name der Arbeitsmappe (z.B. "Mappe1") mit Dateinamenerweiterung ".xls" verwendet.

» Codebeispiel #3:

» Codebeispiel #4:

 

 

.VBA-Code #1
Public Sub WorkbookSaveAs1()
  ActiveWorkbook.SaveAs "C:\Daten\EineMappe.xls"

End Sub

.VBA-Code #2
Public Sub WorkbookSaveAs2()
  ActiveWorkbook.SaveAs "C:\Backup\" & ActiveWorkbook.Name

End Sub

.VBA-Code #3
Public Sub WorkbookSaveAs3()
  ActiveWorkbook.SaveAs

End Sub

.VBA-Code #4
Public Sub WorkbookSaveAs4()
  ActiveWorkbook.SaveAs "EineMappe.xls"

End Sub

.VBA-Code #5
Public Sub WorkbookSaveAs5()
  ActiveWorkbook.SaveAs "EineMappe"

End Sub

.VBA-Code #6
Public Sub WorkbookSaveAs6()
  ActiveWorkbook.SaveAs CreateObject("WScript.Shell").SpecialFolders("mydocuments") & "\" & ActiveWorkbook.Name

End Sub

.VBA-Code #7
Public Sub WorkbookSaveAs7()
  ActiveWorkbook.SaveAs "..\EineMappe.xls"

End Sub

.VBA-Code #8
Public Sub WorkbookSaveAs8()
  ActiveWorkbook.SaveAs "Backup\EineMappe.xls"

End Sub

Verwandte Codebeispiele

Arbeitsmappe speichern

Standard-Dateityp für neue Arbeitsmappen abfragen/ändern

Arbeitsmappe mit einem anderen Dateiformat speichern

Prüfen, ob eine Arbeitsmappe bereits einmal gespeichert wurde

Arbeitsmappe als Sicherungskopie speichern

 

Weitere Informationen

Excel-Objektmodell: Methoden des Workbook-Objektes

To Top


Arbeitsmappe unter einem anderen Dateinamen speichern mit Sicherungsdatei erstellen

.Beschreibung
...

Durch das Speichern der Mappe ändert sich ihr (Datei-)Name.

Durch das Setzen von CreateBackup auf True wird eine Sicherungsdatei angelegt. Der Effekt ist der gleiche, wie wenn man im Dialog "Speichern-Optionen" von Microsoft Excel die Option "Sicherungsdatei erstellen" aktiviert.

.VBA-Code #1
Public Sub WorkbookSaveAs1()
  ActiveWorkbook.SaveAs "C:\Daten\EineMappe.xls", , , , , True

End Sub

.VBA-Code #2
Public Sub WorkbookSaveAs2()
  ActiveWorkbook.SaveAs Filename:="C:\Daten\EineMappe.xls", CreateBackup:=True

End Sub

Verwandte Codebeispiele

Arbeitsmappe unter einem anderen Dateinamen speichern

Arbeitsmappe als Sicherungskopie speichern

Arbeitsmappe speichern

Standard-Dateityp für neue Arbeitsmappen abfragen/ändern

Prüfen, ob eine Arbeitsmappe bereits einmal gespeichert wurde

 

Weitere Informationen

Excel-Objektmodell: Methoden des Workbook-Objektes

To Top


Arbeitsmappe als Sicherungskopie speichern

.Beschreibung
Wenn man eine Arbeitsmappe mit SaveCopyAs speichert, ändert sich der Name der geöffneten Arbeitsmappe nicht.

Das Argument FileName der SaveCopyAs-Methode ist gemäss der im Excel-Objektmodell abgelegten Parameter-Definition ein optionales Argument, laut der Onlinehilfe (Excel VBA-Referenz) dagegen zwingend erforderlich. Wird das Argument nicht spezifiziert, erscheint tatsächlich der Laufzeitfehler 1004 "Anwendungs- oder objektdefinierter Fehler".

Durch das Speichern einer Mappe mittels SaveCopyAs wird die Saved-Eigenschaft nicht verändert.

Interessant ist das Verhalten von SaveCopyAs je nach Inhalt des Argumentes FileName:
- Bei Angabe eines Dateinamens ohne Verzeichnis (z.B. FileName:="MyCopy.xls") wird eine Kopie der Mappe unter dem angegebenen Dateinamen im Standard-Arbeitsordner gespeichert.
- Bei Angabe eines eigentlich ungültigen oder leeren Dateinamens (z.B. bei 'FileName:=varDummy', wobei varDummy eine nicht initialisierte Variable ist; oder auch ganz einfach bei 'FileName:=""') erstellt Excel eine Arbeitsmappendatei im temporären Verzeichnis von Windows und gibt dieser Datei automatisch einen Namen, der aus einer fortlaufenden Nummer und der Dateinamenerweiterung ".tmp" zusammengesetzt wird. Die fortlaufende Nummer ist eine Zahl, die basierend auf den bereits im Temp-Verzeichnis existierenden tmp-Dateien ermittelt wird. Ist beispielsweise eine Datei mit dem Namen "3.tmp" bereits vorhanden, so erhält die nächste mit SaveCopyAs ohne Parameter gespeicherte Arbeitsmappe den Dateinamen "4.tmp".

.VBA-Code
Public Sub WorkbookSaveCopyAs()
  ActiveWorkbook.SaveCopyAs "C:\Daten\EineMappe.xls"

End Sub

Verwandte Codebeispiele

Arbeitsmappe unter einem anderen Dateinamen speichern

Arbeitsmappe unter einem anderen Dateinamen speichern mit Sicherungsdatei erstellen

Arbeitsmappe speichern

Standard-Dateityp für neue Arbeitsmappen abfragen/ändern

Prüfen, ob eine Arbeitsmappe bereits einmal gespeichert wurde

 

Weitere Informationen

Excel-Objektmodell: Methoden des Workbook-Objektes

To Top


Arbeitsmappe mit einem anderen Dateiformat speichern

.Beschreibung
Eine in Micrsoft Excel geöffnete Arbeitsmappe kann im Prinzip jederzeit mit einem anderen Dateiformat gespeichert werden. Dazu muss lediglich das FileFormat-Argument der SaveAs-Methode des Workbook-Objektes entsprechend spezifiziert werden.

Diese Tabelle zeigt alle Dateiformate der Excelversionen 97 bis 2003. Vier Formate stehen nicht in allen Programmversionen zur Verfügung.

FileFormat-Konstante   FileFormat-Konstante   FileFormat-Konstante
xlAddIn   xlExcel5   xlWJ3
xlCSV   xlExcel7   xlWJ3FJ3
xlCSVMac   xlExcel9795   xlWK1
xlCSVMSDOS   xlHTML (1)   xlWK1ALL
xlCSVWindows   xlIntlAddIn   xlWK1FMT
xlCurrentPlatformText   xlIntlMacro   xlWK3
xlDBF2   xlSYLK   xlWK3FM3
xlDBF3   xlTemplate   xlWK4
xlDBF4   xlTextMac   xlWKS
xlDIF   xlTextMSDOS   xlWorkbookNormal
xlExcel2   xlTextPrinter   xlWorks2FarEast
xlExcel2FarEast   xlTextWindows   xlWQ1
xlExcel3   xlUnicodeText (1)   xlXMLSpreadsheet (2)
xlExcel4   xlWebArchive (2)    
xlExcel4Workbook   xlWJ2WD1    

- Die mit (1) markierten Konstanten stehen in Excel 97 nicht zur Verfügung.
- Die mit (2) markierten Konstanten stehen nur in Excel 2003 zur Verfügung.

Dieses Beispiel speichert die aktive Arbeitsmappe mit dem Dateiformat xlExcel7 (Microsoft Excel 95-Arbeitsmappe).

.VBA-Code
Public Sub WorkbookSaveWithOtherFormat()
  ActiveWorkbook.SaveAs "C:\Daten\EineMappe.xls", xlExcel7

End Sub

Weitere Informationen

Excel-Objektmodell: Methoden des Workbook-Objektes

To Top


Arbeitsmappe unter einem anderen Dateinamen speichern und Dateikennwort zuweisen

.Beschreibung
Man kann eine Arbeitsmappe problemlos unter einem anderen Dateinamen speichern und ihr dabei ein Dateikennwort (Lese-/Schreibkennwort) vergeben. Das Kennwort wird zugewiesen, indem man für das Password-Argument der SaveAs-Methode des Workbook-Objektes ein Kennwort angibt.

Bitte beachten Sie, dass
- der Name der geöffneten Arbeitsmappe sich dadurch ändert
- das Kennwort zwischen Gross-/Kleinschreibung unterscheidet

.VBA-Code #1
Public Sub WorkbookSaveAsWithPassword1()
  ActiveWorkbook.SaveAs "C:\Daten\EineMappe.xls", , "Sommer"

End Sub

.VBA-Code #2
Public Sub WorkbookSaveAsWithPassword2()
  ActiveWorkbook.SaveAs Filename:="C:\Daten\EineMappe.xls", Password:="Sommer"

End Sub

Weitere Informationen

Excel-Objektmodell: Methoden des Workbook-Objektes

To Top


Standardarbeitsordner von Microsoft Excel abfragen/ändern

.Beschreibung
...

Den Standardarbeitsordner von Microsoft Excel erhält man über die DefaultFilePath-Eigenschaft des Application-Objektes. Die Eigenschaft kann sowohl gelesen als auch gesetzt werden.

Bitte beachten Sie, dass DefaultFilePath leer sein kann, d.h. kein Standardarbeitsordner festgelegt wurde:

- Im Optionen-Dialog von Microsoft Excel ist in diesem Fall das Eingabefeld "Standardarbeitsordner" tatsächlich leer. Auch der entsprechende Registry-Eintrag "DefaultPath" ist leer.

- Beim Aufrufen des "Öffnen"- und "Speichern unter"-Dialoges wird gewöhnlich der Standardarbeitsordner als Vorgabe angezeigt. Da dieser nicht festgelegt ist, wird das aktuelle Verzeichnis verwendet.

- Beim Excel-Programmstart wird das aktuelle Verzeichnis automatisch auf den Standardarbeitsordner gewechselt. Da dieser nicht festgelegt ist, bleibt das aktuelle Verzeichnis unverändert. Dieses kann - je nach Art des Excelstarts - unterschiedlich lauten:
· Start über Dateiverknüpfung mit "Arbeitsordner": Unabhängig vom Speicherort der Verknüpfung -> Verzeichnis gemäss "Arbeitsordner".
· Start über Dateiverknüpfung ohne "Arbeitsordner": 1) Bei Verknüpfung auf Desktop, Startmenü oder Menü "Programme" -> Verzeichnis des Desktop. 2) Bei Verknüpfung in einem Ordner -> Verzeichnis dieses Ordners.
· Start über "Ausführen": Verzeichnis gemäss Standardverzeichnis für Windows-Benutzer. Abgelegt als Umgebungsvariable "HOMEPATH".

 

Es kann auch ein nicht existierender oder ungültiger Ordnerpfad zugewiesen werden, ohne dass eine Fehlermeldung erscheint. Der (fehlerhafte) Standardarbeitsordner wird in der Registry gespeichert, jedoch beim nächsten Excelstart automatisch auf einen gültigen Ordner geändert, und zwar auf den Verzeichnispfad des "Eigene Dateien"-Ordners (z.B. "D:\WINNT\Profiles\Administrator\Eigene Dateien"). Es wird genau dieser Ordner verwendet, weil er der Standardarbeitsordner für alle Microsoft Office-Dokumente und -Dateien ist.

 

.VBA-Code #1
Public Sub GetDefaultFilePath()
  MsgBox "Standardarbeitsordner von Excel: " & Application.DefaultFilePath

End Sub

.VBA-Code #2
Public Sub SetDefaultFilePath()
  Application.DefaultFilePath = "C:\Daten"

End Sub

.VBA-Code #3
Public Sub GetDefaultFilePathProcess()
  Dim objWSHShell As Object
  Dim varEnvironment As Variant
  Set objWSHShell = CreateObject("WScript.Shell")
  For Each varEnvironment In objWSHShell.Environment("PROCESS")
    MsgBox "Standardarbeitsordner von Excel: " & Mid$(varEnvironment, 5)
    Exit For
  Next
  Set objWSHShell = Nothing
End Sub

Weitere Informationen

Excel-Objektmodell: Eigenschaften des Application-Objektes

VBA-Spezialthema: Windows Script Host (WSH)

To Top


Startordner von Microsoft Excel abfragen

.Beschreibung
Der Pfad des Startordners von Microsoft Excel wird mit der StartupPath-Eigenschaft des Application-Objektes abgefragt. Der Ordnername lautet üblich "XlStart".

Bitte beachten Sie unbedingt, dass Microsoft Excel bis zu vier verschiedene Startordner unterstützt, wobei alle den gleichen Namen "XlStart" besitzen, jedoch an unterschiedlichen Orten auf der Festplatte liegen. Beim Programmstart greift Microsoft Excel nacheinander auf diese Ordner zu (sofern vorhanden) und öffnet die enthaltenen Dateien. StartupPath gibt nur den Haupt-Startordner zurück.

C:\Windows\Application Data\Microsoft\Excel\Xlstart
C:\Winnt\Profiles\<UserName>\Application Data\Microsoft\Excel\Xlstart
C:\Windows\Profiles\<UserName>\Application Data\Microsoft\Excel\Xlstart
C:\Program Files\Microsoft Office\Office\Xlstart

Die StartupPath-Eigenschaft ist schreibgeschützt. Das bedeutet, dass der Startordner kann nicht geändert werden.

.VBA-Code
Public Sub GetStartupPath()
  MsgBox "Startordner von Excel: " & Application.StartupPath

End Sub

Weitere Informationen

Excel-Objektmodell: Eigenschaften des Application-Objektes

Funktionen und Features: Startordner und zusätzlicher Startordner

 

Verwandte Codebeispiele

Zusätzlicher Startordner von Microsoft Excel abfragen/ändern

To Top


Zusätzlicher Startordner von Microsoft Excel abfragen/ändern

.Beschreibung
Im Gegensatz zum Startordner von Microsoft Excel kann man den zusätzlichen Startordner auch ändern - und nicht nur abfragen. Dazu nimmt man die AltStartupPath-Eigenschaft des Application-Objektes.

» Codebeispiel #1: Hier wird der zusätzliche Startordner von Microsoft Excel abgefragt und ausgegeben.

» Codebeispiel #2: Dieses Beispiel ändert den zusätzlichen Startordner von Microsoft Excel auf den Pfad "C:\Daten". Wenn das angegebene Verzeichnis nicht existiert, wird es trotzdem angenommen. Beim nächsten Programmstart wird es einfach ignoriert.

» Codebeispiel #3: In diesem Beispiel wird ein relativer Pfad verwendet, was - wie man sieht - problemlos funktioniert. Der angegebene Name "Backup" wird von Microsoft Excel als Ordner betrachtet, welcher sich im Office-Verzeichnis befindet (also "[..]\Programme\Microsoft Office\Office"). Der absolute Pfad lautet somit "[..]\Programme\Microsoft Office\Office\Backup". Sollte das angegebene Verzeichnis nicht existieren, wird es beim nächsten Programmstart einfach ignoriert.

.VBA-Code #1
Public Sub GetAltStartupPath()
  MsgBox "Zusätzlicher Startordner von Excel: " & Application.AltStartupPath

End Sub

.VBA-Code #2
Public Sub SetAltStartupPath1()
  Application.AltStartupPath = "C:\Daten"

End Sub

.VBA-Code #3
Public Sub SetAltStartupPath2()
  Application.AltStartupPath = "Backup"

End Sub

Verwandte Codebeispiele

Startordner von Microsoft Excel abfragen

Funktionen und Features: Startordner und zusätzlicher Startordner

 

Weitere Informationen

Excel-Objektmodell: Eigenschaften des Application-Objektes

To Top


Prüfen, ob Microsoft Excel bereits ausgeführt wird

.Beschreibung
Dieses Codebeispiel dient zum Herausfinden, ob Microsoft Excel auf dem Rechner bereits läuft.

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

'Codemodul
Public Function IsExcelRunning() As Boolean
  Dim lngHwnd As Long
  lngHwnd = FindWindow("xlmain", vbNullString)
  If lngHwnd <> 0 Then
    IsExcelRunning = True
  Else
    IsExcelRunning = False
  End If
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox "Microsoft Excel wird ausgeführt: " & IsExcelRunning()

End Sub

Verwandte Codebeispiele

Prüfen, ob zuvor gestartetes Microsoft Excel noch ausgeführt wird

To Top


Prüfen, ob zuvor gestartetes Microsoft Excel noch ausgeführt wird

.Beschreibung
...

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

'Codemodul
Public Sub CheckExcelEnd()
  Dim dblWaitTimerStart As Double
  Dim dblWaitTimerPrevious As Double
  Dim lngHwnd As Long
  Dim xlApp As Object
  Set xlApp = CreateObject("Excel.Application")
  xlApp.Caption = "MeinExcelTask"   'Eindeutiger Titel dem Anwendungsfenster zuweisen
  xlApp.Quit
  Set xlApp = Nothing
  dblWaitTimerStart = Timer
  dblWaitTimerPrevious = 0
TryAgain:
  lngHwnd = FindWindow(vbNullString, "MeinExcelTask")
  If lngHwnd <> 0 Then
    dblWaitTimerPrevious = Timer
    If dblWaitTimerPrevious - dblWaitTimerStart <= 60 Then   'Nach 60 Sekunden abbrechen
      Do
        If Timer - dblWaitTimerPrevious >= 0.5 Then    '0.5 Sekunden warten
          Exit Do
        End If
        DoEvents
      Loop
      GoTo TryAgain
    End If
  End If
End Sub

Verwandte Codebeispiele

Prüfen, ob Microsoft Excel bereits ausgeführt wird

To Top


Prüfen, ob xlb-Datei beim Beenden von Microsoft Excel vollständig aktualisiert wurde

.Beschreibung
Je nach benutzter Windows- und Excel-Version kann es ohne weiteres sein, dass es nach dem Beenden von Microsoft Excel noch ein paar Sekunden dauert, bis die xlb-Datei vollständig auf die Festplatte zurückgeschrieben worden ist. Man kann überprüfen, ob die Datei-Aktualisierung fertig ist, indem man mit der Open-Anweisung von VBA auf die xlb-Datei zugreift. Als Zugriffsmodus wird Binary Access Read Write verwendet und dabei die Datei mittels Lock Read Write vollständig gesperrt. Wenn hierbei kein Laufzeitfehler auftritt, ist die Datei verfügbar, sprich nicht mehr von Microsoft Excel benutzt.

Im nachstehenden Beispiel wird angenommen, dass die xlb-Datei "Administrator8.xlb" heisst und im Verzeichnis "C:\WinNT" liegt.

.VBA-Code
Public Function IsXLBFileSaveCompleted() As Boolean
  On Error Resume Next
  Open "C:\WinNT\Administrator8.xlb" For Binary Access Read Write Lock Read Write As #1
  Close #1
  If Err.Number = 0 Then
    IsXLBFileSaveCompleted = True
  Else
    IsXLBFileSaveCompleted = False
  End If
  On Error GoTo 0
End Function

'*** Aufruf ***
Sub TestCall()
  MsgBox "xlb-Datei wurde vollständig gespeichert: " & IsXLBFileSaveCompleted()

End Sub

Weitere Informationen

Phil's Office Secrets: Die xlb-Datei von Microsoft Excel: Warum sollte man die xlb-Datei regelmässig defragmentieren?

To Top


Prüfen, ob ein Programm installiert ist

.Beschreibung
In der Windows Registry sind gewöhnlich alle Programme vermerkt, die auf dem Computer installiert sind. Wenn man überprüfen möchte, ob ein bestimmtes Programm auf dem Rechner vorhanden ist, muss man somit nur in der Registry nachsehen. Der Schlüssel der installierten Programme lautet "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths", wobei jedes Programm einen eigenen Unterschlüssel besitzt, der den Namen der Programmdatei verwendet. Möchte man beispielsweise wissen, ob der Adobe Acrobat Reader installiert ist, muss man auf den Schlüssel "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Acrobat.exe" zugreifen.

Eintrag "Path" enthält den Pfad der exe-Datei.

 

.VBA-Code
Public Sub IsProgramInstalled()

End Sub

To Top


Pfad der exe-Datei eines installierten Programmes anhand des Dateinamens der exe-Datei ermitteln

.Beschreibung
In der Windows Registry sind gewöhnlich alle Programme vermerkt, die auf dem Computer installiert sind. Wenn man überprüfen möchte, ob ein bestimmtes Programm auf dem Rechner vorhanden ist, muss man somit nur in der Registry nachsehen. Der Schlüssel der installierten Programme lautet "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths", wobei jedes Programm einen eigenen Unterschlüssel besitzt, der den Namen der Programmdatei verwendet. Möchte man beispielsweise wissen, ob der Adobe Acrobat Reader installiert ist, muss man auf den Schlüssel "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Acrobat.exe" zugreifen.

Eintrag "Path" enthält den Pfad der exe-Datei.

 

.VBA-Code
Public Sub GetAppPathForAppEXE()

End Sub

To Top


Starten von Microsoft Excel

.Beschreibung
Microsoft Excel lässt sich ganz einfach aus VBA/VB ausführen.

» Das Codebeispiel #1 zeigt die meistens verwendete Lösungsvariante mit der Shell-Funktion von VBA. Der Nachteil von Shell ist, dass der vollständige Dateipfad der Programmdatei Excel.exe angegeben werden muss. Wenn der Dateipfad weggelassen und nur "Excel.exe" verwendet wird, tritt der Laufzeitfehler 53 "Datei nicht gefunden" auf. Der Pfad sollte möglichst nicht als Konstante im Programmcode festgelegt werden, da er je nach Computer unterschiedlich sein kann. Holen Sie stattdessen den Programmpfad aus der Windows Registry. Wie das gemacht wird, erklärt das Beispiel Pfad der Microsoft Excel-Programmdatei ermitteln. Als Alternative können Sie das nächste Codebeispiel #2 verwenden.

Der Parameter WindowStyle von Shell legt den Fensterstil des Anwendungsfensters fest. Wenn Sie den Parameter nicht angeben, wird standardmässig der Wert 2 (vbMinimizedFocus) verwendet, d.h. die Anwendung als Symbol minimiert und mit Fokus gestartet.

» Das Codebeispiel #2 verwendet anstelle von Shell die Run-Methode aus der Windows Script Host-Objektbibliothek. Der Vorteil dieser Lösung ist, dass nicht der vollständige Pfad der Programmdatei von Microsoft Excel nicht angegeben werden und somit nicht bekannt sein muss. Die Run-Methode schaut selbständig in der Windows Registry nach, wo sich die Datei "Excel.exe" auf der Festplatte befindet.

.VBA-Code #1
Public Sub RunExcel1()
  Shell "C:\Programme\Microsoft Office\Office\Excel.exe", vbNormalFocus
End Sub

.VBA-Code #2
Public Sub RunExcel2()
  CreateObject("WScript.Shell").Run "Excel.exe", vbNormalFocus
End Sub

Verwandte Codebeispiele

Starten von Microsoft Excel ohne neue leere Arbeitsmappe

Starten von Microsoft Excel mit Öffnen einer Arbeitsmappendatei

Starten von Microsoft Excel mit Öffnen mehrerer Arbeitsmappendateien

Pfad der Microsoft Excel-Programmdatei (Excel.exe) ermitteln

Starten eines anderen Office-Programmes

 

Weitere Informationen

VBA-Befehle und -Funktionen

VBA-Spezialthema: Windows Script Host (WSH)

Excel-Startparameter

To Top


Starten von Microsoft Excel mit Öffnen einer Arbeitsmappendatei

.Beschreibung
Wenn man Microsoft Excel mittels Programmcode starten und eine bestimmte Arbeitsmappe öffnen möchte, muss man lediglich in der Ausführen-Befehlszeile nach dem Programmname (Excel.exe) die gewünschte Exceldatei angeben.

» Das Codebeispiel #1 zeigt die meistens verwendete Lösungsvariante mit der Shell-Funktion von VBA. Der Nachteil von Shell ist, dass der vollständige Dateipfad der Programmdatei Excel.exe angegeben werden muss. Wenn der Dateipfad weggelassen und nur "Excel.exe" verwendet wird, tritt der Laufzeitfehler 53 "Datei nicht gefunden" auf. Der Pfad sollte möglichst nicht als Konstante im Programmcode festgelegt werden, da er je nach Computer unterschiedlich sein kann. Holen Sie stattdessen den Programmpfad aus der Windows Registry. Wie das gemacht wird, erklärt das Beispiel Pfad der Microsoft Excel-Programmdatei ermitteln. Als Alternative können Sie das unten vorgestellte Codebeispiel #3 verwenden.

» Das Codebeispiel #2 entspricht dem Beispiel #1, wobei hier die zu öffnende Datei ein bzw. mehrere Leerzeichen im Pfad-/Dateiname enthält. In diesem Fall muss die Datei in Anführungszeichen (") angegeben werden.

» Bei Codebeispiel #3 wird anstelle des Hochkommas die Chr$-Funktion mit Zeichencode 34 benutzt. Der Code 34 steht für ein Anführungszeichen (").

» Codebeispiel #4 verwendet anstelle von Shell die Run-Methode aus der Windows Script Host-Objektbibliothek. Der Vorteil dieser Lösung ist, dass der Dateipfad von "Excel.exe" nicht angegeben werden und somit nicht bekannt sein muss. Die Run-Methode schaut selbständig in der Windows Registry nach, wo sich die Datei "Excel.exe" auf der Festplatte befindet. Auch hier muss der Pfad/Dateiname der zu öffnenden Arbeitsmappe in Hochkommas geschrieben werden, wenn er Leerzeichen enthält.

.VBA-Code #1
Public Sub RunExcelAndOpenWorkbook1()
  Shell "C:\Programme\Microsoft Office\Office\Excel.exe C:\Daten\EineMappe.xls", vbNormalFocus
End Sub

.VBA-Code #2
Public Sub RunExcelAndOpenWorkbook2()
  Shell "C:\Programme\Microsoft Office\Office\Excel.exe ""C:\Daten\Eine andere Mappe.xls""", vbNormalFocus
End Sub

.VBA-Code #3
Public Sub RunExcelAndOpenWorkbook3()
  Shell "C:\Programme\Microsoft Office\Office\Excel.exe " & Chr$(34) & "C:\Daten\Eine andere Mappe.xls" & Chr$(34), vbNormalFocus
End Sub

.VBA-Code #4
Public Sub RunExcelAndOpenWorkbook4()
  CreateObject("WScript.Shell").Run "Excel.exe C:\Daten\EineMappe.xls", vbNormalFocus
End Sub

Verwandte Codebeispiele

Starten von Microsoft Excel

Starten von Microsoft Excel mit Öffnen mehrerer Arbeitsmappendateien

Starten von Microsoft Excel mit schreibgeschütztem Öffnen einer Arbeitsmappendatei

Pfad der Microsoft Excel-Programmdatei (Excel.exe) ermitteln

Starten eines anderen Office-Programmes

 

Weitere Informationen

VBA-Befehle und -Funktionen

VBA-Spezialthema: Windows Script Host (WSH)

Excel-Startparameter

To Top


Starten von Microsoft Excel mit Öffnen mehrerer Arbeitsmappendateien

.Beschreibung
Wenn man Microsoft Excel mittels Programmcode starten und mehrere bestimmte Arbeitsmappen öffnen möchte, muss man lediglich in der Ausführen-Befehlszeile nach dem Programmname (Excel.exe) die gewünschten Exceldateien angeben.

 

 

Die folgenden Beispiele öffnen jeweils drei Arbeitsmappen.

» Das Codebeispiel #1 verwendet die Shell-Funktion von VBA. Der Nachteil von Shell ist, dass der vollständige Dateipfad der Programmdatei Excel.exe angegeben werden muss. Wenn der Dateipfad weggelassen und stattdessen nur "Excel.exe" verwendet wird, tritt der Laufzeitfehler 53 "Datei nicht gefunden" auf. Die zu öffnenden Arbeitsmappen werden wie üblich mit Pfad und Dateiname übergeben. Da kein Dateipfad ein Leerzeichen enthält, müssen keine Anführungszeichen (") verwendet werden.

» Codebeispiel #2 verwendet ebenfalls die Shell-Funktion von VBA. Da der Dateiname der zweiten Arbeitsmappe ("Andere Mappe.xls") ein Leerzeichen enthält, muss diese Datei (inkl. Pfad) in Anführungszeichen (") angegeben werden.

» Das Codebeispiel #3 benutzt anstelle von Shell die Run-Methode aus der Windows Script Host-Objektbibliothek. Der Vorteil dieser Lösung ist, dass nicht der vollständige Pfad der Programmdatei von Microsoft Excel nicht angegeben werden und somit nicht bekannt sein muss. Die Run-Methode schaut selbständig in der Windows Registry nach, wo sich die Datei "Excel.exe" auf der Festplatte befindet. Auch hier muss der Pfad/Dateiname einer zu öffnenden Arbeitsmappe in Anführungszeichen geschrieben werden, wenn dieser ein/mehrere Leerzeichen enthält.

.VBA-Code #1
Public Sub RunExcelAndOpenWorkbooks1()
  Shell "C:\Programme\Microsoft Office\Office\Excel.exe C:\Daten\Mappe.xls D:\Dateien\Mappe2.xls C:\Backup\EineMappe.xls", vbNormalFocus
End Sub

.VBA-Code #2
Public Sub RunExcelAndOpenWorkbooks2()
  Shell "C:\Programme\Microsoft Office\Office\Excel.exe C:\Daten\Mappe.xls ""C:\Daten\Andere Mappe.xls"" C:\Backup\EineMappe.xls", vbNormalFocus
End Sub

.VBA-Code #3
Public Sub RunExcelAndOpenWorkbooks3()
  CreateObject("WScript.Shell").Run "Excel.exe C:\Daten\Mappe.xls ""C:\Daten\Andere Mappe.xls"" C:\Backup\EineMappe.xls", vbNormalFocus
End Sub

Verwandte Codebeispiele

Starten von Microsoft Excel

Starten von Microsoft Excel mit Öffnen einer Arbeitsmappendatei

Starten von Microsoft Excel mit schreibgeschütztem Öffnen mehrerer Arbeitsmappendateien

Pfad der Microsoft Excel-Programmdatei (Excel.exe) ermitteln

Starten eines anderen Office-Programmes

 

Weitere Informationen

VBA-Befehle und -Funktionen

VBA-Spezialthema: Windows Script Host (WSH)

Excel-Startparameter

To Top


Arbeitsmappe ohne externe Verknüpfungswerte speichern

.Beschreibung
Standardmässig werden die Zellwerte aus externen Verknüpfungen, also von Bezügen auf andere Arbeitsmappen, in der Arbeitsmappendatei gespeichert. Auf der Registerseite "Berechnen" des Optionen-Dialoges gibt es eine entsprechende Option "Externe Verknüpfungswerte speichern", die wie gesagt per Default aktiviert ist. Damit keine externen Verknüpfungswerte gespeichert werden, muss die Option deaktiviert werden. Mit VBA erfolgt dies anhand der SaveLinkValues-Eigenschaft des Workbook-Objektes.

Dieses Beispiel deaktiviert die Option der aktiven Arbeitsmappe und speichert die Mappe anschliessend.

.VBA-Code
Public Sub SaveWithoutExternalLinkValues()
  ActiveWorkbook.SaveLinkValues = False
  ActiveWorkbook.Save
End Sub

.Hinweis
Wenn die Arbeitsmappe viele externe Verknüpfungen (Bezüge) auf Zellen anderer Mappen enthält, kann die Arbeitsmappendatei (xls-Datei) durch Setzen von SaveLinkValues auf False oft tatsächlich erheblich verkleinert werden.

Verwandte Codebeispiele

Prüfen, ob in einer Arbeitsmappe externe Verknüpfungswerte gespeichert werden

 

Weitere Informationen

Excel-Objektmodell: Eigenschaften des Workbook-Objektes

Excel-Objektmodell: Methoden des Workbook-Objektes

XLimits: Dateigrösse von Arbeitsmappen reduzieren

To Top


Gedrückte Taste beim Öffnen einer Arbeitsmappe abfragen

.Beschreibung
Anhand der API-Funktion GetKeyState lässt sich den Zustand (d.h. "Gedrückt"/"Nicht gedrückt") jeder beliebigen Taste ermitteln. Hier wird gezeigt, wie man beim Öffnen einer Arbeitsmappe bestimmte Tasten abfragen kann.

Code Taste
16 Umschalt
17 Strg
18 Alt
112 F1
113 F2
114 F3
115 F4
116 F5
117 F6
118 F7
119 F8
120 F9
121 F10
122 F11
123 F12

Fügen Sie den VBA-Code in das Modul "DieseArbeitsmappe" ein. Nach dem Speichern, Schliessen und erneuten Öffnen der Arbeitsmappe wird der Programmcode ausgeführt.

.VBA-Code
'Deklarationsbereich des Moduls "DieseArbeitsmappe"
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer

'Modul "DieseArbeitsmappe"
Private Sub Workbook_Open()
  Dim strMessage As String
  strMessage = "Gedrückte Tasten:" & vbCrLf & vbCrLf
  If Abs(GetKeyState(16) < 0) Then
    strMessage = strMessage & "Umschalt-Taste wurde gedrückt!" & vbCrLf
  Else
    strMessage = strMessage & "Umschalt-Taste wurde nicht gedrückt!" & vbCrLf
  End If
  If Abs(GetKeyState(17) < 0) Then
    strMessage = strMessage & "Strg-Taste wurde gedrückt!" & vbCrLf
  Else
    strMessage = strMessage & "Strg-Taste wurde nicht gedrückt!" & vbCrLf
  End If
  If Abs(GetKeyState(18) < 0) Then
    strMessage = strMessage & "Alt-Taste wurde gedrückt!" & vbCrLf
  Else
    strMessage = strMessage & "Alt-Taste wurde nicht gedrückt!" & vbCrLf
  End If
  If Abs(GetKeyState(66) < 0) Then
    strMessage = strMessage & "Taste 'B' oder 'b' wurde gedrückt!"
  End If
  If Abs(GetKeyState(113) < 0) Then
    strMessage = strMessage & "Taste F2 wurde gedrückt!"
  End If
  If Abs(GetKeyState(2) < 0) Then
    strMessage = strMessage & "Rechte Maustaste wurde gedrückt!"
  End If
  MsgBox strMessage, vbInformation
End Sub

To Top


Add-In hinzufügen/installieren

.Beschreibung
Es gibt eine ganze Reihe verschiedener Lösungsvarianten, wie man ein Add-In in Microsoft Excel hinzufügen beziehungsweise installieren kann. Bitte beachten Sie insbesondere die Codebeispiele #4 und #5, die den kaum bekannten CopyFile-Parameter der Add-Methode einsetzen.

» Codebeispiel #1: Das Add-In mit dem Index 2 installieren. Entspricht dem Ankreuzen des zweiten Add-Ins in der Liste der verfügbaren Add-Ins im Add-In-Manager.

» Codebeispiel #2: Das Add-In mit dem Titel "Analyse-Funktionen" installieren. Entspricht dem Ankreuzen dieses Add-Ins in der Liste der verfügbaren Add-Ins im Add-In-Manager. Beachten Sie bitte, dass das Add-In über seinen Titel (nicht Dateiname) angesprochen wird.

» Codebeispiel #3: Add-In mit dem Dateinamen "C:\Daten\EinAddIn.xla" hinzufügen. Entspricht dem Hinzufügen eines Add-Ins im Add-In-Manager anhand der "Durchsuchen"-Schaltfläche. Beachten Sie bitte, dass das Add-In nicht automatisch installiert wird. Das Hinzufügen erfolgt mittels der Add-Methode des AddIns-Auflistungsobjektes. Die Methode besitzt ein zweites, selten benutztes Argument namens CopyFile, das in den Beispielen #4 und #5 vorgestellt wird.

» Codebeispiel #4: Add-In mit dem Dateinamen "C:\Daten\EinAddIn.xla" hinzufügen, wobei die xla-Datei automatisch in den Makros-Ordner von Microsoft Excel kopiert wird (LibraryPath-Eigenschaft des Application-Objektes). Entspricht dem Hinzufügen eines Add-Ins im Add-In-Manager anhand der "Durchsuchen"-Schaltfläche. Beachten Sie bitte, dass das Add-In nicht automatisch installiert wird.

» Codebeispiel #5: Add-In hinzufügen, das sich auf einer Diskette befindet (Laufwerk A:), wobei die xla-Datei automatisch in den Makros-Ordner von Microsoft Excel kopiert wird (LibraryPath-Eigenschaft des Application-Objektes). Entspricht dem Hinzufügen eines Add-Ins im Add-In-Manager anhand der "Durchsuchen"-Schaltfläche. Beachten Sie bitte, dass das Add-In nicht automatisch installiert wird. Das explizite Kopieren der xla-Datei ist hier unbedingt zu empfehlen, da das Add-In bei Entfernen der Diskette nicht mehr verfügbar wäre.

» Codebeispiel #6: Dieses Codebeispiel zeigt eine interessante Kombination der Add-Methode und der Installed-Eigenschaft. Das Add-In wird hinzugefügt und gleichzeitig installiert. Es wird jedoch nicht automatisch in den Makros-Ordner kopiert, was in diesem Fall aber auch nicht zwingend notwendig ist, dar der vollständige Dateipfad des Add-Ins angegeben wird.

.VBA-Code #1
Public Sub InstallAddIn1()
  Application.AddIns(2).Installed = True
End Sub

.VBA-Code #2
Public Sub InstallAddIn2()
  Application.AddIns("Analyse-Funktionen").Installed = True
End Sub

.VBA-Code #3
Public Sub InstallAddIn3()
  Application.AddIns.Add "C:\Daten\EinAddIn.xla"
End Sub

.VBA-Code #4
Public Sub InstallAddIn4()
  Application.AddIns.Add "C:\Daten\EinAddIn.xla", True
End Sub

.VBA-Code #5
Public Sub InstallAddIn5()
  Application.AddIns.Add "A:\EinAddIn.xla", True
End Sub

.VBA-Code #6
Public Sub InstallAddIn6()
  Application.AddIns.Add("C:\Daten\EinAddIn.xla").Installed = True
End Sub

Verwandte Codebeispiele

Add-In entfernen/deinstallieren

Alle Add-Ins entfernen/deinstallieren

Add-Ins auflisten

Add-Ins mit zusätzlichen Add-In-Eigenschaften auflisten

Prüfen, ob die xla-Datei eines installierten Add-Ins existiert

Prüfen, ob eine xla-Datei wirklich ein Add-In ist

Add-Ins-Ordner abfragen

Autor eines Add-Ins abfragen

To Top


Add-In entfernen/deinstallieren

.Beschreibung
Ein Add-In wird entfernt beziehungsweise deinstalliert, indem man die Installed-Eigenschaft des AddIn-Objektes auf False setzt. Das Add-In kann auf zwei verschiedene Arten spezifiziert werden:

1. Durch Angabe des Add-In-Titels. Dieser ist in der Liste der verfügbaren Add-Ins im Add-In-Manager ersichtlich (siehe Codebeispiel #1).

2. Durch Verwendung der Indesnummer (Codebeispiel #2).

In den Beispielen wird der Teilsummen-Assistent entladen. Das Add-In besitzt den Index 19 in der Auflistung der verfügbaren Add-Ins. Diese Nummer ist je nach Excelinstallation und verfügbaren Add-Ins unterschiedlich.

.VBA-Code #1
Public Sub UninstallAddIn1()
  Application.AddIns("Teilsummen-Assistent").Installed = False
End Sub

.VBA-Code #2
Public Sub UninstallAddIn2()
  Application.AddIns(19).Installed = False
End Sub

.Hinweis
Das Add-In wird nur entladen bzw. deinstalliert. Die xla-Datei wird nicht von der Festplatte gelöscht.

Verwandte Codebeispiele

Alle Add-Ins entfernen/deinstallieren

Add-In hinzufügen/installieren

Add-Ins auflisten

Add-Ins mit zusätzlichen Add-In-Eigenschaften auflisten

Add-Ins-Ordner abfragen

To Top


Alle Add-Ins entfernen/deinstallieren

.Beschreibung
Dieses Codebeispiel zeigt, wie man sämtliche akuell geladenen Add-Ins entfernen kann. Dazu werden alle Add-Ins des AddIns-Auflistungsobjektes durchlaufen und bei jedem Add-In, dessen Installed-Eigenschaft auf True steht, die Eigenschaft auf False geändert. Dadurch wird das Add-In automatisch entladen.

.VBA-Code
Public Sub UninstallAddIns()
  Dim intCounter As Integer
  For intCounter = 1 To Application.AddIns.Count
    If Application.AddIns(intCounter).Installed = True Then
      Application.AddIns(intCounter).Installed = False
    End If
  Next intCounter
End Sub

.Hinweis
Die Add-Ins werden nur entladen bzw. deinstalliert. Die xla-Dateien werden nicht von der Festplatte gelöscht.

Verwandte Codebeispiele

Add-In entfernen/deinstallieren

Add-In hinzufügen/installieren

Add-Ins auflisten

Add-Ins mit zusätzlichen Add-In-Eigenschaften auflisten

Add-Ins-Ordner abfragen

To Top


Add-Ins auflisten

.Beschreibung
Dieses Codebeispiel erstellt eine Liste der verfügbaren Add-Ins auf einem neuen Arbeitsblatt in der aktiven Arbeitsmappe. Zu jedem Add-In werden Dateiname, Ort und vollständiger Dateiname inkl. Pfad ausgegeben und angezeigt, ob das Add-In installiert/geladen ist.

.VBA-Code
Public Sub ListAddIns()
  Dim intCounter As Integer
  Dim wksSheet As Worksheet
  Set wksSheet = ActiveWorkbook.Worksheets.Add
  With wksSheet
    .Range("A1:D1").Value = Array("Add-In-Datei", "Ordner", "Pfad", "Installiert")
    .Range("A1:D1").Font.Bold = True
    For intCounter = 1 To Application.AddIns.Count
      .Cells(intCounter + 1, 1).Value = Application.AddIns(intCounter).Name
      .Cells(intCounter + 1, 2).Value = Application.AddIns(intCounter).Path
      .Cells(intCounter + 1, 3).Value = Application.AddIns(intCounter).FullName
      .Cells(intCounter + 1, 4).Value = Application.AddIns(intCounter).Installed
    Next intCounter
    .Range("A:D").EntireColumn.AutoFit
  End With
  Set wksSheet = Nothing
End Sub

Verwandte Codebeispiele

Add-Ins mit zusätzlichen Add-In-Eigenschaften auflisten

Add-Ins-Ordner abfragen

To Top


Add-Ins mit zusätzlichen Add-In-Eigenschaften auflisten

.Beschreibung
Das folgende Codebeispiel erstellt eine Liste der verfügbaren Add-Ins auf einem neuen Arbeitsblatt in der aktiven Arbeitsmappe. Nebst Dateiname, Ort und dem vollständigen Dateinamen inkl. Pfad werden die zusätzlichen Eigenschaften Titel, Thema, Kommentar, Autor und Stichwörter eines jeden Add-Ins angegeben. Zudem wird angezeigt, ob das Add-In installiert/geladen ist.

Bei den zusätzlichen Eigenschaften handelt es sich im Prinzip um die gleichen Dokument-Eigenschaften wie bei einer gewöhnlichen Excel- oder anderen Dokument-Datei. Im Objektkatalog jedoch sind diese Eigenschaften (Title, Comments, Subject usw.) ausgeblendet.

Die etwas eigenartige Codezeile ".Range("A1:A" & CStr(intCounter)).EntireRow.AutoFit" am Schluss der Prozedur bewirkt, dass die benutzten Tabellenblattzeilen automatisch auf die jeweils benötigte Höhe eingestellt werden. Das ist nötig, weil unter anderem die Comments-Eigenschaft einen mehrzeiligen Text aufnehmen kann, der Zeilenumbrüche enthält. Durch die AutoFit-Methode werden solche Texte korrekt dargestellt.

.VBA-Code
Public Sub ListAddIns()
  Dim intCounter As Integer
  Dim wksSheet As Worksheet

  On Error Resume Next
  Set wksSheet = ActiveWorkbook.Worksheets.Add
  With wksSheet
    .Range("A1:I1").Value = Array("Add-In", "Datei", "Ordner", "Pfad", "Kommentar", "Autor", "Thema", "Stichwörter", "Installiert")
    .Range("A1:I1").Font.Bold = True
    For intCounter = 1 To Application.AddIns.Count
      .Cells(intCounter + 1, 1).Value = Application.AddIns(intCounter).Title

      .Cells(intCounter + 1, 2).Value = Application.AddIns(intCounter).Name
      .Cells(intCounter + 1, 3).Value = Application.AddIns(intCounter).Path
      .Cells(intCounter + 1, 4).Value = Application.AddIns(intCounter).FullName
      .Cells(intCounter + 1, 5).Value = Application.AddIns(intCounter).Comments

      .Cells(intCounter + 1, 6).Value = Application.AddIns(intCounter).Author
      .Cells(intCounter + 1, 7).Value = Application.AddIns(intCounter).Subject
      .Cells(intCounter + 1, 8).Value = Application.AddIns(intCounter).Keywords
      If Application.AddIns(intCounter).Installed = True Then
        .Cells(intCounter + 1, 9).Value = "X"
      End If
    Next intCounter
    .Range("A:I").EntireColumn.AutoFit
    .Range("A1:A" & CStr(intCounter)).EntireRow.AutoFit

  End With
  Set wksSheet = Nothing
End Sub

Verwandte Codebeispiele

Add-Ins auflisten

Add-Ins-Ordner abfragen

To Top


Prüfen, ob die xla-Datei eines installierten Add-Ins existiert

.Beschreibung
Der Add-In-Manager von Microsoft Excel zeigt eine Liste der verfügbaren Add-Ins. Das "Problem" an dieser Liste ist, dass die aufgeführten Add-Ins nicht zwingend als xla-Datei vorhanden sein müssen. Es könnte sein, dass die Datei eines Add-Ins beispielsweise verschoben, umbenannt oder gelöscht wurde. Wenn Sie im Add-In-Manager ein solches Add-In aktivieren möchten (d.h. das Häkchen setzen wollen), erscheint die Fehlermeldung "Kann den Add-In <Datei> nicht finden. Aus der Liste löschen?".

Die hier vorgestellte Prozedur überprüft nacheinander alle verfügbaren Add-Ins, ob die zugehörigen xla-Dateien tatsächlich vorhanden sind. Für jede nicht gefundene xla-Datei wird eine Meldung ausgegeben.

.VBA-Code
Public Sub CheckIfXLAFilesExists()
  Dim objAddIn As AddIn
  For Each objAddIn In Application.AddIns
    If Dir(objAddIn.FullName) = "" Then
      MsgBox "Die xla-Datei dieses Add-Ins existiert nicht:" & vbCrLf & vbCrLf & "Name:" & Chr$(9) & _
          objAddIn.Title & vbCrLf & "Datei:" & Chr$(9) & objAddIn.FullName, vbInformation
    End If
  Next
End Sub

Verwandte Codebeispiele

Add-Ins auflisten

Add-Ins mit zusätzlichen Add-In-Eigenschaften auflisten

Prüfen, ob eine xla-Datei wirklich ein Add-In ist

Prüfen, ob eine Arbeitsmappe ein Add-In ist

Add-Ins-Ordner abfragen

To Top


Prüfen, ob eine xla-Datei wirklich ein Add-In ist

.Beschreibung
Wie Sie vielleicht schon mal festgestellt haben, kann man nicht einfach die Dateinamenerweiterung einer xls-Datei in "xla" umbenennen und dann die Datei als Add-In im Add-In-Manager von Microsoft Excel einbinden. Es erscheint nämlich die Fehlermeldung "<Datei> ist kein gültiger Add-In". Doch woran erkennt Microsoft Excel, dass die xla-Datei gar kein echtes Add-In ist? Und wie kann man diesen Mechanismus für eigene Zwecke nutzen?

Das hier vorgestellte Beispiel zeigt, wie man zuverlässig überprüfen kann, ob eine xla-Datei tatsächlich ein gültiges Excel Add-In ist. Dazu wird die (vermeintliche) Add-In-Datei binär geöffnet, ihren gesamten Inhalt in eine Variable eingelesen und anschliessend die Existenz einer ganz bestimmten Bytefolge überprüft, wobei sich diese unmittelbar nach dem so genannten BOF-Record (BOF=Begin Of File) befinden muss, der zuerst gefunden werden muss.

Hier ein paar Zusatzinformationen:
- Aus technischer Sicht ist eine Datei dann ein Add-In, wenn in der Datei unmittelbar nach dem BOF-Record (BOF=Begin Of File) ein ADDIN-Record steht.
- Der BOF-Record besitzt die ID 809hex und enthält Daten mit einer Länge von 10hex Bytes.
- Der ADDIN-Record besitzt die ID 87hex und enthält keine Daten. Die Datenlänge ist daher 0hex Bytes.

Ausführliche Informationen über die Recordtypen BOF, ADDIN und alle weiteren finden Sie unter "Weitere Informationen".

.VBA-Code
Public Sub CheckAddInFileFormat()
  Const strFile As String = "C:\Daten\EinAddIn.xla"
  Dim strContents As String
  Dim lngBOFPos As Long
  Open strFile For Binary Access Read As #1
    strContents = Input(LOF(1), #1)
  Close #1
  lngBOFPos = InStr(strContents, Chr$(9) & Chr$(8) & Chr$(16))
  If Mid$(strContents, lngBOFPos + 20, 4) = Chr$(135) & String$(3, vbNullChar) Then
    MsgBox "Die Datei ist ein gültiges Add-In"
  Else

    MsgBox "Die Datei ist kein Add-In"
  End If
End Sub

Verwandte Codebeispiele

Add-Ins auflisten

Add-Ins mit zusätzlichen Add-In-Eigenschaften auflisten

Prüfen, ob die xla-Datei eines installierten Add-Ins existiert

Prüfen, ob eine Arbeitsmappe ein Add-In ist

Add-Ins-Ordner abfragen

 

Weitere Informationen

Excel-Dateiformat BIFF

Liste der BIFF-Recordtypen

To Top


Prüfen, ob eine Arbeitsmappe ein Add-In ist

.Beschreibung
Die IsAddIn-Eigenschaft des Workbook-Objektes gibt an, ob eine Mappe ein Add-In ist.

Die Überprüfung mittels IsAddIn macht allerdings nur dann Sinn, wenn ThisWorkbook verwendet wird. Das heisst, wenn sich der VBA-Code im VBA-Projekt der zu überprüfenden Exceldatei befindet. Die Verwendung von IsAddIn mit ActiveWorkbook oder Workbooks(x) überflüssig, weil weder die aktive noch irgend eine geöffnete Arbeitsmappe ein Add-In sein kann.

.VBA-Code
Public Sub CheckIfWorkbookIsAddIn()
  MsgBox "Arbeitsmappe ist ein Add-In: " & ThisWorkbook.IsAddIn
End Sub

Verwandte Codebeispiele

Add-Ins auflisten

Add-Ins mit zusätzlichen Add-In-Eigenschaften auflisten

Prüfen, ob die xla-Datei eines installierten Add-Ins existiert

Prüfen, ob eine xla-Datei wirklich ein Add-In ist

 

Weitere Informationen

Excel-Objektmodell: Eigenschaften des Workbook-Objektes

To Top


Add-Ins-Ordner von Microsoft Excel abfragen

.Beschreibung
Der Standardordner für Add-Ins bzw. Makros wird durch Abfragen der LibraryPath-Eigenschaft des Application-Objektes herausgefunden. Die Eigenschaft ist übrigens schreibgeschützt. Das bedeutet, dass der Ordnerpfad nicht geändert werden kann.

.VBA-Code
Public Sub GetLibraryPath()
  MsgBox "Makro-/Add-Ins-Ordner von Excel: " & Application.LibraryPath
End Sub

Verwandte Codebeispiele

Add-In entfernen/deinstallieren

Alle Add-Ins entfernen/deinstallieren

Prüfen, ob die xla-Datei eines installierten Add-Ins existiert

Autor eines Add-Ins abfragen

 

Weitere Informationen

Excel-Objektmodell: Eigenschaften des Application-Objektes

To Top


Einträge aus dem Änderungsprotokoll einer freigegebenen Arbeitsmappe entfernen

.Beschreibung
Mit der PurgeChangeHistoryNow-Methode kann man Einträge aus dem Änderungsprotokoll einer freigegebenen Arbeitsmappe entfernen.

Die Zahl 1 im nachstehenden Beispiel bedeutet, dass alle Einträge, die älter als einen Tag sind, aus dem Änderungsprotokoll gelöscht werden. Man kann auch sagen, dass die Änderungen von einem Tag im Protokoll behalten werden. Wenn man beispielsweise die Zahl 7 angibt, werden alle Einträge älter als 7 Tage entfernt bzw. 7 Tage im Änderungsprotokoll behalten.

Wenn die Arbeitsmappe einen Freigabeschutz mit Kennwort besitzt, muss das Kennwort als Argument angegeben werden. Wird ein falsches Kennwort angegeben, erscheint ein Laufzeitfehler. Wird kein Kennwort angegeben, erscheint die Kennwort-Eingabeaufforderung.

.VBA-Code #1
Public Sub RemoveHistoryItems1()
  ActiveWorkbook.PurgeChangeHistoryNow Days:=1
End Sub

.VBA-Code #2
Public Sub RemoveHistoryItems2()
  ActiveWorkbook.PurgeChangeHistoryNow 7, "Sommer"
End Sub

Verwandte Codebeispiele

Prüfen, ob die Änderungen in einer freigegebenen Arbeitsmappe protokolliert werden

Änderungsprotokollierung einer freigegebenen Arbeitsmappe aktivieren/deaktivieren

Anzahl Tage der Änderungsprotokollierung einer freigegebenen Arbeitsmappe abfragen/ändern

 

Weitere Informationen

Excel-Objektmodell: Methoden des Workbook-Objektes

To Top


Änderungsprotokollierung einer freigegebenen Arbeitsmappe aktivieren/deaktivieren

.Beschreibung
Anhand der Eigenschaft KeepChangeHistory kann man festlegen, ob für eine freigegebene Arbeitsmappe ein Änderungsprotokoll geführt werden soll. Standardmässig ist die Änderungsprotokollierung aktiviert.

Man kann die Eigenschaft auch bei einer nicht freigegebenen Arbeitsmappe ändern beziehungsweise auf False setzen. Die vorgenommene Änderung geht allerdings beim Schliessen der Mappe verloren (also auch wenn man die Mappe speichert). Das bedeutet, das nach erneutem Öffnen der Mappe KeepChangeHistory wieder den Standardwert True enthält.

.VBA-Code #1
Public Sub ActivateChangeHistory()
  ActiveWorkbook.KeepChangeHistory = True
End Sub

.VBA-Code #2
Public Sub DeactivateChangeHistory()
  ActiveWorkbook.KeepChangeHistory = False
End Sub

Verwandte Codebeispiele

Prüfen, ob die Änderungen in einer freigegebenen Arbeitsmappe protokolliert werden

Einträge aus dem Änderungsprotokoll einer freigegebenen Arbeitsmappe entfernen

Anzahl Tage der Änderungsprotokollierung einer freigegebenen Arbeitsmappe abfragen/ändern

 

Weitere Informationen

Excel-Objektmodell: Eigenschaften des Workbook-Objektes

To Top


Prüfen, ob die Änderungen in einer freigegebenen Arbeitsmappe protokolliert werden

.Beschreibung
Durch Abfragen der KeepChangeHistory-Eigenschaft des Workbook-Objektes kann man herausfinden, ob bei einer freigegebenen Arbeitsmappe das Änderungsprotokoll geführt wird. Zu beachten ist, dass bei nicht freigegebenen Arbeitsmappen die Option für die Änderungsprotokollierung per Default eingeschaltet ist, aber keine Protokollierung stattfindet. Man sollte daher sicherheitshalber überprüfen, ob die betroffene Mappe tatsächlich freigegeben ist (siehe Codebeispiel #2).

.VBA-Code #1
Public Sub CheckKeepChangeHistory1()
  If ActiveWorkbook.KeepChangeHistory = True Then
    MsgBox "Änderungen werden protokolliert."
  Else
    MsgBox "Änderungen werden nicht protokolliert."
  End If
End Sub

.VBA-Code #2
Public Sub CheckKeepChangeHistory2()
  If ActiveWorkbook.MultiUserEditing = True Then
    If ActiveWorkbook.KeepChangeHistory = True Then
      MsgBox "Änderungen werden protokolliert."
    Else
      MsgBox "Änderungen werden nicht protokolliert."
    End If
  Else
    MsgBox "Die Arbeitsmappe ist nicht freigegeben."
  End If
End Sub

Verwandte Codebeispiele

Änderungsprotokollierung einer freigegebenen Arbeitsmappe aktivieren/deaktivieren

Einträge aus dem Änderungsprotokoll einer freigegebenen Arbeitsmappe entfernen

Anzahl Tage der Änderungsprotokollierung einer freigegebenen Arbeitsmappe abfragen/ändern

 

Weitere Informationen

Excel-Objektmodell: Eigenschaften des Workbook-Objektes

To Top


Verknüpfung mit Arbeitsmappe zu Favoriten hinzufügen

.Beschreibung
Dieses Codebeispiel zeigt, wie eine Arbeitsmappe als Datei-Verknüpfung im Favoriten-Ordner erstellt wird. Man braucht dazu lediglich die AddToFavorites-Methode des Workbook-Objektes aufzurufen. Die Methode besitzt allerdings einen kleinen Nachteil: Die Verknüpfung wird immer im Stammverzeichnis des Favoriten-Ordners angelegt. Die Erstellung der Verknüpfung in einem Unterordner ist nicht möglich.

Im Beispiel wird die aktive Arbeitsmappe verwendet (ActiveWorkbook). Es kann eine beliebige andere Mappe verwendet werden (Workbooks(x)).

.VBA-Code
Public Sub AddWorkbookToFavorites()
  ActiveWorkbook.AddToFavorites
End Sub

Verwandte Codebeispiele

Datei-Verknüpfung im Favoriten-Ordner erstellen

Verknüpfung mit einer Arbeitsmappe zur Links-Symbolleiste des Internet Explorers hinzufügen

Zu Favoriten hinzufügen-Dialog anzeigen

 

Weitere Informationen

Excel-Objektmodell: Methoden des Workbook-Objektes

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