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 |
|
Info
Artikel-ID: 1
Thema: Laufwerk/Analysieren
Kategorie: -
Version: 1
Geändert: 7.08.2005
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 |
|
Verwandte Codebeispiele |
|
.Info
Artikel-ID: 2
Autor: Philipp von Wartburg, www.xlam.info
Thema: Laufwerk/Analysieren
Kategorie: -
Version: 1
Geändert: 7.08.2005
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 |
|
Verwandte Codebeispiele |
|
|
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 |
|
Verwandte Codebeispiele |
|
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 |
|
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 |
|
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 |
|
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 |
|
.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 |
|
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!
GetDriveName verarbeitet problemlos auch UNC-Pfade. Wie das
funktioniert, zeigt das Codebeispiel Laufwerk
aus einem UNC-Pfad extrahieren.
Verwandte Codebeispiele |
|
Weitere Informationen |
|
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 |
|
|
Weitere Informationen |
|
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 |
|
Weitere Informationen |
|
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 |
|
|
Weitere Informationen |
|
.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 |
|
|
|
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 |
|
- 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
.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 |
|
Weitere Informationen |
|
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 |
|
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 |
|
Weitere Informationen |
|
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 |
|
.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 |
|
Verwandte Codebeispiele |
|
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 |
|
Verwandte Codebeispiele |
|
.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 |
|
.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 |
|
Verwandte Codebeispiele |
|
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
.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 |
|
|
Weitere Informationen |
|
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
Weitere Informationen |
|
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 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 |
|
|
Weitere Informationen |
|
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 |
|
Verwandte Codebeispiele |
|
BIFF-Formatversion einer Arbeitsmappendatei ermitteln
.Beschreibung
...
.VBA-Code
Public Sub GetBIFFFormatVersion()
End Sub
.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 |
|
Verwandte Codebeispiele |
|
.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 |
|
.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 |
|
Verwandte Codebeispiele |
|
.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 |
|
Verwandte Codebeispiele |
|
.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 |
|
Verwandte Codebeispiele |
|
|
|
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 |
|
Verwandte Codebeispiele |
|
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 |
|
Verwandte Codebeispiele |
|
|
|
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.

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.

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.

Abbildung: MRU-Dateiliste von Microsoft Word
MRU-Dateiliste von Crystal Reports

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
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
.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!
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 |
|
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 |
|
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 |
|
Verwandte Codebeispiele |
|
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 |
|
|
|
Weitere Informationen |
|
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 |
|
|
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 |
|
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 |
|
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 |
|
|
Verwandte Codebeispiele |
|
.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 |
|
Verwandte Codebeispiele |
|
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").
.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 |
|
Verwandte Codebeispiele |
|
|
|
.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 |
|
Verwandte Codebeispiele |
|
|
|
Ü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 |
|
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
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 |
|
.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 |
|
Verwandte Codebeispiele |
|
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 |
|
Verwandte Codebeispiele |
|
|
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 |
|
Verwandte Codebeispiele |
|
|
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 |
|
Verwandte Codebeispiele |
|
|
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.
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 |
|
Verwandte Codebeispiele |
|
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 |
|
|
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.
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 |
|
|
Weitere Informationen |
|
|
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
.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 |
|
|
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!
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").
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!
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 |
|
|
|
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.
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.
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
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
Aktueller Bearbeiter einer Arbeitsmappe ohne Microsoft Excel herausfinden
.Beschreibung
Beschreibung folgt in Kürze...
.VBA-Code
Public Sub GetCurrentFileUser()
End Sub
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 |
|
|
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 |
|
|
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
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 |
|
|
.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 |
|
Verwandte Codebeispiele |
|
|
|
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 |
|
Weitere Informationen |
|
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
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
.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 |
|
|
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
.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 |
|
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 |
|
|
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 |
|
Weitere Informationen |
|
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 |
|
Weitere Informationen |
|
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 |
|
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 |
|
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 |
|
Weitere Informationen |
|
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 |
|
Weitere Informationen |
|
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
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
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
.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 |
|
.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 |
|
|
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 |
|
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 |
|
|
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 |
|
.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 |
|
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 |
|
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
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 |
|
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
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
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
.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 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 |
|
|
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.
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 |
|
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.
» 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 |
|
|
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.
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 |
|
|
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 |
|
|
|
Weitere Informationen |
|
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
Weitere Informationen |
|
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
Weitere Informationen |
|
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 |
|
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 |
|
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 |
|
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".
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 |
|
|
Verwandte Codebeispiele |
|
|
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 |
|
|
Weitere Informationen |
|
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
.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 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 |
|
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
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
.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
Weitere Informationen |
|
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
Weitere Informationen |
|
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
Weitere Informationen |
|
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 |
|
|
Weitere Informationen |
|
|
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
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
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
.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 |
|
|
.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
.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 |
|
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 |
|
|
|
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 |
|
|
|
Weitere Informationen |
|
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 |
|
|
|
Weitere Informationen |
|
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 |
|
|
Weitere Informationen |
|
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
Weitere Informationen |
|
Ä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
Weitere Informationen |
|
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
Weitere Informationen |
|
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 |
|
|
Weitere Informationen |
|
Zuletzt aktualisiert am
09.01.2009 / 08:00 Uhr
© 2002-2009 by Philipp von Wartburg, Schweiz
Alle Rechte vorbehalten