Prüfen, ob eine Datei existiert
.Beschreibung
Die nachfolgend vorgestellten Codebeispiele überprüfen, ob
eine bestimmte Datei vorhanden ist.
» Im Codebeispiel #1 wird die Existenz einer Arbeitsmappendatei überprüft. Das Vorhandensein der Datei im angegebenen Verzeichnis wird mit einer entsprechenden Meldung angezeigt. Natürlich kann man anstelle einer Arbeitsmappendatei (xls-Datei) auch einen beliebigen anderen Dateityp verwenden werden.
» Das Beispiel #2 zeigt, wie der für die Überprüfung benötigte Programmcode als Funktion gekapselt werden kann. Dadurch kann man die Routine an verschiedenen Stellen im VBA-Programm aufrufen. Die Anweisung On Error Resume Next verhindert, dass innerhalb der Funktion Laufzeitfehler auftreten. Im Falle eines Fehlers gibt die Funktion generell ihren Default-Rückgabewert False zurück. Beispielsweise tritt der Laufzeitfehler 68 "Gerät nicht verfügbar" auf, wenn der angegebene Dateipfad auf ein nicht vorhandenes Laufwerk zeigt.
.VBA-Code #1
Public Sub CheckIfFileExists()
If Dir("C:\Daten\MeineMappe.xls") <> "" Then
MsgBox "Die Datei existiert."
Else
MsgBox "Die Datei existiert nicht."
End If
End Sub
.VBA-Code #2
Public Function FileExists(ByVal strFile As String) As
Boolean
On Error Resume Next
FileExists = IIf(Dir(strFile) <> "", True, False)
End Function
'*** Aufruf ***
Sub TestCall()
If FileExists("C:\Daten\MeineMappe.xls") = True Then
MsgBox "Die Datei existiert."
Else
MsgBox "Die Datei existiert nicht."
End If
End Sub
.Hinweis
Die Dir-Funktion verfügt über ein Argument namens Attribute.
Wird dieses Argument weggelassen, so werden verborgene Dateien nicht berücksichtigt. In
diesem Fall würde die vorgenommene Existenzprüfung die Meldung "Die Datei existiert
nicht" ergeben. Wenn sowohl 'gewöhnliche' als auch verborgene Dateien
berücksichtigt werden sollen, muss die Konstante vbHidden angegeben werden:
If Dir("C:\Daten\MeineMappe.xls", vbHidden) <> "" Then
Die obige Codezeile prüft korrekt die Existenz der Datei "MeineMappe.xls", welche verborgen sein könnte.
Beachten Sie bitte, dass das Pfadname-Argument der Dir-Funktion auch eine leere Zeichenfolge ("") akzeptiert. Wird eine leere Zeichenfolge übergeben, gibt Dir eine Datei des aktuellen Verzeichnisses zurück. Dieses kann mit der VBA-Funktion CurDir abgefragt und mit ChDir gewechselt werden. Liegen im aktuellen Verzeichnis mehrere Dateien, so wird der Dateiname von irgendeiner dieser Dateien zurückgegeben. Gewöhnlich ist es der Name der ersten Datei (nach Alphabet); es muss aber nicht unbedingt der Fall sein.
Das folgende Beispiel prüft, ob die im Eingabefeld TextBox1 eingetragene Datei vorhanden ist. Wenn das Eingabefeld leer ist, wird der Name einer im aktuellen Verzeichnis abgelegten Datei ausgegeben. Enthält das aktuelle Verzeichnis keine Dateien, so wird eine Meldung ohne Text angezeigt (die Variable strFileNameCheck enthält die leere Zeichenfolge "").
.VBA-Code #3
Public Sub TestFileExists()
Dim strFileNameUser As String
Dim strFileNameCheck As String
strFileNameUser = TextBox1.Text
strFileNameCheck = Dir(strFileNameUser, vbHidden)
MsgBox strFileNameCheck
End Sub
Weitere Informationen |
|
|
Verwandte Codebeispiele |
|
.Beschreibung
Es existiert eine Vielzahl verschiedener Möglichkeiten, wie
man in Microsoft Excel den "Datei öffnen"-Dialog aufrufen kann. Welche
Lösungsvariante man schliesslich verwendet, kommt ganz auf den Verwendungszweck der im
Dialogfenster ausgewählten Datei an. Einige Lösungsvarianten öffnen automatisch die
selektierte Datei, sobald der Benutzer auf die "Öffnen"-Schaltfläche klickt.
Andere Lösungsvarianten dagegen liefern lediglich den Dateipfad der selektieren Datei.
Dialogs-Auflistung mit Konstante xlDialogOpen
Dialogs-Auflistung mit Konstante xlDialogFindFile
FindFile-Methode von Application
GetOpenFilename-Methode von Application
GetOpenFileName-Funktion
"Öffnen"-Dialogfenster von Microsoft Excel lässt sich komfortabel via Dialogs-Auflistung unter Verwendung der Konstante xlDialogOpen einblenden.
.VBA-Code #1
Public Sub ShowOpenDialog1()
Application.Dialogs(xlDialogOpen).Show
End Sub
.VBA-Code #2
Public Sub ShowOpenDialog2()
Application.Dialogs(xlDialogOpen).Show arg1:="EineMappe.xls"
End Sub
.VBA-Code #3
Public Sub ShowOpenDialog3()
If Application.Dialogs(xlDialogOpen).Show = True Then
MsgBox "Benutzer hat 'Öffnen' geklickt.",
vbInformation
Else
MsgBox "Benutzer hat 'Abbrechen' geklickt.",
vbInformation
End If
End Sub
.VBA-Code #4
Public Sub ShowOpenDialog4()
Application.Dialogs(xlDialogFindFile).Show
End Sub
.VBA-Code #5
Public Sub ShowOpenDialog5()
Application.FindFile
End Sub
.VBA-Code #6
Public Sub ShowOpenDialog6()
If InStr(Application.Name, "Excel") > 0 Then
Application.Dialogs(1).Show
'1=xlDialogOpen
ElseIf InStr(Application.Name, "Word") > 0 Then
Application.Dialogs(80).Show
'80=wdDialogFileOpen
End If
End Sub
.VBA-Code #7
Public Sub ShowOpenDialog7()
MsgBox Application.GetOpenFilename
End Sub
.VBA-Code #8
'Deklarationsbereich
Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias
"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
'Codemodul
Public Sub ShowOpenDialog8()
Dim udtOFN As OPENFILENAME
Dim lngRC As Long
Dim strFile As String
With udtOFN
.lStructSize = Len(udtOFN)
'.hwndOwner = Application.VBE.MainWindow.hwnd
'.hwndOwner = FindWindow("xlmain", Application.Caption)
If Int(Val(Application.Version)) = 8 Then
.hwndOwner = FindWindow("ThunderXFrame",
vbNullString)
Else
.hwndOwner = FindWindow("ThunderDFrame",
vbNullString)
End If
.lpstrFile = String(255, 0)
.nMaxFile = 255
.lpstrFileTitle = String(255, 0)
.nMaxFileTitle = 255
.lpstrTitle = "Öffnen"
'.flags = 4 'Readonly-Checkbox verbergen
'If a <> "" Then
' .lpstrFilter = UCase(a) & " - Dateien (*." & a
& ")" & Chr$(0) & "*." & a & "" &
Chr$(0)
'End If
'.lpstrFilter = .lpstrFilter & "Alle Dateien (*.*)" &
Chr$(0) & "*.*" & Chr$(0)
.lpstrFilter = "Alle Dateien (*.*)" & Chr$(0) &
"*.*" & Chr$(0)
'If Right$(StartDir, 1) <> "\" Then StartDir = StartDir
& "\"
'.lpstrInitialDir = StartDir
lngRC = GetOpenFileName(udtOFN)
If lngRC <> 0 Then
strFile = Left$(.lpstrFile, InStr(1, .lpstrFile, Chr(0)) -
1)
MsgBox strFile, vbInformation
End If
End With
End Sub
Weitere Informationen |
|
Verwandte Codebeispiele |
|
|
Datei öffnen-Dialog anzeigen und Pfad/Datei vorblenden
.Beschreibung
Es existieren mehrere Möglichkeiten zum Öffnen einer
Arbeitsmappe bzw. einer beliebigen Datei über den "Datei öffnen"-Dialog.
» Im ersten Beispiel ShowOpenDialog1 wird der Öffnen-Dialog eingeblendet, der Datentyp-Filter auf "*.xls" gesetzt und der Dateiname "MeineMappe.xls" vorgegeben.
» Das zweite Beispiel ShowOpenDialog2 öffnet den Öffnen-Dialog anhand der Dialogs-Auflistung unter Verwendung der Konstante xlDialogOpen, wobei der Dateipfad "C:\Daten\MeineMappe" als Dateiname und der Dateityp "Tabellen (*.xls)" vorgeblendet wird.
.VBA-Code #1
Public Sub ShowOpenDialog1()
Workbooks.Open
filename:=Application.GetOpenFilename("MeineMappe.xls", "Excel-Dateien
(*.xls), *.xls")
End Sub
.VBA-Code #2
Public Sub ShowOpenDialog2()
Application.Dialogs(xlDialogOpen).Show
arg1:="C:\Daten\EineMappe.xls"
End Sub
.Hinweis
Bitte beachten Sie folgende Punkte:
- Das Dialogfeld xlDialogOpen besitzt mehrere Argumente. Das erste
Argument arg1 besitzt die Bezeichnung "file_text" und enthält den im
Dialogfenster vorzublendenden Dateinamen.
- Informationen über die verfügbaren Dialogs-Argumente finden Sie in der
Excel VBA-Referenz im Kapitel "Listen der integrierten Dialogfeldargumente".
Weitere Informationen |
|
Verwandte Codebeispiele |
|
Mehrere Dateien im Öffnen-Dialog selektieren und öffnen
.Beschreibung
Dieses Makro blendet das Öffnen-Dialogfenster ein, in welchem
der Benutzer gleich mehrere Dateien markieren und anschliessend öffnen kann. Das
Parameter-Argument True bei der GetOpenFilename-Methode bedeutet, dass
die Möglichkeit der Mehrfachselektion MultiSelect im Datei öffnen-Dialog zu
aktivieren ist.
.VBA-Code
Public Sub ChooseMultipleFiles()
Dim intCounter As Integer
Dim varFileNames As Variant
varFileNames = Application.GetOpenFilename(, , , , True)
intCounter = 1
While intCounter <= UBound(varFileNames)
Workbooks.Open varFileNames(intCounter)
MsgBox varFileNames(intCounter)
intCounter = intCounter + 1
Wend
End Sub
Weitere Informationen |
|
Verwandte Codebeispiele |
|
Datei über den Öffnen-Dialog auswählen und öffnen
.Beschreibung
Es existieren zahlreiche Möglichkeiten zum Öffnen einer
Arbeitsmappe bzw. einer beliebigen Datei über den "Datei öffnen"-Dialog.
Nachfolgend sechs verschiedene Varianten:
» Das erste VBA-Beispiel OpenFile1 zeigt das "Datei öffnen"-Dialogfenster, in welchem der Benutzer die zu öffnende Datei auswählen kann.
» Das zweite Beispiel OpenFile2 öffnet ebenfalls den Öffnen-Dialog, wobei der Datentyp-Filter auf "*.xls" gesetzt wird. Es wird kein Dateiname vorgeblendet.
» Im dritten Beispiel OpenFile3 wird der Öffnen-Dialog eingeblendet, der Datentyp-Filter auf "*.xls" gesetzt und der Dateiname "MeineMappe.xls" vorgegeben.
» Im vierten Beispiel OpenFile4 wird mit FindFile der Öffnen-Dialog (bzw. der Datei suchen-Dialog) angezeigt. Diese Variante sollten Sie möglichst nicht verwenden; oder nur dann, wenn Sie dem Benutzer lediglich den Öffnen-Dialog präsentieren wollen, aber nicht wissen müssen, welche Datei der Benutzer öffnet beziehungsweise ob er überhaupt eine Datei öffnet und nicht die Abbrechen-Schaltfläche des Dialogfensters klickt.
» Das fünfte Beispiel OpenFile5 öffnet den Öffnen-Dialog anhand der Dialogs-Auflistung unter Verwendung der Konstante xlDialogOpen, wobei "MeineMappe" als Dateiname vorgeblendet und der Dateityp "Tabellen (*.xls)" eingestellt wird.
» Das Codebeispiel OpenFile6 zeigt den Öffnen-Dialog (bzw. den Datei suchen-Dialog) anhand der Dialogs-Auflistung unter Verwendung der Konstante xlDialogFindFile. Beachten Sie bitte, dass beim Datei suchen-Dialogfeld keine Argumente angegeben werden können.
.VBA-Code #1
Public Sub OpenFile1()
Workbooks.Open filename:=Application.GetOpenFilename
End Sub
.VBA-Code #2
Public Sub OpenFile2()
Workbooks.Open filename:=Application.GetOpenFilename("Excel-Dateien
(*.xls), *.xls")
End Sub
.VBA-Code #3
Public Sub OpenFile3()
Workbooks.Open
filename:=Application.GetOpenFilename("MeineMappe.xls", "Excel-Dateien
(*.xls), *.xls")
End Sub
.VBA-Code #4
Public Sub OpenFile4()
Application.FindFile
End Sub
.VBA-Code #5
Public Sub OpenFile5()
Application.Dialogs(xlDialogOpen).Show arg1:="EineMappe.xls"
End Sub
.VBA-Code #6
Public Sub OpenFile6()
Application.Dialogs(xlDialogFindFile).Show
End Sub
.Hinweis
Bitte beachten Sie folgende Punkte:
- Das Dialogfeld xlDialogOpen besitzt mehrere Argumente. Das erste
Argument arg1 besitzt die Bezeichnung "file_text" und enthält den im
Dialogfenster vorzublendenden Dateinamen.
- Das Dialogfeld xlDialogFindFile besitzt keine Argumente. Die Verwendung
von "arg1:=<x>" ist daher nicht möglich.
- Informationen über die verfügbaren Dialogs-Argumente finden Sie in der
Excel VBA-Referenz im Kapitel "Listen der integrierten Dialogfeldargumente".
Weitere Informationen |
|
Verwandte Codebeispiele |
|
.Beschreibung
Eine Arbeitsmappe wird gewöhnlich mit der Open-Methode
des Workbooks-Auflistungsobjektes geöffnet. Abgesehen davon gibt es mehrere
andere, ganz unterschiedliche Möglichkeiten, wie man eine Mappe öffnen kann. Nachfolgend
werden sämtliche Varianten vorgestellt.
» Das Codebeispiel #1 öffnet die Arbeitsmappe "MeineMappe.xls" mit Standard-Einstellungen. Der Argumentname "Filename:=" kann auch weggelassen werden. Die Open-Methode akzeptiert auch relative Pfade, UNC-Pfade und File URLs.
» Das zweite Beispiel öffnet die Arbeitsmappe, wobei die Rückfrage "Externe Verknüpfungen aktualisieren" unterdrückt wird und durch das Setzen des UpdateLinks-Parameters auf 0 die Verknüpfungen nicht aktualisiert werden (anstelle von 0 kann man auch False angeben).
» Im dritten Beispiel OpenWorkbook3 wird die Arbeitsmappe schreibgeschützt geöffnet (read-only), was durch Setzen von ReadOnly auf True erreicht wird.
» Im Beispiel OpenWorkbook4 wird die Arbeitsmappe anhand der FollowHyperlink-Methode des Workbook-Objektes geöffnet. Der Effekt ist der gleiche wie bei der Open-Methode. Bedingung ist hier allerdings, dass es eine aktive Arbeitsmappe gibt bzw. mindestens eine Mappe geöffnet ist, wenn man Workbooks(x) verwenden möchte.
» Das Codebeispiel #5 sollte man sich gut anschauen, da es eine äusserst interessante Lösung zeigt. Es öffnet die Arbeitsmappe anhand der Run-Methode des Application-Objektes. Nach dem Dateinamen muss ein Ausrufezeichen '!' und irgend ein beliebiges Zeichen oder beliebiger Begriff stehen. Am besten verwenden Sie ein einzelnes Leerzeichen. Dieser Begriff steht eigentlich für den Namen eines Makros. Normalerweise wird Run zum Ausführen eines Makros eingesetzt, welches sich in der gleichen oder auch in einer anderen Arbeitsmappe befinden kann. Ist die angegebene Mappe (noch) nicht offen, wird sie automatisch geöffnet. Weil hier kein Makro ausgeführt werden soll und das nach dem Ausrufezeichen angegebene Makro garantiert nicht existiert (ein Leerzeichen ist als Makroname nicht erlaubt), wird die Anweisung On Error Resume Next benutzt, damit der Laufzeitfehler 1004 "Microsoft Excel kann das Makro <Datei!x> nicht finden" nicht auftritt.
Bitte beachten Sie, dass bei dieser Lösungsvariante die zu öffnende Arbeitsmappe nicht zur aktiven Mappe wird (ausser es gab vorher keine aktive Mappe). Das Arbeitsmappenfenster der zu öffnenden Mappe wird jedoch eingeblendet.
Wird nach dem Ausrufezeichen nichts angegeben (z.B. "C:\Daten\MeineMappe.xls!") oder nur der Dateiname geschrieben (z.B. "C:\Daten\MeineMappe.xls"), erscheint ebenfalls die Fehlermeldung "Microsoft Excel kann das Makro <Datei!x> nicht finden". Wenn die angegebene Datei nicht existiert, tritt der Laufzeitfehler 1004 "<Datei> wurde nicht gefunden. [...]" auf. Besitzt die angegebene Datei ein falsches Dateiformat (z.B. eine doc-Datei von Microsoft Word), dann wird der Laufzeitfehler 1004 "<Datei>: hat ein ungültiges Dateiformat" eingeblendet.
Wie oben erwähnt, wird die zu öffnende Arbeitsmappe nicht automatisch aktiviert (ausser sie ist nach dem Öffnen die einzige Arbeitsmappe mit sichtbarem Mappenfenster). Tatsächlich aber wird die Arbeitsmappe beim Öffnenvorgang kurzzeitig aktiviert und dann gleich deaktiviert. Dadurch werden die Workbook-Ereignisse ausgelöst und ausgeführt (ein Auto_Open-Makro dieser Mappe jedoch nicht). Obwohl die Arbeitsmappe schliesslich nicht die aktive Mappe ist, wird sie nach dem Öffnen kurz aktiviert und gleich wieder deaktiviert, wodurch sämtliche Ereignisse ausgelöst werden. Man kann dies verhindern, indem Ereignisse vorübergehend ausgeschaltet werden (Application.EnableEvents = False).
Beachten Sie unbedingt, dass nach Run immer etwas angegeben wird. Übergeben Sie nie eine leere Zeichenfolge oder überhaupt nichts. Microsoft Excel 97 würde in diesem Fall sofort mit einem Ausnahmefehler abstürzen (Dr. Watson lässt grüssen...). In Microsoft Excel 2000 und neuer existiert dieses Problem nicht mehr.
Weitere Informationen über Application.Run finden Sie im Codebeispiel "Arbeitsmappe öffnen ohne sie zu aktivieren".
» Codebeispiel #6: Dieser Programmcode sucht das Kombinationsfeld "Adresse" der Web-Symbolleiste. Das gesuchte Steuerelement besitzt die ID 1740. Anhand der Text-Eigenschaft wird der Dateiname der zu öffnenden Arbeitsmappe in das Feld eingetragen, wodurch die Datei automatisch geöffnet wird. Das explizite Bestätigen der Eingabe mittels Enter-Taste oder dergleichen ist nicht nötig. Der Dateipfad muss nicht zwingend als File URL angegeben werden. Die übliche Pfad-Schreibweise wird ebenfalls akzeptiert. Gewöhnliche Der VBA-Code funktioniert übrigens in allen gängigen Microsoft Office-Programmen (Excel, Word, PowerPoint etc.), und auch bei nicht eingeblendeter Web-Symbolleiste. Bitte beachten Sie, dass bei dieser Lösung der Makrovirus-Sicherheitshinweis eingeblendet wird, sofern die Einstellung "Makrovirus-Schutz" im Optionen-Dialog von Excel aktiviert (Microsoft Excel 97) beziehungsweise die Sicherheitsstufe nicht auf "Tief" eingestellt ist (ab Microsoft Excel 2000). Mehr darüber siehe Codebeispiel "Arbeitsmappe öffnen mit Anzeigen der Makrovirus-Warnmeldung".
» Bei Codebeispiel #7 wird die Arbeitsmappe anhand der GetObject-Funktion geöffnet. Da GetObject die angegebene Datei nicht automatisch als Arbeitsmappenfenster einblendet, muss dieses explizit sichtbar gemacht werden (Codezeile "wkbWorkbook.Windows(1).Visible = True"). Dadurch wird die Arbeitsmappe zudem zur aktiven Mappe.
» Das Codebeispiel #8 ist die kurze Variante von Codebeispiel #7.
Weitere Informationen über GetObject in Bezug auf Öffnen von Arbeitsmappe erhalten Sie im Codebeispiel "Arbeitsmappe mit ausgeblendetem Arbeitsmappenfenster öffnen".
.VBA-Code #1
Sub OpenWorkbook1()
Workbooks.Open Filename:="C:\Daten\MeineMappe.xls"
End Sub
.VBA-Code #2
Sub OpenWorkbook2()
Workbooks.Open Filename:="C:\Daten\MeineMappe.xls", UpdateLinks:=0
End Sub
.VBA-Code #3
Sub OpenWorkbook3()
Workbooks.Open Filename:="C:\Daten\MeineMappe.xls", ReadOnly:=True
End Sub
.VBA-Code #4
Sub OpenWorkbook4()
ActiveWorkbook.FollowHyperlink "C:\Daten\MeineMappe.xls"
End Sub
.VBA-Code #5
Sub OpenWorkbook5()
On Error Resume Next
Application.Run "C:\Daten\MeineMappe.xls! "
End Sub
.VBA-Code #6
Sub OpenWorkbook6()
Application.CommandBars.FindControl(Id:=1740).Text =
"file:///C:/Daten/MeineMappe.xls"
End Sub
.VBA-Code #7
Sub OpenWorkbook7()
Dim wkbWorkbook As Workbook
Set wkbWorkbook = GetObject("C:\Daten\MeineMappe.xls")
wkbWorkbook.Windows(1).Visible = True
Set wkbWorkbook = Nothing
End Sub
.VBA-Code #8
Sub OpenWorkbook8()
GetObject("C:\Daten\MeineMappe.xls").Windows(1).Visible = True
End Sub
.Hinweis
Gemäss weit verbreiteter Meinung wird eine mit Open
geöffnete Arbeitsmappe immer automatisch zur aktiven Mappe. Das stimmt wohl in den
meisten Fällen, aber eben nicht immer. Wenn es sich um Mappe handelt, die in
ausgeblendetem Zustand gespeichert wurde (Menübefehl Fenster/Ausblenden),
so ist sie nach dem Öffnen ebenfalls wieder ausgeblendet. Eine ausgeblendete Mappe kann
nie aktiv sein. Das bedeutet, dass diejenige Mappe, die vor Ausführung der
"Workbooks.Open"-Anweisung aktiv war, auch danach noch aktiv ist. Das gleiche
Verhalten trifft auch für Add-In-Dateien zu, die mittels Open geöffnet werden.
Wenn Sie verhindern möchten, dass die zu öffnende Arbeitsmappe automatisch zur aktiven Mappe wird, müssen Sie die Run-Methode verwenden, wie es im Codebeispiel #5 gezeigt wird.
Weitere Informationen |
|
Bereits geöffnete Arbeitsmappe erneut öffnen ohne "Änderungen gehen verloren"-Meldung
.Beschreibung
Eine bereits in der aktuellen Excel-Sitzung geöffnete
Arbeitsmappe kann gleich wie eine geschlossene Mappe anhand der Open-Methode der Workbooks-Auflistung
(erneut) geöffnet werden. Wenn Sie keine Änderungen in der geöffneten Mappe vorgenommen
haben und dann diese Mappe erneut öffnen, wird automatisch die geöffnete Mappe
geschlossen und neu vom Datenträger geladen. Wenn die Arbeitsmappe jedoch noch nicht
gespeicherte Änderungen enthält, erscheint vor dem Öffnen die Hinweismeldung, dass die
Datei bereits geöffnet sei und beim erneuten Öffnen alle Änderungen verloren gingen.
Der Benutzer kann dann wählen, ob der Öffnen-Vorgang abgebrochen werden soll. Damit
diese Rückfrage nicht erscheint, müssen die Systemmeldungen von Microsoft Excel anhand
der Eigenschaft DisplayAlerts vorübergehend deaktiviert werden.
.VBA-Code
Sub ReopenWorkbook()
Application.DisplayAlerts = False
Workbooks.Open "C:\Daten\MeineMappe.xls"
Application.DisplayAlerts = True
End Sub
Prüfen, ob eine Arbeitsmappe bereits geöffnet ist
.Beschreibung
Diese Codebeispiele zeigen, wie man überprüfen kann, ob eine
Arbeitsmappe in der aktuellen Excel-Sitzung geöffnet ist.
» Die in Codebeispiel #1 vorgestellte Funktion CheckIfOpen prüft, ob eine bestimmte Arbeitsmappe bereits geöffnet ist. Dazu wird das Workbooks-Auflistungsobjekt, in welchem alle geöffneten Arbeitsmappen registriert sind, durchlaufen und jedes Element der Auflistung mit dem gesuchten Arbeitsmappennamen verglichen. Wird eine Übereinstimmung gefunden, so ist die Arbeitsmappe bereits geöffnet.
» Das Beispiel #2 zeigt einen komplett anderen Ansatz: Hier wird einfach eine Objektreferenz auf die gesuchte Mappe angelegt. Schlägt dieser Vorgang fehl, wird der Laufzeitfehler 9 ausgelöst, was bedeutet, dass die Mappe nicht in der aktuellen Excel-Sitzung geöffnet ist. Die Laufzeitfehler werden mit On Error Resume Next abgefangen und anschliessend ausgewertet.
.VBA-Code #1
Public Function CheckIfOpen(strFilename As String) As
Boolean
Dim wbkWorkbook As Workbook
For Each wbkWorkbook In Application.Workbooks
If UCase(wbkWorkbook.Name) = UCase(strFilename) Then
CheckIfOpen = True
Exit Function
End If
Next wbkWorkbook
CheckIfOpen = False
End Function
'*** Aufruf ***
Sub TestCall()
If CheckIfOpen("MeineMappe.xls") Then
MsgBox "Die Mappe ist in dieser Excel-Sitzung geöffnet."
Else
MsgBox "Die Mappe ist in dieser Excel-Sitzung nicht
geöffnet."
End If
End Sub
.VBA-Code #2
Sub CheckIfBookIsOpen()
Dim wkbWorkbook As Workbook
On Error Resume Next
Set wkbWorkbook = Workbooks("MeineMappe.xls")
If Err.Number = 9 Then
MsgBox "Die Mappe ist in dieser Excel-Sitzung nicht
geöffnet."
ElseIf Err.Number <> 0 Then
MsgBox "Ein Fehler ist aufgetreten."
Else
MsgBox "Die Mappe ist in dieser Excel-Sitzung geöffnet."
Set wkbWorkbook = Nothing
End If
End Sub
.Hinweis
Siehe auch Microsoft Knowledge Base-Artikel:
XL2000: For Each Loop to Determine If an
Excel Workbook Is Open
http://support.microsoft.com/?kbid=213299
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
Prüfen, ob eine Arbeitsmappen-Datei bereits in Benutzung ist
.Beschreibung
Dieses Beispiel stellt eine Funktion vor, mit der überprüft
werden kann, ob eine Arbeitsmappendatei bereits bearbeitet wird - egal ob in der aktuellen
oder einer anderen Excel-Sitzung oder in einem anderen Programm. Dazu wird die
Arbeitsmappendatei (d.h. die xls-Datei) mit der Open-Anweisung exklusiv im
Lesezugriff-Modus geöffnet (For Input Lock Read) und dabei kontrolliert, ob der
Laufzeitfehler 70 "Zugriff verweigert" auftritt. Dieser tritt auf, wenn sich die
Datei in Bearbeitung befindet.
.Autor
Microsoft Support (Grössere Anpassungen durch Philipp von Wartburg)
Siehe auch MS KB-Artikel:
XL97: Macro Code to Check Whether a File
Is Already Open
http://support.microsoft.com/?kbid=138621
XL2000: Macro Code to Check Whether a File Is Already Open
http://support.microsoft.com/?kbid=213383
XL2002: Macro Code to Check Whether a File Is Already Open
http://support.microsoft.com/?kbid=291295
.VBA-Code
Function IsFileOpen(strFileame As String) As Boolean
Dim intErrorNum As Integer
On Error Resume Next
Open strFilename For Input Lock Read As #1
Close #1
intErrorNum = Err.Number
On Error GoTo 0
Select Case intErrorNum
Case 0
'Kein Fehler, also ist Datei
nicht geöffnet
IsFileOpen = False
Case 70
'Fehler "Zugriff
verweigert", also ist Datei in Bearbeitung
IsFileOpen = True
Case Else
'Anderer Fehler: Fehlermeldung
anzeigen
Error intErrorNum
End Select
End Function
'*** Aufruf ***
Sub TestCall()
If IsFileOpen("C:\Daten\MeineMappe.xls") Then
MsgBox "Die Datei wird momentan bearbeitet."
Else
MsgBox "Die Datei wird momentan nicht bearbeitet."
End If
End Sub
Verwandte Codebeispiele |
|
Weitere Informationen |
|
Prüfen, ob eine Datei schreibgeschützt ist
.Beschreibung
Die folgenden Beispiele prüfen, ob eine Datei das
Schreibgeschützt-Attribut (read-only) besitzt. Anstelle einer xls-Datei kann
selbstverständlich auch eine Datei mit einem anderen Dateityp wie beispielsweise doc,
txt, exe usw. verwendet werden.
» Das Beispiel #1 benutzt die Konstante vbReadOnly, die anhand des logischen Operators And mit der GetAttr-Funktion verknüpft wird (es wird eine sogenannte logische Konjunktion durchgeführt).
» Im Codebeispiel #2 wird der von GetAttr ermittelte Wert durch 2 dividiert und dann anhand des Mod-Operators geprüft, ob der Rest der Division die Zahl 1 ergibt. Diese Art der Prüfung funktioniert in jedem Fall korrekt, weil die Summe der Attributwerte bei einer schreibgeschützten Datei nie ohne Rest durch 2 teilbar ist, egal welche sonstigen Attribute die Datei besitzt (Versteckt, System, Archiv etc.).
» Das dritte Beispiel zeigt, wie die Schreibgeschützt-Abfrage in eine separate Funktion verpackt werden kann (siehe auch Beschreibung von Codebeispiel #2).
.VBA-Code #1
Public Sub CheckReadOnly1()
'Dateiattribut "Schreibgeschützt" der Datei
abfragen
If GetAttr("C:\MeineMappe.xls") And vbReadOnly Then
MsgBox "Die Datei ist schreibgeschützt."
Else
MsgBox "Die Datei ist nicht schreibgeschützt."
End If
End Sub
.VBA-Code #2
Public Sub CheckReadOnly2()
'Dateiattribut
"Schreibgeschützt" der Datei abfragen
If GetAttr("C:\MeineMappe.xls") Mod 2 = 1
Then
MsgBox "Die Datei ist schreibgeschützt."
Else
MsgBox "Die Datei ist nicht schreibgeschützt."
End If
End Sub
.VBA-Code #3
Public Function CheckReadOnly3(strFile As String) As
Boolean
'Dateiattribut
"Schreibgeschützt" der Datei abfragen
CheckReadOnly3 = GetAttr(strFile) And vbReadOnly
' - oder -
CheckReadOnly3 = GetAttr(strFile) Mod 2 = 1
End Sub
'*** Aufruf ***
Sub TestCall()
If CheckReadOnly3("C:\MeineMappe.xls") Then
MsgBox "Die Datei ist schreibgeschützt."
Else
MsgBox "Die Datei ist nicht schreibgeschützt."
End If
End Sub
Weitere Informationen |
|
Verwandte Codebeispiele |
|
|
Prüfen, ob die aktive Arbeitsmappe schreibgeschützt geöffnet wurde
.Beschreibung
Wird in Microsoft Excel eine Arbeitsmappe schreibgeschützt
geöffnet, so erscheint im Fenstertitel des Mappenfensters der Hinweis
"[Schreibgeschützt]". In einem VBA-Programm kann man den Schreibschutz anhand
der ReadOnly-Eigenschaft des Workbook-Objektes abfragen. Das
nachstehende Codebeispiel zeigt, wie dies gemacht wird.
Eine Arbeitsmappe wird schreibgeschützt geöffnet, wenn man sie explizit über den Menübefehl "Schreibgeschützt öffnen" öffnet, wenn die Datei selbst schreibgeschützt ist (das Dateiattribut "Schreibgeschützt" ist aktiviert), wenn man als Benutzer nicht über die Berechtigung "Schreiben" für die Datei verfügt, wenn sie beim Excelstart mit dem Parameter "/r" geöffnet wurde oder wenn sie bereits von einem anderen Benutzer bearbeitet wird und dann im Dialog "Dateireservierung" die Schaltfläche "Schreibgeschützt" angeklickt wird.
.VBA-Code
Sub CheckIfOpenedAsReadOnly()
If ActiveWorkbook.ReadOnly = True Then
MsgBox "Mappe wurde schreibgeschützt geöffnet."
Else
MsgBox "Mappe wurde nicht schreibgeschützt geöffnet."
End If
End Sub
Weitere Informationen |
|
Arbeitsmappe öffnen ohne Ausführung von VBA-Code im Open-Ereignis
.Beschreibung
Durch das Deaktivieren der Ereignisse wird erreicht, dass beim
Öffnen einer anderen Arbeitsmappe der im Workbook_Open-Ereignis der Mappe
enthaltene Programmcode nicht ausgeführt wird. Beachten Sie unbedingt, dass mit der hier
vorgestellten Lösung sämtliche Ereignisse deaktiviert werden. Das bedeutet, dass
Programmcode, der sich in den Ereignissen der aktiven Mappe befindet (und nicht in der zu
öffnenden), ebenfalls nicht abgearbeitet wird. Falls die aktive Arbeitsmappe VBA-Code in
der Ereignisprozedur Workbook_Deactivate oder Workbook_WindowDeactivate
enthält, so wird dieser nicht ausgeführt, wenn die andere Arbeitsmappe geöffnet wird.
Diese Ereignisse enthalten bei Excel-Anwendungen vielfach Programmcode zur Steuerung
beziehungsweise Sperrung der durch die Anwendung erstellten Symbolleisten und deren
Schaltflächen. Bei deaktivierten Ereignissen würden diese Symbolleisten nicht korrekt
behandelt, sprich sie wären trotz Öffnen und Aktivierung einer anderen Mappe weiterhin
verfügbar.
.VBA-Code
Sub OpenWorkbookWithoutEvents()
Application.EnableEvents = False
Workbooks.Open "C:\Daten\MeineMappe.xls"
Application.EnableEvents = True
End Sub
.Hinweis
Unmittelbar nach dem Öffnen der Arbeitsmappe sollten - wie
das obige Beispiel zeigt und in der Beschreibung erläutert wurde - die Ereignisse wieder
aktiviert werden.
Beachten Sie bitte, dass ein in der Arbeitsmappe enthaltenes Auto_Open-Makro nie ausgeführt wird, wenn die Mappe mittels VBA-Programmcode geöffnet wird.
Arbeitsmappe öffnen ohne Ausführung des Auto_Open-Makros
.Beschreibung
Im Gegensatz zu den Ereignis-Prozeduren in einer Arbeitsmappe
wird beim Öffnen mittels VBA-Programmcode das Auto_Open-Makro nie
ausgeführt. Wenn Sie also eine Arbeitsmappe öffnen möchten, ohne dass das in der Mappe
enthaltene Auto_Open-Makro ausgeführt wird, können Sie ganz einfach die Open-Methode
der Workbooks-Auflistung benutzen.
.VBA-Code
Sub OpenWorkbookWithoutAutoOpenMacro()
Workbooks.Open "C:\Daten\MeineMappe.xls"
End Sub
Verwandte Codebeispiele |
|
|
Arbeitsmappe öffnen mit Ausführung des Auto_Open-Makros
.Beschreibung
Weil beim Öffnen einer Arbeitsmappe mittels VBA-Programmcode
das Auto_Open-Makro nie ausgeführt wird, muss man es explizit
aufrufen. Dies geschieht mit der RunAutoMacros-Methode des Workbook-Objektes.
Als Parameter wird die Konstante xlAutoOpen übergeben (oder die Zahl 1). Es
tritt kein Laufzeitfehler auf, wenn die Arbeitsmappe kein Auto_Open-Makro
enthält.
» Das Codebeispiel #1 stellt die einfachste Lösungsvariante dar und sollte eigentlich nicht verwendet werden. Das Beispiel soll lediglich zeigen, wie das Auto_Open-Makro aufgerufen wird. Das Problem bei diesem Programmcode ist, dass, wenn die andere Mappe zwar geöffnet werden kann aber sie nicht automatisch zur aktiven Mappe wird (zum Beispiel wenn ihr Arbeitsmappenfenster ausgeblendet ist), dass das falsche Auto_Open-Makro ausgeführt wird; nämlich dasjeniger der bisher aktiven Arbeitsmappe.
» Bei Codebeispiel #2 wird das in Beispiel #1 vorhandene Problem durch Verwenden einer Objektvariable für das Workbook-Objekt umgangen (Variable wkbWorkbook). Da RunAutoMacros nicht von ActiveWorkbook sondern von wkbWorkbook aufgerufen wird, wird das korrekte Auto_Open-Makro ausgeführt.
» Das Beispiel #3 zeigt die beste Lösung. Hier wird das Auto_Open-Makro der anderen Arbeitsmappe nur dann aufgerufen, wenn diese auch wirklich geöffnet werden konnte.
» Das Codebeispiel #4 verwendet einen ganz anderen Lösungsansatz. Die Arbeitsmappe wird nicht mit Open sondern mit der Run-Methode des Application-Objektes geöffnet. Dieser wird der vollständige Dateiname der Mappe sowie - getrennt durch ein Ausrufezeichen - der Name des auszuführenden Makros Auto_Open übergeben. Beachten Sie bitte, dass der Dateipfad zwingend in Hochkommas geschrieben werden muss. Anderenfalls tritt der Laufzeitfehler 1004 "Microsoft Excel kann das Makro <Datei!Makro> nicht finden".
- Die Mappe wird nicht zur aktiven Arbeitsmappe! Ereignisse
werden ausgelöst.
- Laufzeitfehler 1004, wenn die Mappe nicht geöffnet werden konnte.
» Codebeispiel #5 ist eine erweiterte Variante von Beispiel #4.
.VBA-Code #1
Sub OpenWorkbookWithAutoOpenMacro1()
Workbooks.Open "C:\Daten\MeineMappe.xls"
ActiveWorkbook.RunAutoMacros xlAutoOpen
End Sub
.VBA-Code #2
Sub OpenWorkbookWithAutoOpenMacro2()
Dim wkbWorkbook As Workbook
Set wkbWorkbook = Workbooks.Open("C:\Daten\MeineMappe.xls")
wkbWorkbook.RunAutoMacros xlAutoOpen
Set wkbWorkbook = Nothing
End Sub
.VBA-Code #3
Sub OpenWorkbookWithAutoOpenMacro3()
Dim wkbWorkbook As Workbook
On Error Resume Next
Set wkbWorkbook = Workbooks.Open("C:\Daten\MeineMappe.xls")
If Err.Number = 1004 Then
MsgBox "Die Arbeitsmappe konnte nicht geöffnet werden!",
vbExclamation
Else
wkbWorkbook.RunAutoMacros xlAutoOpen
Set wkbWorkbook = Nothing
End If
End Sub
.VBA-Code #4
Sub OpenWorkbookWithAutoOpenMacro4()
Application.Run "'C:\Daten\MeineMappe.xls'!Auto_Open"
End Sub
.VBA-Code #5
Sub OpenWorkbookWithAutoOpenMacro5()
On Error Resume Next
Application.Run "'C:\Daten\MeineMappe.xls'!Auto_Open"
If Err.Number = 1004 And InStr(Err.Description, "!Auto_Open") >
0 Then
MsgBox "Die Arbeitsmappe enthält kein Auto_Open-Makro.",
vbInformation
End If
End Sub
Verwandte Codebeispiele |
|
|
|
Weitere Informationen |
|
Arbeitsmappe mit ausgeblendetem Arbeitsmappenfenster öffnen
.Beschreibung
Wenn man eine Arbeitsmappe mit der Open-Methode des Workbook-Objektes
öffnet, erscheint sie in Microsoft Excel automatisch in einem Arbeitsmappenfenster. Auch
andere Lösungsvarianten wie die Benutzung der FollowHyperlink-Methode verhindert
die Anzeige des Fensters nicht. Trotzdem gibt es eine Möglichkeit, wie man verhindert,
dass das Fenster bereits beim Öffnen der Arbeitsmappe ausgeblendet ist.
.VBA-Code #1
Sub OpenWorkbookWithHiddenWindow1()
GetObject "C:\Daten\EineMappe.xls"
End Sub
.VBA-Code #2
Sub OpenWorkbookWithHiddenWindow2()
Dim wkbWorkbook As Workbook
Set wkbWorkbook = GetObject("C:\Daten\EineMappe.xls")
Set wkbWorkbook = Nothing
End Sub
.Hinweis
Bitte beachten Sie, dass die zu öffnende Mappe nicht
zur aktiven Arbeitsmappe wird. Dies, weil ausgeblendete Arbeitsmappen nie aktiv sein
können.
Verwandte Codebeispiele |
|
Arbeitsmappe öffnen ohne sie zu aktivieren
.Beschreibung
Das Öffnen einer Arbeitsmappe hat gewöhnlich zur Folge, dass
die Mappe automatisch zur aktiven Mappe wird. Einzige Ausnahme ist, wenn das Mappenfenster
der Arbeitsmappe von vornerein ausgeblendet ist und dadurch beim Öffnen nicht sichtbar
ist. Dazu muss die Arbeitsmappe allerdings bereits mit ausgeblendetem Fenster gespeichert
worden sein, oder man verwendet die in Codebeispiel "Arbeitsmappe mit
ausgeblendetem Arbeitsmappenfenster öffnen" vorgestellte Lösung. Wenn man
jedoch möchte, dass die Arbeitsmappe mit eingeblendetem Fenster geöffnet wird, aber ohne
die Mappe dabei zu aktivieren, kann man das hier vorgestellte Codebeispiel benutzen.
Wird nach dem Ausrufezeichen nichts angegeben (z.B. "C:\Daten\MeineMappe.xls!") oder nur der Dateiname (z.B. "C:\Daten\MeineMappe.xls") geschrieben, erscheint ebenfalls die Fehlermeldung "Microsoft Excel kann das Makro <Datei!x> nicht finden". Wenn die angegebene Datei nicht existiert, tritt der Laufzeitfehler 1004 "<Datei> wurde nicht gefunden. [...]" auf. Besitzt die angegebene Datei ein falsches Dateiformat (z.B. die doc-Datei eines Microsoft Word-Dokumentes), dann wird der Laufzeitfehler 1004 "<Datei>: hat ein ungültiges Dateiformat" eingeblendet.
Wie oben erwähnt, wird die zu öffnende Arbeitsmappe nicht automatisch aktiviert (ausser sie ist nach dem Öffnen die einzige Arbeitsmappe mit sichtbarem Mappenfenster). Tatsächlich aber wird die Arbeitsmappe beim Öffnenvorgang kurzzeitig aktiviert und dann gleich deaktiviert. Dadurch werden die Workbook-Ereignisse ausgelöst und ausgeführt (ein Auto_Open-Makro dieser Mappe jedoch nicht). Obwohl die Arbeitsmappe schlussendlich nicht die aktive Mappe ist, wird sie nach dem Öffnen kurz aktiviert und gleich wieder deaktiviert, wodurch sämtliche Ereignisse ausgelöst werden und der in den Ereignisprozeduren stehende VBA-Programmcode ausgeführt wird.
1. Open der neuen Mappe
2. WindowDeactivate der alten Mappe
3. Deactivate der alten Mappe
4. Activate der neuen Mappe
5. WindowActivate der neuen Mappe
6. WindowDeactivate der neuen Mappe
7. Deactivate der neuen Mappe
8. Activate der alten Mappe
9. WindowActivate der alten Mappe
Beachten Sie unbedingt, dass nach Run immer etwas angegeben wird. Übergeben Sie nie eine leere Zeichenfolge oder überhaupt nichts. Microsoft Excel 97 würde in diesem Fall sofort mit einem Ausnahmefehler abstürzen (Dr. Watson lässt grüssen...). In Microsoft Excel 2000 und neuer existiert dieses Problem nicht mehr.
Das Codebeispiel #2 macht das gleiche wie Beispiel #1 und soll lediglich deutlich machen, dass auch relative Pfade verwendet werden können.
.VBA-Code #1
Sub OpenWorkbookWithoutActivation1()
Application.Run "C:\Daten\MeineMappe.xls! "
End Sub
.VBA-Code #2
Sub OpenWorkbookWithoutActivation2()
Application.Run "..\MeineMappe.xls! "
End Sub
.Hinweis
Bitte beachten Sie, dass die zu öffnende Mappe nur dann nicht
zur aktiven Arbeitsmappe wird, wenn es bereits eine andere Arbeitsmappe mit sichtbarem
Mappenfenster gibt.
Verwandte Codebeispiele |
|
|
|
Ordner im Windows Explorer anzeigen
.Beschreibung
Die folgenden Codebeispiele zeigen, wie man den Windows
Explorer öffnen und dabei einen bestimmten Ordner angezeigen kann.
» Das Beispiel #1 zeigt die bekannte Lösungsvariante mit der Shell-Funktion von VBA. Die Programmdatei "Explorer.exe" des Windows Explorers wird aufgerufen und in der Befehlszeile der Pfad des gewünschten Ordners angegeben.
» Das Codebeispiel #2 verwendet ebenfalls die Shell-Funktion von VBA, öffnet den Explorer aber wegen des Schalters "/e" in der Explorer-Ansicht (Verzeichnisbaum in der linken Fensterhälfte, auch Baumansicht genannt).
» Im Codebeispiel #3 wird die FollowHyperlink-Methode des Workbook-Objektes verwendet, was zum gleichen Ergebnis wie bei Beispiel #2 führt. Der Explorer zeigt also ebenfalls die Baumansicht mit dem Verzeichnisbaum auf der linken Seite.
.VBA-Code #1
Sub ShowWindowsExplorer1()
Dim strFolder As String
strFolder = "C:\Daten"
Shell "Explorer.exe " & strFolder, vbNormalFocus
End Sub
.VBA-Code #2
Sub ShowWindowsExplorer2()
Dim strFolder As String
strFolder = "C:\Daten"
Shell "Explorer.exe /e, " & strFolder, vbNormalFocus
End Sub
.VBA-Code #3
Sub ShowWindowsExplorer3()
ActiveWorkbook.FollowHyperlink "C:\Daten"
End Sub
.Hinweis
Bitte beachten Sie, dass bei der Lösungsvariante mit Shell
der Pfad des zu öffnenden Ordners ohne Anführungszeichen (")
anzugeben ist, d.h. obwohl der Ordnername Leerzeichen enthält. Wenn der Ordner
beispielsweise "C:\Meine Daten" heisst, sieht der VBA-Code wie folgt aus:
Shell "Explorer.exe C:\Meine Daten", vbNormalFocus
Tipp!
Viele weitere Codebeispiele zu diesem Thema gibt's unter "Windows Explorer starten".
Verwandte Codebeispiele |
|
Weitere Informationen |
|
.Beschreibung
Mit der VBA-Anweisung MkDir wird ein neues
Verzeichnis bzw. ein neuer Ordner angelegt. Als Alternative kann man auch die Add-Methode
von SubFolders oder die CreateFolder-Methode aus der FileSystemObject-Objektbibliothek
verwenden.
» Das Beispiel #1 zeigt die üblich benutzte Variante, bei welcher der komplette Pfad des neuen Verzeichnisses bei MkDir angegeben wird.
» Im zweiten Beispiel wird nur der Verzeichnisname angegeben, wodurch das neue Verzeichnis im aktuellen Verzeichnis des aktuellen Laufwerkes angelegt wird (siehe auch Hinweis am Ende dieses Codebeispiels).
» Das Codebeispiel #3 verwendet die Add-Methode aus der FileSystemObject-Objektbibliothek zum Erstellen des neuen Ordners.
» Im Beispiel #4 wird die CreateFolder-Methode aus der FileSystemObject-Objektbibliothek benutzt.
.VBA-Code #1
Sub CreateDirectory1()
MkDir "C:\Daten\NeuesVerzeichnis"
End Sub
.VBA-Code #2
Sub CreateDirectory2()
MkDir "NeuesVerzeichnis"
End Sub
.VBA-Code #3
Sub CreateDirectory3()
CreateObject("Scripting.FileSystemObject").GetFolder("C:\Daten").SubFolders.Add
"NeuesVerzeichnis"
End Sub
.VBA-Code #4
Sub CreateDirectory4()
CreateObject("Scripting.FileSystemObject").CreateFolder
"C:\Daten\NeuesVerzeichnis"
End Sub
.Hinweis
Bitte beachten Sie, dass MkDir, CreateFolder
und Add nicht in jeder Situation den gleichen Laufzeitfehler auslösen. Hier eine
kleine Übersicht:
| Ordner existiert bereits * | Mehrere Ordner angegeben * | Keine Berechtigung vorhanden * | |
| MkDir | Laufzeitfehler 58 "Datei existiert bereits" |
Laufzeitfehler 76 "Pfad nicht gefunden" |
Laufzeitfehler 75 "Fehler beim Zugriff auf Pfad/Datei" |
| Add | Laufzeitfehler 75 "Fehler beim Zugriff auf Pfad/Datei" |
Laufzeitfehler 5 "Unzulässiger Prozeduraufruf oder ungültiges Argument" |
Laufzeitfehler 70 "Zugriff verweigert" |
| CreateFolder | Laufzeitfehler 75 "Fehler beim Zugriff auf Pfad/Datei" |
Laufzeitfehler 76 "Pfad nicht gefunden" |
Laufzeitfehler 70 "Zugriff verweigert" |
* Erläuterungen:
- Ordner existiert bereits: Der angegebene Ordner ist bereits vorhanden oder
es existiert eine gleichnamige Datei.
- Mehrere Ordner angegeben: Es wurde mehr als nur ein neuer Ordner angegeben
(z.B. "NeuesVerzeichnis\Unterverzeichnis").
- Keine Berechtigung vorhanden: Der Benutzer besitzt keine Berechtigung zum
Erstellen eines Verzeichnis im angegebenen Pfad.
In der VBA-Referenz ist die Beschreibung der MkDir-Anweisung nicht ganz exakt. Dort steht nämlich, dass bei Weglassen des Laufwerkes das neue Verzeichnis auf dem aktuellen Laufwerk erstellt wird. Diese Aussage verleitet zur Annahme, dass beispielsweise die Codezeile
MkDir "EinOrdner"
das Verzeichnis "EinOrdner" auf dem Laufwerk D: anlegt, falls D: das aktuelle Laufwerk ist. Dies stimmt jedoch nicht! Korrekt ist, dass das neue Verzeichnis im aktuellen Verzeichnis des aktuellen Laufwerkes erstellt wird. Die obige Codezeile erstellt das Verzeichnis "EinOrdner" beispielsweise im Verzeichnis "D:\Daten\Excel", wenn "D:\Daten\Excel" das aktuelle Verzeichnis ist, und eben nicht im Stammverzeichnis (sprich "D:\").
Mit der VBA-Funktion CurDir kann das aktuelle Verzeichnis ermittelt werden. Alternativ können Sie auch die GetAbsolutePathName-Methode des FileSystemObject-Objektes zum Herausfinden des aktuellen Verzeichnisses verwenden.
Verwandte Codebeispiele |
|
Weitere Informationen |
|
Ordner mit Unterordnern anlegen (Verzeichnisbaum)
.Beschreibung
Es existieren drei verschiedene Möglichkeiten, wie man Ordner
bzw. Unterordner mehrerer Ebenen in einem Arbeitsschritt anlegen kann. Die nachfolgenden
fünf Codebeispiele stellen die diese drei Lösungsansätze vor.
» Codebeispiel #1: Hier wird die API-Funktion MakeSureDirectoryPathExists aus der Library "ImageHlp.dll" zum Erstellen eines einzelnen Verzeichnisses oder mehrerer Verzeichnisse (Verzeichnisbaum) benutzt. Bitte beachten Sie, dass im Pfad unbedingt ein Backslash '\' als letztes Zeichen angegeben werden muss. Anderenfalls wird der Pfad nicht angelegt (ohne Fehlermeldung).
» Codebeispiel #2: Die kleine Funktion CreateDirectoryTree verwendet ebenfalls die API-Funktion MakeSureDirectoryPathExists. Wenn die Funktion True zurückgibt, so wurde der gewünschte Pfad erfolgreich angelegt. Wenn der Pfad bereits existiert, wird ebenfalls True zurückgegeben.
» Codebeispiel #3: Diese Lösungsvariante benutzt den MS-DOS-Befehl MD (bzw. MKDIR), welcher in einem Konsolenfenster (Aufruf mit "CMD") ausgeführt wird. Dieser MS-DOS-Befehl erstellt ein Verzeichnis, wobei allfällige Zwischenverzeichnisse automatisch erzeugt werden. Der Nachteil dieser Lösung ist, dass keine Erfolgskontrolle stattfindet. Wenn beim Erstellen des Pfades ein Fehler auftritt, so erfahren Sie dies nicht.
» Codebeispiel #4: Dies ist die reine VBA-Lösung. Der zu erstellende Pfad wird in seine Einzel-Verzeichnisse aufgeteilt und diese innerhalb einer Do-Loop-Schleife anhand der MkDir-Anweisung nacheinander angelegt. Allfällige Fehler werden gemeldet. Sie erfahren jedoch nicht, ob der Pfad bereits existiert oder neu angelegt wurde.
» Codebeispiel #5: Dieses Beispiel verwendet den gleichen
Ansatz wie Codebeispiel #4, nur dass hier der Programmcode als eine Funktion gekapselt
ist. In der Funktion wird zusätzlich ermittelt, wie viele neue Ordner für den Pfad
erstellt werden mussten. Der Funktion wird der anzulegende Pfad übergeben. Folgende
Rückgabewerte werden von der Funktion zurückgegeben:
- 0, wenn ein Fehler aufgetreten ist
- -1, wenn der Pfad bereits existiert
- -2, wenn ein Ordner nicht angelegt werden konnte
- > 0, wenn der Pfad angelegt wurde (die zurückgegebene Zahl entspricht der
Anzahl neu erstellter Ordner)
Der als Codebeispiel #5 vorgestellte VBA-Code stellt die beste Lösung dar, weil Sie hier erfahren, ob bzw. welche Fehler auftraten, ob der Pfad allenfalls bereits existierte und wie viele Ordner erstellt wurden (z.B. nützlich für statistische Zwecke).
.VBA-Code #1
'Deklarationsbereich
Declare Function MakeSureDirectoryPathExists Lib
"imagehlp.dll" (ByVal DirPath As String) As Long
'Codemodul
Public Sub CreateTree()
If MakeSureDirectoryPathExists("D:\Dir1\Dir2\Dir3\") <> 0
Then
MsgBox "Der Pfad wurde angelegt oder existiert bereits."
Else
MsgBox "Der Pfad konnte nicht angelegt werden."
End If
End Sub
.VBA-Code #2
'Deklarationsbereich
Declare Function MakeSureDirectoryPathExists Lib
"imagehlp.dll" (ByVal DirPath As String) As Long
'Codemodul
Public Function CreateDirectoryTree(ByVal strNewPath As
String) As Boolean
If Right$(strNewPath, 1) <> "\" Then
'Letztes Zeichen muss
ein Backslash sein
strNewPath = strNewPath &
"\"
End If
If MakeSureDirectoryPathExists(strNewPath) <> 0 Then
'* Kein Fehler aufgetreten *
'Pfad existiert bereits oder wurde soeben erfolgreich angelegt
CreateDirectoryTree = True
Else
'* Fehler aufgetreten *
'Mögliche Ursachen:
' - Der Pfad
existiert nicht, kann aber nicht angelegt werden, da der Pfad ungültige Zeichen enthält
(z.B.
' ein Platzhalterzeichen * oder ?).
' - Der Pfad existiert nicht, kann aber nicht angelegt werden, da der
angemeldete Benutzer nicht genügende
' Berechtigungen zum Anlegen von Verzeichnissen besitzt
(Write/Create-Recht fehlt).
' - Der Pfad existiert nicht, kann aber nicht angelegt werden, da ein
Verzeichnis einen Namen besitzt, der
' bereits von einer Datei verwendet wird.
' - Die Existenz des Pfades kann nicht geprüft werden, da das
angegebene Gerät nicht verfügbar ist (z.B.
' bei unterbrochener Netzwerkverbindung).
' - Der Pfad ist grundsätzlich falsch (z.B. wenn ein Ausdruck
angegeben wird, welcher kein Pfad
' repräsentiert, wie z.B. der Text "Heute ist
Regenwetter").
' - Das im Pfad angegebene Laufwerk existiert nicht (z.B. falscher
Laufwerkbuchstabe).
' - Das benötigte Laufwerk ist nicht bereit (z.B.
Datenträger/Diskette nicht eingelegt).
' - Auf das angegebene Laufwerk bzw. den Datenträger kann nicht
geschrieben werden (z.B. Schreibschutz
' der
Diskette aktiviert oder CD-ROM).
CreateDirectoryTree = False
End If
End Function
'*** Aufruf ***
Sub TestCall()
If CreateDirectoryTree("C:\Dir1\Dir2\Dir3") = True Then
MsgBox "Der Pfad wurde angelegt oder existiert
bereits."
Else
MsgBox "Der Pfad konnte nicht angelegt werden."
End If
End Sub
.VBA-Code #3
Public Sub CreateDirectoryTree1()
Shell "CMD /C MD C:\Dir1\Dir2\Dir3", vbMinimizedNoFocus
End Sub
.VBA-Code #4
Public Sub CreateDirectoryTree2()
Const Path As String = "C:\Dir1\Dir2\Dir3"
Dim strFolder As String
Dim intPos1 As Integer
Dim intPos2 As Integer
On Error GoTo ErrorHandler
ChDrive Left$(Path, 1)
ChDir Left$(Path, 3)
intPos1 = InStr(Path, "\")
If intPos1 > 0 Then
Do
intPos2 = InStr(intPos1 + 1, Path, "\")
If intPos2 > 0 Then
strFolder = Mid$(Path, intPos1 + 1, intPos2 -
intPos1 - 1)
intPos1 = intPos2
Else
strFolder = Mid$(Path, intPos1 + 1)
End If
MkDir strFolder
DoEvents
If intPos2 > 0 Then
ChDir Left$(Path, intPos2 - 1)
Else
ChDir Path
Exit Do
End If
Loop
End If
Exit Sub
ErrorHandler:
If Err.Number <> 75 Then
MsgBox "Fehler beim Anlegen/Wechseln des Ordners '" &
strFolder & "'!", vbExclamation
End If
Resume Next
End Sub
.VBA-Code #5
Public Function CreateTree(ByVal Path As String) As
Integer
Dim strFolder As String
Dim intPos1 As Integer
Dim intPos2 As Integer
Dim intMake As Integer
Dim intError As Integer
On Error GoTo ErrorHandler
ChDrive Left$(Path, 1)
ChDir Left$(Path, 3)
intPos1 = InStr(Path, "\")
If intPos1 > 0 Then
Do
intPos2 = InStr(intPos1 + 1, Path, "\")
If intPos2 > 0 Then
strFolder = Mid$(Path, intPos1 + 1, intPos2 -
intPos1 - 1)
intPos1 = intPos2
Else
strFolder = Mid$(Path, intPos1 + 1)
End If
MkDir strFolder
DoEvents
intMake = intMake + 1
If intPos2 > 0 Then
ChDir Left$(Path, intPos2 - 1)
Else
ChDir Path
Exit Do
End If
Loop
End If
If intMake = intError Then
'Alle Ordner existieren bereits
'-1 für True zurückgeben
CreateTree = -1
Else
'Es wurde ein oder mehrere Ordner erstellt
'Anzahl erstellte Ordner zurückgeben
CreateTree = intMake - intError
End If
Exit Function
ErrorHandler:
If Err.Number = 75 Then
'MkDir erzeugte einen Fehler, weil der Ordner
bereits existiert
intError = intError + 1
ElseIf Err.Number = 76 Then
'ChDir erzeugte einen Fehler, weil eine Datei den
gleichen Namen wie der Ordner besitzt
CreateTree = -2
Exit Function
Else
'Anderer Fehler
aufgetreten
'0 für False
zurückgeben
CreateTree = 0
Exit Function
End If
Resume Next
End Function
'*** Aufruf ***
Sub TestCall()
Const strPath As String = "C:\Dir1\Dir2\Dir3"
Dim intRC As Integer
intRC = CreateTree(strPath)
If intRC = 0 Then
'Fehler aufgetreten
MsgBox "Fehler beim Anlegen des Pfades '" &
strPath & "'!"
ElseIf intRC = -1 Then
'Pfad bereits vorhanden
MsgBox "Der anzulegende Pfad '" & strPath &
"' existiert bereits."
ElseIf intRC = -2 Then
'Ordner-Erstellung fehlgeschlagen
MsgBox "Ein Ordner des anzulegenden Pfades '" & strPath
& "' konnte nicht erstellt werden."
Else
'Pfad wurde angelegt
If intRC = 1 Then
MsgBox "Der Pfad '" & strPath & "'
wurde angelegt. Es wurde " & intRC & " neuer Ordner erstellt."
Else
MsgBox "Der Pfad '" & strPath & "'
wurde angelegt. Es wurden " & intRC & " neue Ordner erstellt."
End If
End If
End Sub
.Hinweis
Beachten Sie bitte, dass der Pfad, der als DirPath-Parameter
der API-Funktion MakeSureDirectoryPathExists übergegeben wird, unbedingt einen
Backslash '\' als letztes Zeichen aufweisen muss (also zum Beispiel
"C:\Dir1\Dir2\Dir3\" statt "C:\Dir1\Dir2\Dir3"). Anderenfalls wird der
Pfad nicht angelegt (ohne Fehlermeldung).
Berücksichtigen Sie auch, dass es viele weitere potenzielle Fehler gibt. Unter anderem könnte der angesprochene Datenträger schreibgeschützt sein (z.B. bei einer Diskette), der Datenträger nicht beschrieben werden (z.B. bei einer CD-ROM) oder der Benutzer keine Berechtigung zum Anlegen von Verzeichnissen besitzen.
Tipp!
Wie man die Datei/Ordner-Berechtigungen eines Benutzers abfragen kann, wird
in Codebeispiel "Prüfen,
ob der Benutzer genügend Berechtigungen für den Zugriff auf einen bestimmten Ordner
besitzt" gezeigt.
Weitere Informationen |
|
Kurzer Pfadname zu einem langen Pfadnamen ermitteln
.Beschreibung
Mit der Windows API-Funktion OSGetShortPathName kann
die kurze Schreibweise (auch "MS-DOS-Name" genannt) eines langen Pfades
abgefragt werden. Der kurze Pfad von beispielsweise "C:\Programme\Microsoft
Office" lautet "C:\PROGRA~1\MICROS~1".
.VBA-Code
'Deklarationsbereich
Declare Function OSGetShortPathName Lib
"kernel32" Alias _
"GetShortPathNameA" (ByVal lpszLongPath As String, ByVal _
lpszShortPath As String, ByVal cchBuffer As Long) As Long
'Codemodul
Function GetShortPathName(ByVal strLongPath As String) As
String
Const cchBuffer = 300
Dim strShortPath As String
Dim lResult As Long
Dim intZeroPos As Integer
strShortPath = String(cchBuffer, Chr$(0))
lResult = OSGetShortPathName(strLongPath, strShortPath, cchBuffer)
If lResult = 0 Then
MsgBox "Pfad nicht gefunden!", vbExclamation
GetShortPathName = ""
Else
intZeroPos = InStr(strShortPath, Chr$(0))
If intZeroPos > 0 Then
GetShortPathName = Left$(strShortPath, intZeroPos - 1)
Else
GetShortPathName = strShortPath
End If
End If
End Function
'*** Aufruf ***
Sub TestCall()
MsgBox GetShortPathName("C:\Programme\Microsoft Office")
End Sub
Verwandte Codebeispiele |
|
|
Langer Pfadname zu einem kurzen Pfadnamen ermitteln
.Beschreibung
Dieses Codebeispiel zeigt, wie man den langen Pfad eines
kurzen Pfades erhält.
.VBA-Code
Function GetLongPathName(ByVal strShortName As String) As
String
Dim strLongName As String
Dim strTemp As String
Dim intSlashPos As Integer
On Error Resume Next
strShortName = strShortName & "\"
intSlashPos = InStr(4, strShortName, "\")
While intSlashPos
strTemp = Dir(Left$(strShortName, intSlashPos - 1), vbNormal + vbHidden
+ vbSystem + vbDirectory)
If strTemp = "" Then
Err.Clear
GetLongPathName = ""
Exit Function
End If
strLongName = strLongName & "\" & strTemp
intSlashPos = InStr(intSlashPos + 1, strShortName, "\")
Wend
GetLongPathName = Left$(strShortName, 2) & strLongName
End Function
'*** Aufruf ***
Sub TestCall()
MsgBox GetLongPathName("C:\PROGRA~1\MICROS~1")
End Sub
Verwandte Codebeispiele |
|
|
.Beschreibung
Das Anlegen einer Arbeitsmappe mit VBA-Code ist bekanntlich
sehr einfach, weil man lediglich die Add-Methode der Workbooks-Auflistung
aufzurufen braucht. Add besitzt ein optionales Argument namens Template.
Wird dieses weggelassen, wird eine neue Arbeitsmappe mit so vielen Arbeitsblättern
erstellt, wie als Standard eingestellt ist. Die Default-Einstellung ist im Optionen-Dialog
von Excel auf der Registerseite "Allgemein" zu finden, oder kann mit der SheetsInNewWorkbook-Eigenschaft
gesetzt bzw. abgefragt werden.
Add ohne Template-Argument verwendet immer die Werksvorgaben für neue Mappen mit der eingestellten Anzahl Blätter. Eine allfällig vorhandene Muster-Vorlagemappe Mappe.xlt wird nicht berücksichtigt.
.VBA-Code #1
Sub AddNewWorkbook1()
Workbooks.Add
End Sub
.VBA-Code #2
Sub AddNewWorkbook2()
Dim wkbWorkbook As Workbook
Set wkbWorkbook = Workbooks.Add
'Irgendwelche VBA-Befehle...
Set wkbWorkbook = Nothing
End Sub
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
Arbeitsmappe basierend auf der Muster-Vorlagemappe (Mappe.xlt) anlegen
.Beschreibung
Eine neue Arbeitsmappe wird mit der Add-Methode von Workbooks
erstellt. Wenn man das Template-Argument von Add weglässt, verwendet
Microsoft Excel immer die Werksvorgaben für neue Arbeitsmappen. Zum Anlegen einer
Arbeitsmappe auf Basis der Vorlage Mappe.xlt muss man für Template den
Bezeichner "Arbeitsmappe" angeben. Dann wird die Muster-Vorlagemappe Mappe.xlt
berücksichtigt.
.VBA-Code #1
Sub AddNewWorkbook1()
Workbooks.Add "Arbeitsmappe"
End Sub
.VBA-Code #2
Sub AddNewWorkbook2()
Dim wkbWorkbook As Workbook
Set wkbWorkbook = Workbooks.Add "Arbeitsmappe"
'Irgendwelche VBA-Befehle...
Set wkbWorkbook = Nothing
End Sub
Verwandte Codebeispiele |
|
Weitere Informationen |
|
Arbeitsmappe mit einem Arbeitsblatt anlegen
.Beschreibung
Das Anlegen einer neuen Arbeitsmappe mit einem einzelnen neuen
Arbeitsblatt (genauer gesagt mit einem Tabellenblatt) wird wie gewohnt über die Add-Methode
vorgenommen, wobei der Template-Parameter mit xlWBATWorksheet, der Zahl
1 oder der Zahl -4167 angegeben wird (vergleiche Codebeispiel #1).
Wenn Sie den Template-Parameter weglassen, erhält die neue Arbeitsmappe so viele Arbeitsblätter, wie in der Eigenschaft SheetsInNewWorkbook des Application-Objektes definiert ist. Damit die anzulegende Arbeitsmappe genau ein Blatt besitzt, kann man somit die SheetsInNewWorkbook-Eigenschaft auf den Wert 1 setzen (vergleiche Codebeispiel #2).
Wenn die neue Arbeitsmappe ein einzelnes Blatt basierend auf der Vorlage für Tabellenblätter (Tabelle.xlt) enthalten soll, muss man für Template den Bezeichner "Tabelle" angeben. Dann wird die Muster-Vorlagetabelle Tabelle.xlt berücksichtigt (vergleiche Codebeispiel #3).
.VBA-Code #1
Sub AddNewWorkbookWithOneSheet1()
Workbooks.Add Template:=xlWBATWorksheet 'bzw. 1 oder
-4167
End Sub
.VBA-Code #2
Sub AddNewWorkbookWithOneSheet2()
Dim intSheets As Integer
intSheets = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 1
Workbooks.Add
Application.SheetsInNewWorkbook = intSheets
End Sub
.VBA-Code #3
Sub AddNewWorkbookWithOneSheet3()
Workbooks.Add "Tabelle"
End Sub
Weitere Informationen |
|
Arbeitsmappe mit mehreren Arbeitsblättern anlegen
.Beschreibung
Wenn man mit der Codezeile "Workbooks.Add" eine neue
Arbeitsmappe anlegt, so enthält die Mappe genau so viele Arbeitsblätter, wie in der
Excel-Option "Blätter in neuer Arbeitsmappe" eingestellt ist (Menübefehl Extras/Optionen,
Registerseite Allgemein des Optionen-Dialoges). Die Add-Methode besitzt
kein Argument, mit dem man die Anzahl Blätter spezifizieren kann. Im Excel-Objektmodell
entspricht die Eigenschaft SheetsInNewWorkbook des Application-Objektes
der Excel-Option "Blätter in neuer Arbeitsmappe". Soll eine Mappe mit einer
bestimmten Anzahl Arbeitsblätter erstellt werden, so muss vorgängig der entsprechende
Wert der SheetsInNewWorkbook-Eigenschaft zugewiesen werden. Da die Änderung
dieser Eigenschaft dauerhaft ist - der neue Wert wird bei Beenden von Microsoft Excel in
den Windows Registry-Eintrag DefSheets geschrieben - empfiehlt es sich, die
ursprüngliche Blattanzahl in einer Variable zwischenzuspeichern.
Übrigens akzeptiert SheetsInNewWorkbook nur Werte zwischen 1 und 255. Bei anderen Werten tritt der Laufzeitfehler 1004 auf.
Im Beispiel wird eine neue Arbeitsmappe mit fünf Arbeitsblättern erstellt.
.VBA-Code
Sub AddNewWorkbookWithMultipleSheets()
Dim intSheets As Integer
intSheets = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 5
Workbooks.Add
Application.SheetsInNewWorkbook = intSheets
End Sub
Weitere Informationen |
|
Herausfinden, welche Office-Programme installiert sind
.Beschreibung
Mit diesem VBA-Programmcode kann man herausfinden, welche
Office-Programme auf dem Computer installiert sind. Überprüft wird die Existenz der
Programme Word, Excel, PowerPoint und Access.
.Autor
Gijs de Jong (genauere Angaben nicht vorhanden)
Siehe auch Artikel:
http://216.26.168.92/tips/tip90.html
.VBA-Code
'Deklarationsbereich
Declare Function RegOpenKey Lib
"advapi32" Alias "RegOpenKeyA" (ByVal hKey _
As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegQueryValueEx Lib "advapi32" Alias
"RegQueryValueExA" _
(ByVal hKey As Long, ByVal lpValueName As String, lpReserved As Long,
_
lptype As Long, lpData As Any, lpcbData As Long) As Long
Declare Function RegCloseKey& Lib "advapi32" (ByVal hKey&)
Const REG_SZ = 1
Const REG_EXPAND_SZ = 2
Const ERROR_SUCCESS = 0
Const HKEY_CLASSES_ROOT = &H80000000
'Codemodul
Function GetRegString(hKey As Long, strSubKey As
String, strValueName As String) As String
Dim strSetting As String
Dim lngDataLen As Long
Dim lngRes As Long
If RegOpenKey(hKey, strSubKey, lngRes) = ERROR_SUCCESS Then
strSetting = Space(255)
lngDataLen = Len(strSetting)
If RegQueryValueEx(lngRes, strValueName, ByVal 0, REG_EXPAND_SZ, ByVal
strSetting, lngDataLen) = ERROR_SUCCESS Then
If lngDataLen > 1 Then
GetRegString = Left(strSetting, lngDataLen - 1)
End If
End If
If RegCloseKey(lngRes) <> ERROR_SUCCESS Then
MsgBox "RegCloseKey Failed: " & strSubKey
End If
End If
End Function
Function IsAppPresent(strSubKey$, strValueName$) As
Boolean
IsAppPresent = CBool(Len(GetRegString(HKEY_CLASSES_ROOT, strSubKey, strValueName)))
End Function
'*** Aufruf ***
Sub TestCall()
MsgBox "Access installiert: " &
IsAppPresent("Access.Database\CurVer", "")
MsgBox "Excel installiert: " &
IsAppPresent("Excel.Sheet\CurVer", "")
MsgBox "PowerPoint installiert: " &
IsAppPresent("PowerPoint.Slide\CurVer", "")
MsgBox "Word installiert: " &
IsAppPresent("Word.Document\CurVer", "")
End Sub
Starten eines anderen Office-Programmes
.Beschreibung
Muss aus Excel heraus ein anderes Office-Programm gestartet
werden, bedient man sich häufig der Shell-Funktion. Damit die Anwendung jedoch
gestartet werden kann, muss der Shell-Funktion der genaue Pfad der exe-Datei des
Programmes mitgegeben werden. Solange die zu startende Anwendung aus der gleichen
Office-Version wie Excel stammt, könnte man behelfsmässig den Programmpfad von Excel
verwenden (abfragen mit Application.Path) und annehmen, dass die exe-Datei der
anderen Anwendung im gleichen Verzeichnis wie die Datei Excel.exe steht. Sobald es sich um
eine Anwendung einer anderen Office-Version handelt, weicht der Programmpfad mit hoher
Wahrscheinlichkeit ab. Damit nicht in der Windows Registry nachgesehen werden muss, wie
der Pfad der gesuchten Anwendung heisst, stellt Excel eine spezielle Methode zum Starten
und/oder Aktivieren von anderen Office-Programmen zur Verfügung.
Konstanten für XlMSApplication
- xlMicrosoftAccess
- xlMicrosoftFoxPro
- xlMicrosoftMail
- xlMicrosoftPowerPoint
- xlMicrosoftProject
- xlMicrosoftSchedulePlus
- xlMicrosoftWord
.VBA-Code
Sub RunMicrosoftApplication()
Application.ActivateMicrosoftApp xlMicrosoftWord
End Sub
.Hinweis
Die ActivateMicrosoftApp-Methode existiert
ausschliesslich in Microsoft Excel. Die Objektmodelle der anderen Office-Programme wie
Microsoft Word und Microsoft PowerPoint kennen diese Methode nicht.
In Excel 97 und Excel 2000 ist die ActivateMicrosoftApp-Methode dokumentiert. Ob sie in Excel 2002 und Excel 2003 ebenfalls existiert, ist mir nicht bekannt (wobei sie aus Kompatibilitätsgründen sehr wahrscheinlich ebenfalls vorhanden sein wird).
Weitere Informationen |
|
Verwandte Codebeispiele |
|
Starten eines anderen Windows-Programmes
.Beschreibung
Gewöhnlich verwendet man zum Starten eines Programmes die Shell-Funktion
von VBA, weil dies die für diesen Zweck von VBA bereitgestellte Standard-Funktion ist.
Leider besitzt Shell drei Nachteile:
1. Das auszuführende Programm wird asynchron gestartet. Das bedeutet, dass die
nachfolgenden Codezeilen im VBA-Programm abgearbeitet werden, auch wenn das andere
Programm noch nicht vollständig gestartet wurde.
2. Es muss der vollständige Dateipfad der exe-Datei des auszuführenden Programmes
angegeben werden, sofern sich die Programmdatei nicht zufälligerweise in einem Suchpfad
(System-Umgebungsvariable "Path") oder dem gerade aktuellen Verzeichnis
befindet. Die in der Windows Registry eingetragenen Programmpfade (Schlüssel
"HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths") werden von Shell
nicht berücksichtigt.
3. Wenn man das WindowStyle-Argument nicht explizit angibt, wird das
Programm standardmässig mit minimiertem Anwendungsfenster gestartet.
.VBA-Code #1
Sub RunProgram1()
Application.ActivateMicrosoftApp xlMicrosoftWord
End Sub
Shell strToolEXE, vbNormalFocus
lngRC = ShellExecute(0&, "open", strToolEXE, vbNullString, vbNullString, vbNormalFocus)
CreateProcess
CreateObject("WScript.Shell").Run "MSPaint.exe"
Run startet das Programm synchron und standardmässig mit normaler Fenstergrösse.
ActiveWorkbook.FollowHyperlink "d:\winnt\system32\taskmgr.exe"
FollowHyperlink startet asynchron und mit normaler Fenstergrösse.
.Hinweis
Die ActivateMicrosoftApp-Methode existiert
ausschliesslich in Microsoft Excel. Die Objektmodelle der anderen Office-Programme wie
Microsoft Word und Microsoft PowerPoint kennen diese Methode nicht.
Verwandte Codebeispiele |
|
|
Starten und Aktivieren eines Office-Programmes mit Automation
.Beschreibung
Es gibt mehrere Lösungen zum Starten und Aktivieren eines
Office-Programmes mittels Automation. Nachfolgend werden zwei unterschiedliche Varianten
vorgestellt.
» Das Codebeispiel #1 startet Microsoft Word, wobei im VBA-Projekt der Verweis auf die Word-Bibliothek gesetzt sein muss (Microsoft Word x.0 Object Library, Datei "MSWordx.olb"). Durch die Deklaration von wdApp als "New Word.Application" wird ein neues Anwendungsobjekt instanziert. Die Anwendung selbst wird jedoch erst mit der Codezeile "wdApp.Visible = True" gestartet, da hier der erste Zugriff auf das Objekt stattfindet.
» Das zweite Beispiel startet Microsoft Excel, ohne dass im Projekt ein Verweis auf die Objektbibliothek von Microsoft Excel vorhanden sein muss. Dies, weil xlApp als "Object" deklariert ist. Gestartet wird die Excel-Anwendungsinstanz durch die CreateObject-Funktion. Durch Setzen von UserControl auf True wird die Kontrolle an den Benutzer übergeben.
.VBA-Code #1
Sub OpenWord()
Dim wdApp As New Word.Application
wdApp.Visible = True
AppActivate "Microsoft Word"
End Sub
.VBA-Code #2
Sub OpenExcel()
Dim xlApp As Object
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True
xlApp.UserControl = True
Set xlApp = Nothing
End Sub
Verwandte Codebeispiele |
|
.Beschreibung
Mit der Quit-Methode wird die aktuelle Excel-Sitzung
beendet.
Beachten Sie bitte, dass bei Quit alle geöffneten
Arbeitsmappen geschlossen werden, wobei
- für jede geänderte Mappe die Rückfragemeldung "Änderungen
speichern?" erscheint,
- die BeforeClose-, BeforeSave-, Deactivate- und WindowDeactivate-Ereignisse
ausgelöst werden und
- allfällig vorhandene Auto_Close-Makros ausgeführt werden.
Anstelle von Quit kann man auch die Tastenkombination Alt+F4 an das Excel-Anwendungsfenster senden.
.VBA-Code #1
Sub QuitExcel1()
Application.Quit
End Sub
.VBA-Code #2
Sub QuitExcel2()
SendKeys "%{F4}", True
End Sub
Weitere Informationen |
|
|
Excel beenden mit Schliessen aller Arbeitsmappen ohne Ausführung von Auto_Close-Makros
.Beschreibung
Wenn Sie Microsoft Excel mit der Quit-Methode
beenden, werden automatisch sämtliche Auto_Close-Makros aller aktuell
geöffneten Arbeitsmappen ausgeführt. Damit die Auto_Close-Makros ignoriert
werden, kann man vor dem Beenden von Excel zuerst alle Arbeitsmappen mit der Close-Methode
schliessen.
.VBA-Code
Sub QuitExcelWithoutAutoCloseMacros()
End Sub
Weitere Informationen |
|
|
|
Alle laufenden Excel-Instanzen ermitteln
.Beschreibung
Mit der Prozedur GetAllExcelInstances werden alle
momentan laufenden Excel-Instanzen ermittelt und deren Programm-Handles in einer
öffentlichen Datenfeldvariable namens hWndArray gespeichert.
.VBA-Code
'Deklarationsbereich
Declare Function FindWindow Lib "user32"
Alias "FindWindowA" (ByVal lpClassName _
As String, ByVal lpWindowName As String) As Long
Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal
hwnd _
As Long, ByVal wFlag As Long) As Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA"
(ByVal hwnd _
As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Const GW_HWNDNEXT = 2
Public hWndArray() As Long
'Codemodul
Sub GetAllExcelInstances()
Dim hwnd As Long, lRet As Long
Dim hWndArray() As Long
Dim i As Integer
Dim sClassBuffer As String
i = 0
hwnd = FindWindow("XLMAIN", vbNullString)
If hwnd <> 0 Then
ReDim hWndArray(i)
hWndArray(i) = hwnd
Do
hwnd = GetNextWindow(hwnd, GW_HWNDNEXT)
If hwnd = 0 Then Exit Sub
sClassBuffer = String(255, 0)
lRet = GetClassName(hwnd, sClassBuffer, Len(sClassBuffer))
sClassBuffer = Left(sClassBuffer, InStr(1, sClassBuffer,
Chr(0), vbTextCompare) - 1)
If UCase(sClassBuffer) = "XLMAIN" Then
i = i + 1
ReDim Preserve hWndArray(i)
hWndArray(i) = hwnd
End If
Loop
End If
End Sub
Verwandte Codebeispiele |
|
Dateigrösse von Bytes nach Kilobytes (KB), Megabytes (MB) oder Gigabytes (GB) umrechnen
.Beschreibung
Mit der hier vorgestellten Funktion FormatKB wird
eine in Bytes angegebene Dateigrösse nach Kilobytes (KB), Megabytes (MB) beziehungsweise
Gigabytes (GB) umgerechnet. Die API-Funktion StrFormatByteSize erledigt nicht nur
die Umrechnung sondern liefert auch gleich die für die Anzeige benötigte Masseinheit
Byte, KB, MB oder GB, wobei die API-Funktion selbständig entscheidet, welche Masseinheit
am ehesten geeignet ist. Wenn beispielsweise ein Bytes-Wert übergeben wird, dessen
Umrechnungsresultat (Byte nach KB) grösser oder genau 1'000 KB ist, wird das KB-Resultat
automatisch in MB umgerechnet. Ist dieses Resultat grösser als oder genau 1'000 MB, so
erfolgt die Umrechnung von MB nach GB. Der grösste umrechenbare Bytes-Wert ist
2'147'483'647, was genau 1.99 GB entspricht. Übrigens wird das von der Funktion
gelieferte Resultat automatisch formatiert, d.h. je nach Resultat auf keine, eine oder
zwei Dezimalstellen gerundet.
.Autor
» Codebeispiel #1: Sam Huggill, VB-Square, www.vb-square.com
» Codebeispiel #2: Karl E. Peterson, www.mvps.org/vb
.VBA-Code #1
'Deklarationsbereich
Declare Function StrFormatByteSize Lib
"shlwapi" Alias "StrFormatByteSizeA" _
(ByVal dw As Long, ByVal pszBuf As String, ByRef cchBuf As Long) As
String
'Codemodul
Function FormatKB(ByVal Amount As Long) As String
Dim Buffer As String
Dim Result As String
Buffer = Space$(255)
Result = StrFormatByteSize(Amount, Buffer, Len(Buffer))
If InStr(Result, vbNullChar) > 1 Then
FormatKB = Left$(Result, InStr(Result, vbNullChar) - 1)
End If
End Function
'*** Aufruf ***
Sub TestCall()
Dim strFileSize As String
strFileSize = FormatKB(FileLen("C:\Daten\MeineMappe.xls"))
MsgBox "Die Dateigrösse beträgt " & strFileSize
End Sub
.VBA-Code #2
Function FormatFileSize(ByVal Size As Long) As String
Dim sRet As String
Const KB& = 1024
Const MB& = KB * KB
If Size < KB Then
sRet = Format(Size, "#,##0") & " Bytes"
Else
Select Case Size \ KB
Case Is < 10
sRet = Format(Size / KB, "0.00")
& " KB"
Case Is < 100
sRet = Format(Size / KB, "0.0") &
" KB"
Case Is < 1000
sRet = Format(Size / KB, "0") &
" KB"
Case Is < 10000
sRet = Format(Size / MB, "0.00")
& " MB"
Case Is < 100000
sRet = Format(Size / MB, "0.0") &
" MB"
Case Is < 1000000
sRet = Format(Size / MB, "0") &
" MB"
Case Is < 10000000
sRet = Format(Size / MB / KB, "0.00")
& " GB"
End Select
sRet = sRet & " (" & Format(Size, "#,##0")
& " Bytes)"
End If
FormatFileSize = sRet
End Function
'*** Aufruf ***
Sub TestCall()
Dim strFileSize As String
strFileSize = FormatFileSize(FileLen("C:\Daten\MeineMappe.xls"))
MsgBox "Dateigrösse: " & strFileSize
End Sub
Weitere Informationen |
|
Öffnen des VBA-Editor-Fensters verhindern
.Beschreibung
Es existiert in Microsoft Excel keine direkte Möglichkeit,
den VBA-Editor auszublenden oder zu sperren. Mittels API-Aufruf kann man jedoch das
Hauptfenster des VBA-Editors blockieren. Im nachstehenden Beispiel wird das
VBA-Editor-Fenster beim Öffnen einer Arbeitsmappe gesperrt und beim Schliessen der Mappe
wieder entsperrt.
.VBA-Code
'Deklarationsbereich
Declare Function LockWindowUpdate Lib
"user32" (ByVal hwndLock As Long) As Long
'Codemodul "Diese
Arbeitsmappe"
Private Sub Workbook_Open()
LockWindowUpdate Application.VBE.MainWindow.HWnd
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
LockWindowUpdate 0&
End Sub
Verwandte Codebeispiele |
|
Hauptfenster des VBA-Editors öffnen
.Beschreibung
Der VBA-Editor kann programmgesteuert geöffnet werden, indem
schlicht die Visible-Eigenschaft von MainWindow auf True
gesetzt wird. Die zweite Codezeile im nachstehenden Beispiel bewirkt, dass das
VBA-Editor-Fenster den Fokus erhält.
Sub ShowVBEWindow()
ThisWorkbook.VBProject.VBE.MainWindow.Visible = True
ThisWorkbook.VBProject.VBE.MainWindow.SetFocus
End Sub
Verwandte Codebeispiele |
|
Hauptfenster des VBA-Editors schliessen
.Beschreibung
Das Hauptfenster des VBA-Editors von Microsoft Excel wird
geschlossen, indem man die Visible-Eigenschaft von MainWindow auf False
setzt. Dies kann man entweder über das Application- oder das VBProject-Objekt
einer geöffneten Arbeitsmappe vornehmen.
» Codebeispiel #3: Microsoft Word kennt eine Eigenschaft namens ShowVisualBasicEditor, mit der man die Sichtbarkeit der VBE festlegen kann.
.VBA-Code #1
Sub CloseVBEWindow1()
ThisWorkbook.VBProject.VBE.MainWindow.Visible = False
End Sub
.VBA-Code #2
Sub CloseVBEWindow2()
Application.VBE.MainWindow.Visible = False
End Sub
.VBA-Code #3
Sub CloseVBEWindow3()
Application.ShowVisualBasicEditor = False
End Sub
Verwandte Codebeispiele |
|
Prüfen, ob das VBA-Projekt einer Arbeitsmappe geschützt ist
.Beschreibung
Das Vorhandensein des Kennwortschutzes eines VBA-Programmes
kann sehr einfach geprüft werden.
TODO: Diese Funktion konnte noch nicht abschliessend getestet werden! -> Protection Property nicht sinnvoller?
.VBA-Code
Function Projekt_geschützt(ByVal WB As Workbook) As
Boolean
Dim Anzahl As Integer
On Error Resume Next
Anzahl = WB.VBProject.VBComponents.Count
Projekt_geschützt = Err.Number <> 0
End Function
'*** Aufruf ***
Sub TestCall()
Dim WB As Workbook
Set WB = Workbooks("MeineMappe.xls")
MsgBox "Projekt geschützt: " & Projekt_geschützt(WB)
Set WB = Nothing
End Sub
Verwandte Codebeispiele |
|
.Beschreibung
Das Speichern einer Arbeitsmappe ist alles andere als
schwierig. Man muss dazu lediglich die Save-Methode des Workbook-Objektes
aufrufen.
» Das Codebeispiel #1 zeigt, wie die aktive Arbeitsmappe gespeichert wird.
» Codebeispiel #2 speichert die codeausführende Arbeitsmappe.
.VBA-Code #1
Sub SaveWorkbook()
ActiveWorkbook.Save
End Sub
.VBA-Code #2
Sub SaveWorkbook()
ThisWorkbook.Save
End Sub
.Beschreibung
Mit der Close-Methode wird eine Arbeitsmappe
geschlossen. Wenn die zu schliessende Mappe nicht-gespeicherte Änderungen enthält, wird
dem Benutzer die Rückfrage "Sollen Ihre Änderungen in <Datei>
gespeichert werden?" angezeigt.
» Codebeispiel #1: Schliesst die aktive Arbeitsmappe.
» Codebeispiel #2: Schliesst die angegebene Arbeitsmappe.
» Codebeispiel #3: Schliesst die Arbeitsmappe mit der Indexnummer 2.
» Codebeispiel #4: Schliesst die codeausführende Arbeitsmappe.
» Codebeispiel #5: Schliesst die aktive Arbeitsmappe, sofern diese nur in einem einzigen Fenster geöffnet war (was gewöhnlich der Fall ist). Anderenfalls wird das gerade aktive Arbeitsmappenfenster geschlossen und ein anderes Fenster dieser Mappe aktiviert. Die Mappe selbst wird jedoch nicht geschlossen.
» Codebeispiel #6: Schliesst das Fenster der angegebenen Arbeitsmappe.
» Codebeispiel #7: Schliesst das Fenster der aktiven Arbeitsmappe.
.VBA-Code #1
Sub CloseWorkbook1()
ActiveWorkbook.Close
End Sub
.VBA-Code #2
Sub CloseWorkbook2()
Application.Workbooks("MeineMappe.xls").Close
End Sub
.VBA-Code #3
Sub CloseWorkbook3()
Application.Workbooks(2).Close
End Sub
.VBA-Code #4
Sub CloseWorkbook4()
ThisWorkbook.Close
End Sub
.VBA-Code #5
Sub CloseWorkbook5()
ActiveWorkbook.Windows(1).Close
End Sub
.VBA-Code #6
Sub CloseWorkbook6()
Application.Workbooks("MeineMappe.xls").Windows(1).Close
End Sub
.VBA-Code #7
Sub CloseWorkbook7()
Application.Windows(1).Close
End Sub
.Hinweis
Wird versucht, eine Arbeitsmappe zu schliessen, auf die im
VBA-Projekt einer anderen Arbeitsmappe verwiesen wird, erscheint die Fehlermeldung
"Diese Arbeitsmappe wird momentan von einer anderen Arbeitsmappe verwendet und kann
nicht geschlossen werden." und die Arbeitsmappe wird nicht geschlossen. Man kann
diese Fehlermeldung nicht abfangen, da es sich um eine Excel-Fehlermeldung handelt und
nicht um einen VBA-Laufzeitfehler. Dieses Problem lässt nur lösen, indem zuerst die
andere Arbeitsmappe geschlossen oder der Verweis im VBA-Projekt der anderen Mappe entfernt
wird.
Beachten Sie, dass bei Schliessen einer Mappe mittels Close
folgende Ereignisse der Arbeitsmappe in dieser Reihenfolge ausgelöst werden:
1. BeforeClose
2. (BeforeSave)
3. WindowDeactivate
4. Deactivate
Bitte beachten Sie auch, dass ein allfällig vorhandenes Auto_Close-Makro nicht ausgeführt wird, wenn man die Arbeitsmappe mit VBA-Programmcode schliesst.
Weitere Informationen |
|
.Beschreibung
...
.VBA-Code
Sub CloseAllWorkbooks()
Workbooks.Close
End Sub
Alle Arbeitsmappen ausser der aktiven Arbeitsmappe schliessen
.Beschreibung
Dieses Beispiel zeigt, wie man alle geöffneten Arbeitsmappen
ausser der gerade aktiven Mappe schliessen kann.
.VBA-Code
Sub CloseWorkbooksExceptThisWorkbook()
Dim wkbBook As Workbook
For Each wkbBook In Workbooks
If wkbBook.Name <> ThisWorkbook.Name Then
wkbBook.Close
End If
Next wkbBook
End Sub
Alle Arbeitsmappen schliessen ohne speichern und "Änderungen speichern?"-Aufforderung
.Beschreibung
Die Rückfrage "Sollen Ihre Änderungen in <Datei>
gespeichert werden?" lässt sich am einfachsten unterdrücken, indem man die DisplayAlerts-Eigenschaft
auf False setzt. Wenn man anschliessend die Close-Methode von Workbooks
ausführt, werden die Arbeitsmappen geschlossen und alle nicht gespeicherten Änderungen
verworfen.
Interessant ist, dass die persönliche Makro-Arbeitsmappe "Personl.xls" nicht geschlossen wird.
.VBA-Code
Sub CloseWorkbooksWithoutSaving()
Application.DisplayAlerts = False
Workbooks.Close
Application.DisplayAlerts = True
End Sub
Alle Arbeitsmappen schliessen mit automatischem Speichern
.Beschreibung
Es gibt eine einfache Möglichkeit, wie man alle geöffneten
Arbeitsmappen schliessen kann, wobei diese automatisch gespeichert werden.
.VBA-Code
Sub CloseWorkbooksWithSaving()
End Sub
Arbeitsmappe schliessen ohne "Änderungen speichern?"-Aufforderung
.Beschreibung
Die Rückfrage "Sollen Ihre Änderungen in <Datei>
gespeichert werden?" erscheint immer, wenn eine Arbeitsmappe geschlossen wird, welche
nicht-gespeicherte Änderungen enthält.
Das Unterdrücken dieser Meldung kann auf verschiedene Arten erreicht werden. Einerseits kommt es darauf an, ob der Programmcode in der betroffenen oder in einer anderen geöffneten Mappe stehen soll. Andererseits muss man sich entscheiden, ob die zu Arbeitsmappe automatisch ohne oder mit Speicherung geschlossen werden soll.
Hier werden vier Lösungsvarianten vorgestellt, die zum Unterdrücken der Rückfrage beim Schliessen einer Arbeitsmappe dienen.
.Autor
Microsoft Support
Siehe auch MS KB-Artikel:
XL97/XL2000/XL2002: How to Suppress
"Save Changes?" Prompt When You Close a Workbook
http://support.microsoft.com/?kbid=213428
.VBA-Code #1
'Codemodul
Sub Auto_Close()
ThisWorkbook.Saved = True
End Sub
.VBA-Code #2
'Diese Arbeitsmappe
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Saved = True
End Sub
.VBA-Code #3
'Codemodul
Sub CloseBook1()
Application.DisplayAlerts = False
ActiveWorkbook.Close
Application.DisplayAlerts = True
End Sub
.VBA-Code #4
'Codemodul
Sub CloseBook2()
ActiveWorkbook.Close SaveChanges:=False
End Sub
.Hinweis
Im Codebeispiel #3 werden nach der Anweisung
"ActiveWorkbook.Close" die Warnmeldungen wieder aktiviert. Wenn sich der
Programmcode in der aktiven Mappe befindet, wird die letzte Codezeile
"Application.DisplayAlerts = True" nicht ausgeführt, da nach Schliessen der
aktiven Mappe die Programmcode-Abarbeitung gestoppt ist. Aus dieser Sicht ist die
Codezeile somit eigentlich überflüssig. Wenn sich der Programmcode jedoch in einer
anderen Mappe (welche nicht die aktive Mappe ist) oder einem Add-In befindet, so läuft
das Programm nach der Zeile "ActiveWorkbook.Close" weiter, da die aktive Mappe
geschlossen wurde und nicht die Code-enthaltende Mappe (ThisWorkbook).
Arbeitsmappe schliessen mit automatischem Speichern
.Beschreibung
Diese Codebeispiele zeigen, wie eine Arbeitsmappe beim
Schliessen automatisch gespeichert wird, d.h. ohne dass die Rückfrage "Sollen Ihre
Änderungen in <Datei> gespeichert werden?" erscheint.
Wenn die Arbeitsmappe keine Änderungen enthält, wird bei Ausführen der Close-Methode die Mappe immer ohne zu Speichern geschlossen. Also auch dann, wenn der SaveChanges-Parameter explizit auf True gesetzt wird. Dieser Parameter wird nur berücksichtigt, wenn die Arbeitsmappe Änderungen besitzt, die noch nicht gespeichert wurden. Dies kann man anhand der Saved-Eigenschaft herausfinden.
Siehe auch MS KB-Artikel:
XL97/XL2000/XL2002: How to Suppress
"Save Changes?" Prompt When You Close a Workbook
http://support.microsoft.com/?kbid=213428
.VBA-Code #1
'Diese Arbeitsmappe
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If ThisWorkbook.Saved = False Then
ThisWorkbook.Save
End If
End Sub
.VBA-Code #2
Sub Auto_Close()
If ThisWorkbook.Saved = False Then
ThisWorkbook.Save
End If
End Sub
.VBA-Code #3
Sub CloseWorkbook1()
If ActiveWorkbook.Saved = False Then
ActiveWorkbook.Save
End If
ActiveWorkbook.Close
End Sub
.VBA-Code #4
Sub CloseWorkbook2()
ActiveWorkbook.Saved = False
ActiveWorkbook.Close SaveChanges:=True
End Sub
Verwandte Codebeispiele |
|
|
|
Arbeitsmappe schliessen mit automatischem Speichern unter einem anderen Dateinamen
.Beschreibung
Dieses Codebeispiel erledigt folgendes:
- Die Arbeitsmappe wird geschlossen, wobei sie automatisch unter einem anderen Dateinamen gespeichert wird.
- Die Rückfrage "Sollen Ihre Änderungen in <Datei> gespeichert werden?" wird unterdrückt.
.VBA-Code #1
'Diese Arbeitsmappe
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.SaveAs "C:\Daten\AndereMappe.xls"
End Sub
.VBA-Code #2
Sub Auto_Close()
ThisWorkbook.SaveAs "C:\Daten\AndereMappe.xls"
End Sub
.VBA-Code #3
Sub CloseWorkbook1()
ActiveWorkbook.SaveAs "C:\Daten\AndereMappe.xls"
ActiveWorkbook.Close
End Sub
.VBA-Code #4
Sub CloseWorkbook2()
ActiveWorkbook.Saved = False
ActiveWorkbook.Close SaveChanges:=True,
Filename:="C:\Daten\AndereMappe.xls"
End Sub
Verwandte Codebeispiele |
|
|
|
Arbeitsmappe schliessen mit automatischem Erstellen einer Sicherungskopie
.Beschreibung
Die nachfolgenden Codebeispiele erledigen folgendes:
- Die Arbeitsmappe wird geschlossen.
- Wenn die Arbeitsmappe keine aktuellen Änderungen enthält, wird sie ohne Speichern geschlossen.
- Wenn die Arbeitsmappe nicht-gespeicherte Änderungen enthält, wird die Rückfrage "Sollen Ihre Änderungen in <Datei> gespeichert werden?" angezeigt.
- Wird die Rückfrage mit 'Ja' beantwortet, wird die Arbeitsmappe gespeichert und automatisch eine Sicherungskopie der Mappe erstellt.
- Wird die Rückfrage mit 'Nein' beantwortet, wird die Arbeitsmappe geschlossen, wodurch die Änderungen verworfen werden. Es wird keine Sicherungskopie erstellt.
.VBA-Code #1
'Diese Arbeitsmappe
Private Sub Workbook_BeforeClose(Cancel As Boolean)
End Sub
.VBA-Code #2
Sub Auto_Close()
End Sub
.VBA-Code #3
Sub CloseWorkbook1()
End Sub
.VBA-Code #4
Sub CloseWorkbook2()
End Sub
Verwandte Codebeispiele |
|
|
|
Excel beenden mit Schliessen aller Arbeitsmappen ohne "Änderungen speichern"-Aufforderung
.Beschreibung
Es gibt mehrere Möglichkeiten, wie alle geöffneten Mappen
geschlossen und Excel beendet werden können, ohne dass bei jeder Arbeitsmappe die
Rückfrage "Änderungen speichern" erscheint. Hier die wohl kürzeste
VBA-Lösung.
.VBA-Code
Sub ExitExcel()
Application.DisplayAlerts = False
Application.Quit
End Sub
.Hinweis
Beachten Sie, dass mit Application.Quit die in
den Arbeitsmappen vorhandenen Auto_Close-Makros ausgeführt werden. Wenn diese
Makros ignoriert werden sollen, muss mit der Close-Methode gearbeitet und jede
Mappe einzeln geschlossen werden (beispielsweise die Anweisung Workbooks(1).Close
schliesst die erste Arbeitsmappe ohne die Ausführung des in der Mappe vorhandenen Auto_Close-Makros).
Verwandte Codebeispiele |
|
|
|
Weitere Informationen |
|
Speichern eines Arbeitsblattes als Bilddatei im GIF- oder JPEG-Format
.Beschreibung
Mit der Beispiel-Prozedur ExportWorksheetAsPicture
wird der Inhalt des aktiven Tabellenblattes als GIF-Bilddatei im Ordner
"C:\Daten" gespeichert.
.Autor
Hans W. Herber, www.herber.de
(Anpassungen durch Philipp von Wartburg)
.VBA-Code
Sub ExportWorksheetAsPicture()
Dim chtPicture As Chart
Dim strSheetName As String
Application.ScreenUpdating = False
strSheetName = ActiveSheet.Name
ActiveSheet.Range(ActiveSheet.UsedRange.Address).CopyPicture Appearance:=xlScreen,
Format:=xlPicture
Set chtPicture = Charts.Add
chtPicture.Paste
chtPicture.Export "C:\Daten\" & strSheetName & ".gif"
Application.DisplayAlerts = False
chtPicture.Delete
Application.DisplayAlerts = True
Set chtPicture = Nothing
Application.ScreenUpdating = True
End Sub
Weitere Informationen |
|
Dateien eines Ordners mit allen Datei-Attributen auflisten
.Beschreibung
Mit der hier vorgestellten Komplettlösung wird eine Liste
aller Arbeitsmappendateien (xls-Dateityp) eines einzelnen Ordners erstellt. Zu jeder Datei
werden die Dateiattribute angegeben.
Damit das VBA-Programm ausgeführt werden kann, muss im VBA-Projekt ein Verweis auf die Bibliothek "Microsoft Scripting Runtime" (scrrun.dll) gesetzt werden.
.VBA-Code
Sub GetFileProperties()
Dim objFSO As FileSystemObject
Dim objOrdner As Scripting.Folder
Dim objDatei As Scripting.File
Dim varVerzeichnis As Variant
Dim intCounter As Integer
Dim intSheets As Integer
varVerzeichnis = Application.InputBox(Prompt:="Bitte geben Sie einen Pfadnamen
ein:", _
Title:="Verzeichnis bestimmen",
Default:=ThisWorkbook.Path, Type:=2)
If VarType(varVerzeichnis) = vbBoolean Or Trim$(varVerzeichnis) = "" Then
Exit Sub
End If
Set objFSO = New FileSystemObject
On Error Resume Next
Set objOrdner = objFSO.GetFolder(varVerzeichnis)
If Err.Number = 76 Then
MsgBox "Der eingegebene Pfadname '" & varVerzeichnis
& "' existiert nicht!" & _
vbCrLf & vbCrLf & "Dateiliste kann
nicht erstellt werden.", vbExclamation
Set objFSO = Nothing
Exit Sub
End If
On Error GoTo 0
intCounter = 9
Application.ScreenUpdating = False
Application.StatusBar = "Existierende Dateiliste wird geprüft..."
For intSheets = 1 To ActiveWorkbook.Worksheets.Count
If ActiveWorkbook.Worksheets(intSheets).Name = "Dateiliste"
Then
Application.DisplayAlerts = False
ActiveWorkbook.Worksheets("Dateiliste").Delete
Application.DisplayAlerts = True
Exit For
End If
Next intSheets
Application.StatusBar = "Dateiliste wird erstellt..."
ActiveWorkbook.Worksheets.Add
ActiveSheet.Name = "Dateiliste"
ActiveSheet.Cells(1, 1) = "Liste der xls-Dateien"
ActiveSheet.Cells(1, 1).Font.Bold = True
ActiveSheet.Cells(1, 1).Font.Size = 12
ActiveSheet.Cells(3, 1) = "Verzeichnis:"
ActiveSheet.Cells(3, 2) = ""
ActiveSheet.Cells(4, 1) = "Anzahl xls-Dateien:"
ActiveSheet.Cells(4, 2) = ""
ActiveSheet.Cells(5, 1) = "Grösse xls-Dateien:"
ActiveSheet.Cells(5, 2) = ""
ActiveSheet.Cells(5, 3) = "Bytes"
ActiveSheet.Cells(6, 1) = "Anzahl aller Dateien:"
ActiveSheet.Cells(6, 2) = objOrdner.Files.Count
ActiveSheet.Cells(7, 1) = "Grösse aller Dateien:"
ActiveSheet.Cells(7, 2) = objOrdner.Size
ActiveSheet.Cells(7, 3) = "Bytes"
ActiveSheet.Cells(intCounter, 1) = "Datei"
ActiveSheet.Cells(intCounter, 2) = "Grösse"
ActiveSheet.Cells(intCounter, 3) = "Pfad"
ActiveSheet.Cells(intCounter, 4) = "Erstellt am"
ActiveSheet.Cells(intCounter, 5) = "Geöffnet am"
ActiveSheet.Cells(intCounter, 6) = "Geändert am"
ActiveSheet.Cells(intCounter, 7) = "Dateityp"
ActiveSheet.Cells(intCounter, 8) = "Dateiname kurz"
ActiveSheet.Cells(intCounter, 9) = "Pfadname kurz"
ActiveSheet.Cells(intCounter, 10) = "Attribute"
With ActiveSheet.Range("A9:J9")
.Font.Bold = True
.Interior.ColorIndex = 15
.Interior.Pattern = xlSolid
.Interior.PatternColorIndex = xlAutomatic
End With
For Each objDatei In objOrdner.Files
If objFSO.GetExtensionName(objDatei.Path) = "xls" Then
intCounter = intCounter + 1
ActiveSheet.Cells(intCounter, 1) = objDatei.Name
ActiveSheet.Cells(intCounter, 2) = objDatei.Size
ActiveSheet.Cells(intCounter, 3) = objDatei.Path
ActiveSheet.Cells(intCounter, 4) = objDatei.DateCreated
ActiveSheet.Cells(intCounter, 5) =
objDatei.DateLastAccessed
ActiveSheet.Cells(intCounter, 6) =
objDatei.DateLastModified
ActiveSheet.Cells(intCounter, 7) = objDatei.Type
ActiveSheet.Cells(intCounter, 8) = objDatei.ShortName
ActiveSheet.Cells(intCounter, 9) = objDatei.ShortPath
ActiveSheet.Cells(intCounter, 10) =
GetFileAttributes(objDatei.Attributes)
End If
Next
ActiveSheet.Cells(4, 2) = intCounter - 9
ActiveSheet.Cells(5, 2) =
Application.WorksheetFunction.Sum(ActiveSheet.Range("B10:B" & intCounter))
ActiveSheet.Range("B10:B" & intCounter).NumberFormat =
"#,##0"
ActiveSheet.Range("B4:B7").NumberFormat = "#,##0"
ActiveSheet.Columns("A:J").AutoFit
ActiveSheet.Cells(3, 2) = objOrdner.Path
Application.ScreenUpdating = True
Application.StatusBar = "Dateiliste wurde erstellt."
MsgBox "Die Dateiliste von Ordner '" & varVerzeichnis & "'
wurde erstellt."
Application.StatusBar = False
Set objOrdner = Nothing
Set objFSO = Nothing
End Sub
Function GetFileAttributes(intAttributes) As String
Dim strAttributesNames As String
strAttributesNames = ""
If intAttributes >= 2048 Then
strAttributesNames = "Komprimiert"
intAttributes = intAttributes - 2048
End If
If intAttributes >= 32 Then
If strAttributesNames = "" Then
strAttributesNames = "Archiv"
Else
strAttributesNames = strAttributesNames & ",
Archiv"
End If
intAttributes = intAttributes - 32
End If
If intAttributes = 7 Then
strAttributesNames = strAttributesNames & ",
Schreibgeschützt, Verborgen, System"
ElseIf intAttributes = 6 Then
strAttributesNames = strAttributesNames & ", Verborgen,
System"
ElseIf intAttributes = 5 Then
strAttributesNames = strAttributesNames & ",
Schreibgeschützt, System"
ElseIf intAttributes = 4 Then
strAttributesNames = strAttributesNames & ", System"
ElseIf intAttributes = 3 Then
strAttributesNames = strAttributesNames & ",
Schreibgeschützt, Verborgen"
ElseIf intAttributes = 2 Then
strAttributesNames = strAttributesNames & ", Verborgen"
ElseIf intAttributes = 1 Then
strAttributesNames = strAttributesNames & ",
Schreibgeschützt"
ElseIf intAttributes = 0 Then
If strAttributesNames = "" Then
strAttributesNames = "(Normal)"
End If
End If
GetFileAttributes = strAttributesNames
End Function
Verwandte Codebeispiele |
|
Weitere Informationen |
|
Attribute der Dateien eines Ordners zurücksetzen
.Beschreibung
Mit der folgenden Prozedur werden die Datei-Attribute aller
Dateien eines Ordner auf 'Normal' zurückgesetzt.
Als exemplarisches Beispiel werden nur die Arbeitsmappen (xls-Dateien) des Ordners berücksichtigt, welcher als Argument (strPath) der Prozedur übergeben wurde. Die Prüfung auf Laufzeitfehler ist notwendig, da eine Datei gesperrt sein könnte (wenn sie gerade bearbeitet wird). Der Aufruf der SetAttr-Anweisung führt in diesem Fall zum Laufzeitfehler 75 "Zugriff auf Datei verweigert".
.VBA-Code
Sub ResetFilesAttributes(strPath As String)
Dim intCounter As Integer
Dim astrFiles() As String
Dim strFile As String
If Right$(strPath, 1) <> "\" Then strPath = strPath &
"\"
strFile = Dir(strPath & "*.xls")
Do While strFile <> ""
intCounter = intCounter + 1
ReDim Preserve astrFiles(1 To intCounter)
astrFiles(intCounter) = strFile
strFile = Dir()
Loop
On Error Resume Next
For intCounter = 1 To UBound(astrFiles)
SetAttr strPath & astrFiles(intCounter), vbNormal
If Err.Number = 75 Then
MsgBox "Zugriff auf Datei " & strPath &
astrFiles(intCounter) & " verweigert!"
Err.Clear
End If
Next intCounter
End Sub
'*** Aufruf ***
Sub TestCall()
Call ResetFilesAttributes("C:\Daten")
End Sub
Verwandte Codebeispiele |
|
Weitere Informationen |
|
Dokument-Eigenschaften der Dateien eines Ordners auflisten
.Beschreibung
Mit dieser VBA-Prozedur wird eine Liste aller Dateien eines
Ordners erstellt, wobei zu jeder Datei die wichtigsten Dokument-Eigenschaften aufgeführt
werden. Die Eigenschaften sind:
- Autor
- Manager
- Firma
- Titel
- Thema
- Kategorie
- Stichwörter
- Kommentar
Diese Eigenschaften werden nur dann angegeben, wenn es sich bei einer Datei um ein Dokument handelt, weil nur Dokument-Dateien diese Eigenschaften besitzen.
Die Liste wird auf einem neuen Arbeitsblatt der aktiven Arbeitsmappe erstellt.
.VBA-Code
Sub ListFilesWithDocumentProperties()
Dim objDSOReader As Object
Dim objDSODocument As Object
Dim wksSheet As Worksheet
Dim intFile As Integer
Dim astrFiles() As String
Dim strFile As String
Dim strPath As String
strPath = "C:\Daten"
If Right$(strPath, 1) = "\" Then
strPath = Left$(strPath, Len(strPath) - 1)
End If
strFile = Dir(strPath & "\*.*")
Do While strFile <> ""
intFile = intFile + 1
ReDim Preserve astrFiles(1 To intFile)
astrFiles(intFile) = strFile
strFile = Dir()
Loop
If intFile > 0 Then
Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
Set wksSheet = ActiveWorkbook.Worksheets.Add
wksSheet.Range("A1:I1").Value = Array("Datei",
"Autor", "Manager", "Firma", "Titel",
"Thema", "Kategorie", "Stichwörter", "Kommentar")
wksSheet.Range("A1:I1").Font.Bold = True
On Error Resume Next
For intFile = 1 To UBound(astrFiles)
Set objDSODocument =
objDSOReader.GetDocumentProperties(strPath & "\" & astrFiles(intFile))
If Err.Number <> 0 Then
Err.Clear
With wksSheet
.Cells(intFile + 1, 1).Value =
astrFiles(intFile)
.Cells(intFile + 1, 2).Value =
"(Fehler aufgetreten)"
End With
Else
With wksSheet
.Cells(intFile + 1, 1).Value =
astrFiles(intFile)
.Cells(intFile + 1, 2).Value =
objDSODocument.Author
.Cells(intFile + 1, 3).Value =
objDSODocument.Manager
.Cells(intFile + 1, 4).Value =
objDSODocument.Company
.Cells(intFile + 1, 5).Value =
objDSODocument.Title
.Cells(intFile + 1, 6).Value =
objDSODocument.Subject
.Cells(intFile + 1, 7).Value =
objDSODocument.Category
.Cells(intFile + 1, 8).Value =
objDSODocument.Keywords
.Cells(intFile + 1, 9).Value =
objDSODocument.Comments
End With
End If
Set objDSODocument = Nothing
Next intFile
wksSheet.Range("A1:I1").Columns.EntireColumn.AutoFit
Set wksSheet = Nothing
Set objDSOReader = Nothing
Else
MsgBox "Keine Dateien gefunden."
End If
End Sub
Verwandte Codebeispiele |
|
Weitere Informationen |
|
Arbeitsblatt als neue Arbeitsmappe speichern
.Beschreibung
Am einfachsten wird ein einzelnes Arbeitsblatt als neue
Arbeitsmappe gespeichert, indem das Blatt zuerst kopiert (wodurch automatisch eine neue
Mappe angelegt wird) und anschliessend wie gewohnt gespeichert wird. Im Beispiel wird das
aktive Arbeitsblatt verwendet.
.VBA-Code
Sub SaveActiveSheet()
ActiveSheet.Copy
ActiveWorkbook.SaveAs "C:\Daten\EinzelnesBlatt.xls"
End Sub
.Hinweis
Beachten Sie unbedingt, dass durch das Kopieren des
Arbeitsblattes alle Zelltexte, die mehr als 255 Zeichen lang sind, automatisch auf 255
Zeichen gekürzt werden.
Verwandte Codebeispiele |
|
Weitere Informationen |
|
Selektierte Arbeitsblätter als neue Arbeitsmappe speichern
.Beschreibung
Eine lediglich zwei Codezeilen umfassende VBA-Prozedur genügt
zum Speichern der selektierten Arbeitsblätter als neue Arbeitsmappendatei. In der
Prozedur werden zuerst die selektierten Blätter in eine neue, automatisch erstellte Mappe
kopiert, indem auf die SelectedSheets-Eigenschaft des Window-Objektes
zugegriffen und danach die Mappe gespeichert wird.
.VBA-Code
Sub SaveSelectedSheets()
ActiveWorkbook.Windows(1).SelectedSheets.Copy
ActiveWorkbook.SaveAs "C:\Daten\SelektierteBlätter.xls"
End Sub
.Hinweis
Beachten Sie unbedingt, dass durch das Kopieren eines
Arbeitsblattes alle Zelltexte, die mehr als 255 Zeichen lang sind, automatisch auf 255
Zeichen gekürzt werden.
Weitere Informationen |
|
|
Speichern eines Arbeitsblattes ohne eingebettete Objekte, Formeln und VBA-Programmcode
.Beschreibung
Dieses Makro speichert das aktive Arbeitsblatt als neue
Arbeitsmappe (xls-Datei), wobei vorher alle eingebetteten Objekte (OLE Objekte) entfernt,
alle Formelzellen in Werte umgewandelt und der dem Arbeitsblatt hinterlegte
VBA-Programmcode gelöscht werden.
.Autor
Hans W. Herber, www.herber.de
(Anpassungen durch Philipp von Wartburg)
.VBA-Code
Sub SaveActiveSheetDataOnly()
Dim wkbWorkbook As Workbook
ActiveSheet.Copy
Set wkbWorkbook = ActiveWorkbook
'Delete all OLE Objects
ActiveSheet.OLEObjects.Delete
'Convert all Formulas to their Values
ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value
'Delete VBA Code behind the active Sheet
With wkbWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
.DeleteLines 1, .CountOfLines
End With
ActiveWorkbook.SaveAs Application.DefaultFilePath & "\DataOnly.xls"
End Sub
.Hinweis
Beachten Sie unbedingt, dass beim Kopieren des
Arbeitsblattes alle Zelltexte, welche länger als 255 Zeichen sind, automatisch auf 255
Zeichen gekürzt werden. Eine Meldung wird dabei nicht angezeigt.
Speichern einer Arbeitsmappe ohne Ausführung von VBA-Code im BeforeSave-Ereignis
.Beschreibung
Gelegentlich kommt es vor, dass man Programmcode in das BeforeSave-Ereignis
der Arbeitsmappe eingefügt hat, aber nicht möchte, dass dieser Code bei jeder
Speicherung der Mappe ausgeführt wird. Dieses Beispiel zeigt, wie das BeforeSave-Ereignis
deaktiviert werden kann.
.VBA-Code #1
Sub SaveBookWithoutBeforeSaveEvent1()
Application.EnableEvents = False
ActiveWorkbook.Save
Application.EnableEvents = True
End Sub
.VBA-Code #2
Sub SaveBookWithoutBeforeSaveEvent2()
Application.EnableEvents = False
Workbooks("EineMappe.xls").Save
Application.EnableEvents = True
End Sub
.Hinweis
Beachten Sie bitte, dass nach dem Speichern die
Ereignisse wieder aktiviert werden sollten.
Neue Arbeitsmappe anlegen und automatisch Open-Ereignisprozedur einfügen
.Beschreibung
Das folgende Beispiel zeigt, wie man eine neue Arbeitsmappe
erstellen kann, in die automatisch VBA-Programmcode in die Ereignisprozedur Workbook_Open
eingefügt wird.
.Autor
Hans W. Herber, www.herber.de
(Anpassungen durch Philipp von Wartburg)
.VBA-Code
Sub OpenProzedurAnlegen()
Dim wbkWorkbook As Workbook
Dim objModule As Object
Set wbkWorkbook = Workbooks.Add
Set objModule = wbkWorkbook.VBProject.VBComponents("DieseArbeitsmappe")
With objModule.CodeModule
.InsertLines 3, "Private Sub Workbook_Open()"
.InsertLines 4, " MsgBox ""Ich befinde mich in
Workbook_Open"""
.InsertLines 5, "End Sub"
End With
Set objModule = Nothing
Set wbkWorkbook = Nothing
End Sub
Kurzer Dateiname zu einem langen Dateinamen ermitteln
.Beschreibung
Hier wird vorgestellt, wie man den kurzen Datei- bzw.
Pfadnamen einer Datei anhand ihres langen Namens erhält. In Windows wird die kurze
Schreibweise oft auch "MS-DOS-Name" genannt.
» Die in Beispiel #1 vorgestellte Funktion GetShortName gibt den kurzen Datei- und Pfadnamen einer Datei zurück, indem die Windows API-Funktion GetShortPathName aufgerufen wird. Diese ermittelt die korrekte Schreibweise des kurzen Namens.
» Das Beispiel #2 verwendet das FileSystemObject-Objekt, welches über eine spezielle Eigenschaft ShortPath (Eigenschaft des File-Objektes) zum Ermitteln des kurzen Datei- und Pfadnamens verfügt. Da man ein File-Objekt direkt über die Methode GetFile erhält, wird lediglich eine einzige Programmzeile benötigt.
.Autor
» VBA-Code #1: Microsoft Support
Siehe auch MS KB-Artikel:
HOWTO: Get a Short Filename from a Long
Filename
http://support.microsoft.com/?kbid=175512
» VBA-Code #2: Philipp von Wartburg
.VBA-Code #1
'Deklarationsbereich
Declare Function GetShortPathName Lib "kernel32"
Alias "GetShortPathNameA" _
(ByVal lpszLongPath As String, ByVal lpszShortPath As String, _
ByVal cchBuffer As Long) As Long
'Codemodul
Public Function GetShortName(ByVal sLongFileName As
String) As String
Dim lRetVal As Long
Dim sShortPathName As String
Dim iLen As Integer
sShortPathName = Space(255)
iLen = Len(sShortPathName)
lRetVal = GetShortPathName(sLongFileName, sShortPathName, iLen)
GetShortName = Left(sShortPathName, lRetVal)
End Function
'*** Aufruf ***
Sub TestCall()
MsgBox GetShortName("C:\Meine Excel-Daten\Mappe mit langem
Namen.xls")
End Sub
.VBA-Code #2
Sub GetShortFilePath
MsgBox
CreateObject("Scripting.FileSystemObject").GetFile("C:\Meine
Excel-Daten\Mappe mit langem Namen.xls").ShortPath
End Sub
Verwandte Codebeispiele |
|
Weitere Informationen |
|
Langer Dateiname zu einem kurzen Dateinamen ermitteln
.Beschreibung
Manchmal besitzen Sie nur den kurzen Namen einer Datei (den so
genannten "MS-DOS-Name"), möchten aber den langen Dateinamen wissen. Die
Funktion GetLongName gibt den langen Datei- und Pfadnamen einer Datei zurück.
.Autor
Microsoft Support (Anpassungen durch Philipp von Wartburg)
Siehe auch MS KB-Artikel:
HOWTO: Get a Long Filename from a Short
Filename
http://support.microsoft.com/?kbid=154822
.VBA-Code
Function GetLongName(ByVal sShortName As String) As String
Dim sLongName As String
Dim sTemp As String
Dim iSlashPos As Integer
'Zeichen "\" hinzufügen, damit InStr in jedem Fall
ein Pfadtrennzeichen findet
sShortName = sShortName & "\"
'Ab der vierten Position suchen, damit das Laufwerk nicht
berücksichtigt wird ("[Laufwerk]:\")
iSlashPos = InStr(4, sShortName, "\")
'Zeichenfolgen zwischen den "\"-Zeichen umwandeln
While iSlashPos
sTemp = Dir(Left$(sShortName, iSlashPos - 1), vbNormal + vbHidden +
vbSystem + vbDirectory)
If sTemp = "" Then
'Die Datei bzw. der Ordner ist nicht
vorhanden
GetLongName = ""
Exit Function
End If
sLongName = sLongName & "\" & sTemp
iSlashPos = InStr(iSlashPos + 1, sShortName, "\")
Wend
'Laufwerk voranstellen
GetLongName = Left$(sShortName, 2) & sLongName
End Function
'*** Aufruf ***
Sub TestCall()
MsgBox GetLongName("C:\PROGRA~1\MICROS~1\VORLAGEN\MUSTER~1.XLT")
End Sub
.Hinweis
Die Dir-Funktion zeigt hier eine ziemlich
erstaunliche Fähigkeit: Sie akzeptiert auch kurze Dateinamen und gibt den langen
Dateinamen zurück. Zum Beispiel liefert die Anweisung
MsgBox Dir("Muster~1.xls")
das Ergebnis "Mustermappe.xls".
Das Ganze funktioniert auch mit Verzeichnispfaden, wobei jedoch nur der letzte Ordner des Pfades zurückgegeben wird. Beispielsweise die Anweisung
MsgBox Dir("D:\PROGRA~1\MICROS~1", vbDirectory)
gibt den langen Ordnernamen "Microsoft Office" aus.
Verwandte Codebeispiele |
|
Weitere Informationen |
|
UNC-Pfad eines Netzlaufwerkes ermitteln
.Beschreibung
Durch eine netzwerkweit einheitliche
Namensvergabe erleichtern UNC-Pfade den Zugriff auf Dateien, die zum Beispiel auf dem
Netzwerkserver gespeichert sind. So finden Sie dasselbe Dokument nicht einmal auf Laufwerk
Z: und ein anderes Mal auf Laufwerk M: sondern immer unter einer einheitlichen Pfadangabe
wie beispielsweise "\\SERVER\Dokumente\MeineMappe.xls".
Den UNC-Pfad eines Serverlaufwerkes kann mittels API-Funktion ermittelt werden. Das
folgende Codebeispiel zeigt eine Funktion namens GetUNCPath, welche den API-Aufruf
vornimmt. Übergeben Sie der Funktion den Laufwerkbuchstaben eines gemappten Laufwerkes
inklusive Doppelpunkt (z.B. "M:").
.Autor
Unbekannt (der VBA-Code stammt aus einem Newsletter von
Smarttools, www.smarttools.de;
Anpassungen durch Philipp von Wartburg)
.VBA-Code
'Deklarationsbereich
Declare Function WNetGetConnection Lib "mpr.dll" Alias
"WNetGetConnectionA" (ByVal lpszLocalName _
As String, ByVal lpszRemoteNameAs String, cbRemoteName As Long) As Long
Const NO_ERROR As Long = 0
'Codemodul
Function GetUNCPath(ByVal strDriveLetter As String) As
String
Dim lpszLocalName As String
Dim lpszRemoteName As String
Dim cbRemoteName As Long
Dim lRetval As Long
On Error GoTo ErrorHandler
lpszLocalName = strDriveLetter
lpszRemoteName = Space(255)
cbRemoteName = Len(lpszRemoteName)
lRetval = WNetGetConnection(lpszLocalName, lpszRemoteName, cbRemoteName)
If lRetval = NO_ERROR Then
GetUNCPath = RTrim(lpszRemoteName)
Else
GetUNCPath = ""
End If
Exit Function
ErrorHandler:
GetUNCPath = ""
Exit Function
End Function
'*** Aufruf ***
Sub TestCall()
Dim strUNCPath As String
strUNCPath = GetUNCPath("Z:")
If strUNCPath <> "" Then
MsgBox "Der UNC-Pfad lautet " & strUNCPath &
"."
Else
MsgBox "Der UNC-Pfad konnte nicht ermittelt werden."
End If
End Sub
Wenn Sie beispielsweise den UNC-Pfad der aktiven
Arbeitsmappe herausfinden möchten, übergeben Sie der obigen Funktion die ersten beiden
Zeichen des Arbeitsmappenpfades:
MsgBox
GetUNCPath(Left(ActiveWorkbook.Path, 2))
Voraussetzung dafür ist, dass sich die aktive
Arbeitsmappe auf einem verbundenem Netzwerklaufwerk befindet, welchem ein
Laufwerk-Buchstabe zugeordnet wurde.
Verwandte Codebeispiele |
|
|
Verknüpfungen beim Öffnen einer Arbeitsmappe nicht aktualisieren
.Beschreibung
Es existiert keine direkte Möglichkeit, die automatischen
Verknüpfungen beim Öffnen einer Arbeitsmappe nicht zu aktualisieren. Die einzige
Umgehungslösung besteht darin, zuerst eine andere Arbeitsmappe zu öffnen (eine Art
Hilfsmappe), in derer Auto_Open-Makro dann die eigentliche Mappe anhand der Open-Methode
unter Angabe des UpdateLinks-Argumentes zu öffnen und zum Schluss die Hilfsmappe
zu schliessen.
.VBA-Code
Sub Auto_Open()
Workbooks.Open "C:\Daten\MeineMappe.xls", UpdateLinks:=0
ThisWorkbook.Close False
End Sub
.Hinweis
Wenn das Argument UpdateLinks weggelassen
wird, erscheint die Rückfragemeldung "Automatische Verknüpfungen
aktualisieren?", sofern die Option "Aktualisieren von automatischen
Verknüpfungen bestätigen" eingeschaltet ist. Diese Option ist in Microsoft Excel
standardmässig aktiviert und kann im Optionen-Dialog (Menübefehl Extras/Optionen)
oder anhand der Eigenschaft AskToUpdateLinks des Application-Objektes
geändert werden.
Verwandte Codebeispiele |
|
|
|
Rückfrage "Verknüpfungen aktualisieren" beim Öffnen einer Arbeitsmappe unterdrücken
.Beschreibung
Wenn Sie eine Arbeitsmappe öffnen, die automatische
Verknüpfungen enthält, erscheint oft die Rückfragemeldung "Automatische
Verknüpfungen aktualisieren?". Ob die Meldung erscheint, hängt von der Einstellung
der für die gesamte Excel-Sitzung geltenden Option "Aktualisieren von automatischen
Verknüpfungen bestätigen" ab. Erfahrungsgemäss ist diese Option gewöhnlich
aktiviert, sodass die Rückfrage eingeblendet wird. Indem die Eigenschaft AskToUpdateLinks
auf False gesetzt wird, lässt sich die Anzeige der Rückfrage unterbinden.
.VBA-Code
Sub OpenWorkbook()
Application.AskToUpdateLinks = False
Workbooks.Open "C:\Daten\MeineMappe.xls"
End Sub
.Hinweis
Beachten Sie, dass dadurch die in der Arbeitsmappe
enthaltenen Verknüpfungen aktualisiert werden.
Verwandte Codebeispiele |
|
|
Speichern-Befehl für eine Arbeitsmappe sperren
.Beschreibung
Man kann die Speichern-Möglichkeit für eine Arbeitsmappe
unterbinden, indem man den Cancel-Parameter im Workbook_BeforeSave-Ereignis
auf True setzt, sofern das Ereignis nicht über den Speichern unter-Befehl in
Excel ausgelöst wurde (SaveAsUI enthält False).
.VBA-Code
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean,
Cancel As Boolean)
If Not SaveAsUI Then Cancel = True
End Sub
.Hinweis
Wenn sowohl Speichern als auch Speichern
unter gesperrt werden sollen, ist die Prüfung von SaveAsUI zu entfernen:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As
Boolean, Cancel As Boolean)
Cancel = True
End Sub
Verwandte Codebeispiele |
|
Speichern unter-Befehl für eine Arbeitsmappe sperren
.Beschreibung
Ähnlich wie beim Unterbinden der Speichern-Funktionalität
kann man auch den Speichern unter-Menübefehl sperren. Genau genommen wird nicht
der Menübefehl gesperrt sondern die dahinterstehende Aktion ignoriert. Der Befehl kann
weiterhin im Menü angeklickt werden; nur passiert nichts.
.VBA-Code
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean,
Cancel As Boolean)
If SaveAsUI Then Cancel = True
End Sub
.Hinweis
Wenn sowohl die Menübefehle Speichern als
auch Speichern unter gesperrt werden sollen, ist die Überprüfung des SaveAsUI-Parameters
zu entfernen:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As
Boolean, Cancel As Boolean)
Cancel = True
End Sub
Verwandte Codebeispiele |
|
Eigene Excel-Startparameter definieren
.Beschreibung
Microsoft Excel besitzt mehrere Schalter und Parameter, mit
denen man die Programmausführung steuern kann. Wenn man beispielsweise in der
Befehlszeile nach dem Namen der Programmdatei Excel.exe eine Arbeitsmappendatei angibt, so
wird diese Datei beim Programmstart geöffnet. Oder mit dem Startparameter "/e"
kann man festlegen, dass das Startfenster nicht eingeblendet und keine leere Mappe
geöffnet wird. Der Startparameter "/e" kann für eigene Zwecke 'missbraucht'
werden, da er der einzige Parameter ist, bei dem Excel es zulässt, dass nach dem
Parametername (d.h. dem Buchstabe "e") eine beliebige Zeichenfolge mitgegeben
wird.
Die zum Starten eines Windows-Programmes benutzte Befehlszeile kann anhand der API-Funktion GetCommandLine ausgelesen werden. Bei Microsoft Excel funktioniert dies ebenfalls. Die Abfrage der Befehlszeile erfolgt vorzugsweise in der Workbook_Open-Ereignisprozedur einer Arbeitsmappe, damit beim Öffnen der Arbeitsmappe auf allfällig mitgegebene Parameter reagiert werden kann. Die Funktion StringFromPointer ist eine Hilfsfunktion und wird verwendet, um den auf die Befehlszeile zeigenden Pointer in eine Zeichenfolge umzuwandeln.
Fügen Sie den gesamten VBA-Code in das Modul
"DieseArbeitsmappe" und speichern Sie die Mappe. Der Code wird aufgerufen, indem
Sie Excel mit der Befehlszeile
<Programmdatei> <Arbeitsmappendatei> /e/<Zeichenfolge>
ausführen.
Beispiel einer Befehlszeile:
"C:\Programme\Microsoft Office\Excel.exe"
"C:\Daten\MeineMappe.xls" /e/Philipp
Anstelle der Anweisung
MsgBox "Es wurde die Zeichenfolge
'" & strCommandLine & "' übergeben."
können Sie natürlich auch die Zeichenfolge auswerten und je nach Inhalt
entsprechend reagieren. Zum Beispiel so:
If strCommandLine = "Philipp" Then
Call SubPhilipp
Else
Call SubNotPhilipp
End If
.Autor
Michael Schwimmer, http://schwimmer.bei.t-online.de/index.htm
(Grössere Anpassungen durch Philipp von Wartburg)
.VBA-Code
'Deklarationsbereich von Modul
'DieseArbeitsmappe'
Private Declare Function GetCommandLine& Lib
"kernel32" Alias "GetCommandLineA" ()
Private Declare Function lstrlen Lib "kernel32" (ByVal str As Long) As Long
Private Declare Function lstrcpy Lib "kernel32" (ByVal dest As String, ByVal src
As Long) As Long
'Modul 'DieseArbeitsmappe'
Private Sub Workbook_Open()
Dim strCommandLine As String
Dim intPosition As Integer
'Befehlszeile auslesen
strCommandLine = StringFromPointer(GetCommandLine())
'Prüfen, ob "/e/" in der
Befehlszeile enthalten ist
intPosition = InStr(LCase(strCommandLine),
"/e/")
If intPosition > 0 Then
'"/e/" wurde
gefunden, daher Text nach "/e/" ausgeben
strCommandLine = Mid$(strCommandLine,
intPosition + 3)
MsgBox "Es wurde die Zeichenfolge '" & strCommandLine
& "' übergeben."
Else
'"/e/" wurde
nicht gefunden
MsgBox "Es wurde keine
Zeichenfolge übergeben."
End If
End Sub
'Modul 'DieseArbeitsmappe'
Private Function StringFromPointer(plngString As Long) As
String
Dim strResult As String
Dim lngNumber As Long
lngNumber = lstrlen(plngString)
strResult = String(lngNumber, 0)
lstrcpy strResult, plngString
If InStr(strResult, Chr(0)) <> 0 Then
strResult = Left$(strResult, InStr(strResult, Chr(0)) - 1)
End If
StringFromPointer = strResult
End Function
.Hinweis
Wenn Sie die übergebene Zeichenfolge dazu benutzen
möchten, ein bestimmtes Arbeitsblatt zu aktivieren, so sollten Sie den obigen
Programmcode nicht in die Ereignisprozedur Workbook_Open sondern in ein Makro
namens Auto_Open einfügen. Vor allem dann, wenn die Möglichkeit besteht, dass
die Arbeitsmappe mit Microsoft Excel 97 geöffnet wird. Excel 97 besitzt einen Bug, der
verhindert, dass im Workbook_Open-Ereignis ein bestimmtes Arbeitsblatt aktiviert
werden kann.
Mehr über dieses Problem erfahren Sie hier:
XL97: Open Event Macro May Not Activate a
Worksheet
http://support.microsoft.com/?scid=kb;en-us;174319
Weitere Informationen |
|
|
Prüfen, ob ein Verzeichnis Dateien enthält
.Beschreibung
Mit der als Codebeispiel 1 vorgestellten Funktion kann
getestet werden, ob ein bestimmtes Verzeichnis Dateien enthält oder leer ist. Das
Codebeispiel 2 verwendet statt der Dir-Funktion von VBA die Count-Eigenschaft
des Files- bzw. SubFolders-Objektes aus der FileSystemObject-Bibliothek.
Der Vorteil dieser Lösung ist, dass sowohl die Anzahl Dateien als auch die Anzahl
Unterverzeichnisse kontrolliert wird. Dadurch kann zuverlässig ermittelt werden, ob der
angegebene Ordner tatsächlich komplett leer ist.
.Autor
Codebeispiel 1: Rob Bovey
Codebeispiel 2: Philipp von Wartburg
.VBA-Code #1
Public Function IsFolderEmpty(ByVal strPath As String) As
Boolean
Dim bolReturn As Boolean
Dim strFiles As String
bolReturn = True
If Right$(strPath, 1) <> "\" Then strPath = strPath &
"\"
strFiles = Dir$(strPath & "*.*")
If strFiles <> "" Then bolReturn = False
IsFolderEmpty = bolReturn
End Function
'*** Aufruf ***
Sub TestCall()
If IsFolderEmpty("C:\Daten") Then
MsgBox "Das Verzeichnis ist leer (oder existiert
nicht)."
Else
MsgBox "Das Verzeichnis ist nicht leer."
End If
End Sub
.VBA-Code #2
Public Sub IsFolderEmpty2()
Dim strFolder As String
strFolder = "C:\Daten"
If
CreateObject("Scripting.FileSystemObject").GetFolder(strFolder).Files.Count = 0
And _
CreateObject("Scripting.FileSystemObject").GetFolder(strFolder).SubFolders.Count
= 0 Then
MsgBox "Der Ordner " & strFolder & " ist
leer."
Else
MsgBox "Der Ordner " & strFolder & " ist nicht
leer."
End If
End Sub
Weitere Informationen |
|
.Beschreibung
Mit der VBA-Anweisung RmDir kann ein Ordner gelöscht
werden, der allerdings keine Dateien oder Unterordner enthalten darf.
.VBA-Code
Sub RemoveDirectory()
RmDir "C:\Daten\AlterOrdner"
End Sub
.Hinweis
Mit RmDir kann ein Ordner nur dann gelöscht
werden, wenn er komplett leer ist. Der Ordner darf ausserdem nicht schreibgeschützt sein.
Ein versteckter Ordner dagegen kann mit RmDir problemlos gelöscht werden. Die RmDir-Anweisung
berücksichtigt jedoch keine Benutzerrechte. Das bedeutet, dass ein Ordner auch dann
gelöscht werden kann, wenn der Benutzer keine Lösch- und/oder Schreib-Rechte besitzt.
RmDir akzeptiert auch relative Pfade. Wenn Sie beispielsweise das Unterverzeichnis "AlterOrdner" desjenigen Verzeichnisses löschen möchten, in welchem Sie sich gerade befinden (entspricht dem aktuellen Verzeichnis, das mit CurDir ermittelt werden kann), dann können Sie auch einfach
RmDir "AlterOrdner"
schreiben, sprich nur den Ordnernamen ohne den gesamten Pfad. Der Vorteil ist, dass weder der Laufwerksbuchstabe, noch der Name des aktuellen Verzeichnisses, noch der Name von einem allfällig vorhandenen übergeordneten Verzeichnis (Parent Folder) bekannt sein muss. Befindet sich der Ordner auf der gleichen Ebene wie das aktuelle Verzeichnis, so funktioniert die Codezeile
RmDir "../AlterOrdner"
ohne Probleme.
Ist der zu löschende Ordner nicht vorhanden oder ist der relative Pfad in Bezug auf das aktuelle Verzeichnis fehlerhaft, so erscheint der Laufzeitfehler 76 "Pfad nicht gefunden". Ist der Ordner nicht leer oder schreibgeschützt, erscheint der Laufzeitfehler 75 "Fehler bei Zugriff auf Pfad/Datei". Folglich müssen Sie mindestens diese beiden Laufzeitfehler abfangen. Oder Sie müssen vor dem Löschen überprüfen, ob der Ordner existiert und alle oben beschreibenen Voraussetzungen für das Löschen erfüllt sind.
Weitere Informationen |
|
Verwandte Codebeispiele |
|
|
Ordner mit allen Unterordnern und Dateien löschen
.Beschreibung
Das Löschen eines gesamten Ordners mit allen enthaltenen
Dateien und Unterordnern ist äusserst einfach, wenn man die DeleteFolder-Methode
aus der FileSystemObject-Bibliothek benutzt. Man muss nur den zu löschenden
Ordner angeben, und schon wird er samt Inhalt komplett entfernt.
Mit dieser Prozedur wird ein kompletter Ordner mit sämtlichen enthaltenen Dateien und Unterverzeichnissen gelöscht.
.Autor
Codebeispiel 1: Philipp von
Wartburg
Codebeispiel 2: Philipp von Wartburg
Codebeispiel 3: Jim Rech (genauere Angaben nicht vorhanden)
.VBA-Code #1
Sub DeleteFolders1()
CreateObject("Scripting.FileSystemObject").DeleteFolder
"C:\AlteDaten"
End Sub
.VBA-Code #2
Sub DeleteFolders2()
CreateObject("Scripting.FileSystemObject").DeleteFolder
"C:\Daten\Monat*"
End Sub
.VBA-Code #3
ACHTUNG! Dieses Codebeispiel
wurde noch nicht abschliessend getestet! Benutzung auf eigene Gefahr.
'Deklarationsbereich
Const FO_DELETE = &h3&
Const FOF_NOCONFIRMATION = &h10&
Private Type SHFILEOPSTRUCT
hwnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAnyOperationsAborted As Long
hNameMappings As Long
lpszProgressTitle As String
End Type
Private Declare Sub CopyMemory Lib "kernel32" Alias
"RtlMoveMemory" _
(hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Private Declare Function SHFileOperation Lib "Shell32.dll" Alias _
"SHFileOperationA" (lpFileOp As Any) As Long
'Codemodul
Sub DeleteFolder3(SrcFile As String)
Dim result As Long
Dim lenFileop As Long
Dim foBuf() As Integer
Dim fileop As SHFILEOPSTRUCT
lenFileop = LenB(fileop)
ReDim foBuf(1 To lenFileop)
With fileop
.hwnd = 0
.wFunc = FO_DELETE
.pFrom = SrcFile & Chr(0) & Chr(0)
.fFlags = FOF_NOCONFIRMATION
.lpszProgressTitle = "" & Chr(0) & Chr(0)
End With
Call CopyMemory(foBuf(1), fileop, lenFileop)
Call CopyMemory(foBuf(19), foBuf(21), 12)
result = SHFileOperation(foBuf(1))
End Sub
'*** Aufruf ***
Sub TestCall()
DeleteFolder3 "C:\AlterOrdner"
End Sub
Verwandte Codebeispiele |
|
Ordnerinhalt löschen (nur Dateien)
.Beschreibung
In diesem Beispiel wird vorgestellt, wie die in einem Ordner
vorhandenen Dateien gelöscht werden können. Allfällig vorhandene Unterverzeichnisse
dieses Ordners und die dort enthaltenen Dateien werden hierbei nicht gelöscht.
.VBA-Code
Sub DeleteFolderFiles()
Kill "C:\Alte Dateien\*.*"
End Sub
.Hinweis
Beachten Sie bitte folgende Punkte:
- Die Kill-Anweisung löscht den Ordnerinhalt (d.h. die enthaltenen
Dateien) endgültig, d.h. verschiebt ihn nicht in den Windows-Papierkorb.
- Die im zu löschenden Ordner liegenden Unterverzeichnisse sowie deren Dateien
werden mit Kill nicht gelöscht.
- Besitzt eine Datei des angegebenen Ordners das Schreibgeschützt-Attribut, so
werden gar keine Dateien gelöscht, da die schreibgeschützte Datei nicht
gelöscht und somit die Löschung des Verzeichnisinhaltes als Ganzes betrachtet nicht
ordnungsgemäss durchgeführt werden kann (Laufzeitfehler 75 "Fehler beim Zugriff auf
Pfad/Datei" erscheint).
- Versteckte Dateien werden von Kill nicht berücksichtigt, d.h. dass sich
diese - mit dem Hidden-Attribut versehenen - Dateien auch nach erfolgreicher
Ordnerinhalt-Löschung weiterhin im Ordner befinden.
- Beim Versuch den Inhalt eines bereits leeren Ordners zu löschen, oder eines
Ordners, in welchem ausschliesslich versteckte Dateien liegen, erscheint der
Laufzeitfehler 53 "Datei nicht gefunden", da Kill keine Dateien findet.
Weitere Informationen |
|
|
Verwandte Codebeispiele |
|
Prüfen, ob ein Ordner existiert
.Beschreibung
Mit der Dir-Funktion von VBA kann man nebst der
Existenz von Dateien auch die von Ordnern überprüfen. In bestimmten Situationen ist
allerdings die GetAttr-Funktion besser geeignet (siehe zweites Codebeispiel).
» Das Codebeispiel #1 zeigt die üblich verwendete Überprüfung anhand der Dir-Funktion von VBA. Beachten Sie bitte, dass bei dieser Lösung bekannt sein muss, ob das zu prüfende Objekt (im Beispiel "C:\Daten") tatsächlich ein Ordner und nicht etwa eine Datei ist. "Daten" könnte nämlich durchaus eine Datei sein, obwohl keine Dateinamenerweiterung benutzt wird. Wenn Sie nicht sicher sind, sollten Sie vorsichtshalber die als Codebeispiel #2 vorgestellte Lösung verwenden. Die Dir-Funktion gibt nämlich erstaunlicherweise auch dann "Daten" als Resultat zurück, wenn es sich bei "C:\Daten" um eine existierende Datei handelt - obwohl die Konstante vbDirectory angegeben ist.
» Im Beispiel #2 wird die GetAttr-Funktion benutzt, was besser ist, falls man nicht sicher ist, ob "Daten" ein Ordner oder eine Datei ist. Im Gegensatz zum Codebeispiel mit Dir prüft die mittels And-Operator durchgeführte logische Konjunktion von GetAttr und vbDirectory zuverlässig, ob das angegebene Objekt tatsächlich ein Ordner ist und somit existiert oder nicht.
» Das Codebeispiel #3 verwendet eine völlig anderen Ansatz: Hier wird versucht, mittels ChDrive und anschliessendem ChDir auf das zu überprüfende Verzeichnis zu wechseln. Wenn kein Fehler auftritt, dann existiert der Ordner offensichtlich. Wenn der Laufzeitfehler 68 oder 76 auftritt, so existiert der Ordner nicht, weil das verwendete Laufwerk und/oder der Verzeichnispfad nicht vorhanden ist. Bei Auftreten des Laufzeitfehlers 75 "Fehler beim Zugriff auf Pfad/Datei" ist es nicht möglich, die Existenz des Ordners abschliessend festzustellen (siehe Programmcode).
.VBA-Code #1
Public Sub CheckIfFolderExists1()
If Dir("C:\Daten", vbDirectory) <> "" Then
MsgBox "Der angegebene Ordner existiert."
Else
MsgBox "Der angegebene Ordner existiert nicht."
End If
End Sub
.VBA-Code #2
Public Sub CheckIfFolderExists2()
If Val(GetAttr("C:\Daten") And vbDirectory) <> 0 Then
MsgBox "Das angegebene Objekt ist ein Ordner."
Else
MsgBox "Das angegebene Objekt ist eine Datei."
End If
End Sub
.VBA-Code #3
Public Sub CheckIfFolderExists3()
On Error Resume Next
ChDrive "C:\Daten"
ChDir "C:\Daten"
If Err.Number = 0 Then
MsgBox "Der angegebene Ordner existiert."
ElseIf Err.Number = 68 Or Err.Number = 76 Then
MsgBox "Der angegebene Ordner existiert nicht."
ElseIf Err.Number = 75 Then
MsgBox "Die Existenz des angegebenen Ordners kann nicht
festgestellt werden." & vbCrLf & vbCrLf & _
"Er könnte existieren, aber Sie
besitzen keine Leseberechtigung für diesen Ordner, oder " &
"er könnte nicht existieren, weil
das Laufwerk/der Datenträger nicht bereit ist."
End If
On Error GoTo 0
End Sub
.Hinweis
Beachten Sie in diesem Zusammenhang, dass die Dir-Funktion
standardmässig versteckte Dateien/Ordner nicht berücksichtigt. Die im ersten
Codebeispiel gezeigte Prüfung würde den versteckten Ordner "C:\Daten" als
nicht vorhanden betrachten. Die Programmzeile mit der Dir-Funktion müsste für
versteckte Ordner folgendermassen lauten:
If Dir("C:\Daten", vbDirectory Or vbHidden) <> "" Then
Durch die so genannte logische Disjunktion von vbDirectory und vbHidden mittels Or-Operator werden sowohl versteckte als auch nicht versteckte Ordner erkannt.
Im Gegensatz zur Dir-Funktion berücksichtigt GetAttr standardmässig auch versteckte Dateien/Ordner. Das oben abgebildete Beispiel #2 muss somit nicht angepasst werden, d.h. die vbHidden-Konstante darf weggelassen werden.
Bitte beachten Sie auch, dass beim Codebeispiel #2 der Laufzeitfehler 53 "Datei nicht gefunden" auftritt, wenn es sich bei dem angegebenen Objekt weder um eine Datei noch um einen Ordner handelt - sprich das Objekt beispielsweise gar nicht existiert.
Laufzeitfehler 68 "Gerät nicht verfügbar"
Laufzeitfehler 76 "Pfad nicht gefunden"
Weitere Informationen |
|
|
.Beschreibung
Mit der Name-Anweisung von VBA wird ein Ordner
umbenannt. Im Codebeispiel erhält der Ordner "AlteDaten" den neuen Namen
"NeueDaten".
.VBA-Code
Sub RenameFolder()
Name "C:\AlteDaten" As "C:\NeueDaten"
End Sub
.Hinweis
Beachten Sie bitte, dass das Umbenennen eines
Verzeichnisses in einer seltenen Situation nicht funktioniert. Mehr dazu erfahren Sie auf
den unter "Weitere Informationen" aufgeführten Themenseiten.
Weitere Informationen |
|
|
|
.Beschreibung
Die Programmiersprache VBA stellt keine Anweisung zum Kopieren
eines ganzen Ordners zur Verfügung. Eine Lösung, die ausschliesslich mit Standard
VBA-Anweisungen auskommt, ist ziemlich aufwändig, da unter anderem der VBA FileCopy-Befehl
keine Platzhalter unterstützt. Man müsste somit zuerst den neuen Ordner mittels MkDir
anlegen, dann sämtliche im Quellordner enthaltene Dateien mit der Dir-Funktion
auslesen und in eine Datenfeldvariable ablegen und zuletzt jede einzelne dieser Dateien
mit dem FileCopy-Befehl in den neuen Ordner kopieren.
Erheblich einfacher geht es mit der CopyFolder-Methode des FileSystemObject-Objektes (FSO), wie im folgenden Beispiel gezeigt wird.
.VBA-Code
Sub CopyFolder()
Dim fsoObject As Object
Set fsoObject = CreateObject("Scripting.FileSystemObject")
fsoObject.CopyFolder "D:\Daten", "D:\Backup"
Set fsoObject = Nothing
End Sub
.Hinweis
Im Gegensatz zum Kopieren existiert für das
Verschieben eines Ordners samt den enthaltenen Dateien und Unterverzeichnissen ein
VBA-Befehl. Es handelt sich um die Name-Anweisung, die von vielen Programmierern
umterschätzt wird, da sie gewöhnlich nur zum Umbenennen von Dateien benutzt wird.
Weitere Informationen |
|
.Beschreibung
Ein Ordner kann mit der Name-Anweisung von VBA
verschoben werden. Dabei werden sämtliche im Ordner enthaltenen Dateien und
Unterverzeichnisse verschoben. Das nachfolgende Codebeispiel verschiebt den Ordner
"MeinOrdner" samt Inhalt von "C:\AlterOrdner" nach
"C:\NeuerOrdner".
Der Ordner kann gleichzeitig umbenannt werden. Im Beispiel #2 wird der Ordner "MeinOrdner" verschoben und dabei in "AndererOrdner" umbenannt.
.VBA-Code #1
Sub MoveFolder1()
Name "C:\AlterOrdner\MeinOrdner" As "C:\NeuerOrdner\MeinOrdner"
End Sub
.VBA-Code #2
Sub MoveFolder2()
Name "C:\AlterOrdner\MeinOrdner" As
"C:\NeuerOrdner\AndererOrdner"
End Sub
.Hinweis
Beachten Sie bitte, dass das Verschieben eines Ordners
nur innerhalb des gleichen Laufwerkes möglich ist. Das Verschieben beispielsweise von
Laufwerk "C:" nach Laufwerk "D:" funktioniert nicht.
Verwandte Codebeispiele |
|
|
|
Weitere Informationen |
|
|
Anwendung starten und Makroausführung anhalten
.Beschreibung
In diesen Codebeispielen wird eine Anwendung gestartet und so
lange mit der weiteren Ausführung des Makros gewartet, bis die gestartete Anwendung
beendet worden ist. In den beiden Beispielen wird exemplarisch das Windows-Programm
Notepad/Notizblock (Editor) verwendet.
» Das erste Beispiel verwendet zwei Windows API-Funktionen. Auf die Programmbeendigung gewartet wird anhand einer Do-Loop-Schleife, in welcher der Ausführungsstatus des gestarteten Programmes laufend abgefragt wird.
» Im zweiten Beispiel wird die Run-Methode des Shell-Objektes aus der Bibliothek "Windows Script Host Object Model" benutzt. Ausgesprochen nützlich ist hier der dritte Parameter, welcher gemäss Objektmodell mit pvarWaitOnReturn benannt ist. Gibt man als Argument den Wert True mit, so wartet das System so lange, bis die gestartete Anwendung beendet worden ist (Der Anwendungsname ist der erste Parameter von Run).
» Das Beispiel #3 verwendet ebenfalls die Run-Methode des Shell-Objektes, wobei der Rückgabewert von Run weiterverarbeitet wird.
.Autor
Beispiel 1: Hans W. Herber, www.herber.de
(Anpassungen durch Philipp von Wartburg)
Beispiel 2: Philipp von Wartburg
Beispiel 3: Philipp von Wartburg
.VBA-Code #1
'Deklarationsbereich
Public Const PROCESS_QUERY_INFORMATION = &H400
Public Const WAIT_TIMEOUT = &H102&
Declare Function OpenProcess Lib "kernel32"
(ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long
'Codemodul
Public Sub WaitUntilFinished(ProgEXE As String)
Dim ProcessID As Long
Dim hProcess As Long
Dim RetVal As Long
ProcessID = Shell(ProgEXE, vbNormalFocus)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessID)
Do
DoEvents
RetVal = WaitForSingleObject(hProcess, 50)
Loop Until RetVal <> WAIT_TIMEOUT
End Sub
'*** Aufruf ***
Sub TestCall()
Call WaitUntilFinished("Notepad.exe")
MsgBox "Der Editor wurde beendet."
End Sub
.VBA-Code #2
Sub RunProgramAndWait()
CreateObject("WScript.Shell").Run "Notepad.exe", , True
MsgBox "Der Editor wurde beendet."
End Sub
.VBA-Code #3
Sub ShowProgramCloseMode()
Dim lngCloseMode As Long
lngCloseMode =
CreateObject("WScript.Shell").Run("Notepad.exe", , True)
If lngCloseMode = 0 Then
MsgBox "Der Editor wurde normal beendet."
Else '- oder "ElseIf
lngCloseMode = 1 Then"
MsgBox "Der Prozess des Editors wurde beendet."
End If
End Sub
.Hinweis
Interessant ist der Rückgabewert der Run-Methode.
Beträgt dieser 0, so wurde das gestartete Programm normal beendet (Menübefehl Datei/Beenden
der Anwendung, Anwendungsfenster schliessen oder "Task beenden" im Windows
Task-Manager). Wird jedoch der Wert 1 zurückgegeben, so wurde der Prozess
der Anwendung beendet (Schaltfläche "Prozess beenden" im Windows Task-Manager
oder Programmabsturz), und nicht die Anwendung als solches bzw. der Task der Anwendung. Da
Anwendungsprozesse im Normalfall nicht oder nur in Ausnahmefällen durch Benutzer beendet
werden, spricht man gewöhnlich von "Prozess abschiessen".
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
Registriertes Programm starten
.Beschreibung
Wenn Sie mit VBA ein Programm starten möchten, welches sich
nicht in einem Windows-Verzeichnis oder in einem in der Path-Systemvariable
angegebenen Suchpfad befindet, stossen Sie an die Grenzen der Shell-Funktion von
VBA. Shell kann nämlich nur Programme ausführen, die sich in einem der oben
genannten Verzeichnisse befinden. Mit einer API-Funktion oder der Run-Methode des
Shell-Objektes - ein Objekt aus der Bibliothek "Windows Script Host Object
Model" (Windows Script Host) - kann diese Einschränkung umgangen werden.
.VBA-Code #1
'Deklarationsbereich
Declare Function ShellExecute Lib
"shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As _
String, ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
'Codemodul
Sub RunReisteredProgram1()
ShellExecute 0&, "open", "ACDSee.exe", vbNullString,
vbNullString, vbNormalFocus
End Sub
.VBA-Code #2
Sub RunRegistredProgram2()
CreateObject("WScript.Shell").Run "ACDSee.exe", vbNormalFocus
End Sub
Weitere Informationen |
|
Arbeitsmappe aus dem Internet oder Intranet öffnen
.Beschreibung
Dieses Codebeispiel zeigt, wie eine Arbeitsmappe aus dem
Internet oder Intranet in Microsoft Excel geöffnet und anschliessend auf einer lokalen
Festplatte gespeichert wird.
.Autor
Microsoft Support
Siehe auch MS KB-Artikel:
XL97: Visual Basic Macro to Open a
Workbook on the Internet
http://support.microsoft.com/?kbid=155841
.VBA-Code
Public Sub OpenInternetFile()
'Arbeitsmappe öffnen
Workbooks.Open FileName:= "http://www.Internet.com/MeineMappe.xls"
'Fenster der Arbeitsmappe ausblenden
ActiveWindow.Visible = True
'Arbeitsmappe einblenden (Set the workbook to visible, or
else the file containing the macro
'will be saved under the new name)
Windows("MeineMappe.xls://
www.Internet.com/MeineMappe.xls").Visible = True
'Arbeitsmappe auf die lokale Festplatte speichern
ActiveWorkbook.SaveAs FileName:="C:\Daten\LokaleMappe.xls",
FileFormat:=xlExcel5, _
Password:="", WriteResPassword:="",
ReadOnlyRecommended:=False, CreateBackup:=False
End Sub
.Beschreibung
Dieses VBA-Beispiel zeigt, wie ein HTML-Dokument mit VBA in
Excel geöffnet wird, sodass es anschliessend in Excel bearbeitet werden kann. Sie werden
feststellen, dass eine HTML-Datei genau gleich wie eine gewöhnliche Arbeitsmappe
(Dateityp 'xls') mittels der Open-Methode geöffnet wird.
.VBA-Code
Sub OpenHTMLDocument()
Workbooks.Open Filename:="C:\Daten\HTML-Datei.htm"
End Sub
.Hinweis
Wenn die anhand des Filename-Parameters
angegebene HTML-Datei nach Ausführen von Open nicht angezeigt wird, könnte es
unter anderem daran liegen, dass die HTML-Datei Frames verwendet. Microsoft Excel ist
nicht in der Lage, HMTL-Dateien mit Frames darzustellen. Es erscheint keine Fehlermeldung;
die Datei wird ganz einfach nicht geöffnet.
Verwandte Codebeispiele |
|
Arbeitsmappe als Webseite speichern
.Beschreibung
Eine Arbeitsmappe wird als Webseite gespeichert, indem man
lediglich bei der SaveAs-Methode das Dateiformat xlHTML angibt.
.VBA-Code
Sub SaveBookAsWebpage()
ActiveWorkbook.SaveAs Filename:="C:\Daten\Webseite.htm",
FileFormat:=xlHTML
End Sub
.Hinweis
Das Speichern von Mappen im HTML-Format steht seit
Excel 2000 als Basis-Funktionalität zur Verfügung. Das Öffnen von HTML-Dateien dagegen
wird schon in Excel 97 unterstützt. In Excel 97 kann eine Arbeitsmappe anhand des
Internet Assistenten (so lautet der offizielle Name des Add-Ins 'HTML.xla') im
HTML-Dateiformat gespeichert werden. Beachten Sie hierbei, dass lediglich eine
rudimentäre HTML-Datei erstellt wird, d.h. dass unter anderem VBA-Code und eingebettete
ActiveX-Controls verloren gehen. In Excel 2000 und später wird eine vollständige
Webseite generiert, mit anderen Worten sämtliche Informationen der Arbeitsmappe erhalten
bleiben, also unter anderem auch der enthaltene VBA-Programmcode.
Bitte beachten Sie, dass beim Speichern als Webseite Microsoft Excel automatisch eine vollständige Neuberechnung der gesamten Arbeitsmappe durchführt; und zwar ungeachtet der aktuellen Berechnen-Einstellung ('Automatisch' oder 'Manuell'). Es existiert keine Möglichkeit zum Verhindern der Neuberechnung. Es kann daher durchaus vorkommen, dass eine im xls-Dateiformat gespeicherte Arbeitsmappe nicht die gleichen Daten enthält wie exakt dieselbe, jedoch als HTML-Datei gespeicherte Mappe.
Wenn Sie Microsoft Excel 2002 einsetzen, müssen Sie unbedingt das Microsoft Office 2002 Service Pack 2 installieren. Ohne Service Pack 2 speichert Excel blattübergreifende Hyperlinks (Cross Sheet Links) mit einer fehlerhaften Syntax. Dadurch funktionieren diese Hyperlinks nicht, wenn Sie die als HTML-Datei gespeicherte Arbeitsmappe in einem Webbrowser öffnen und dann auf einen Hyperlink klicken.
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
Arbeitsblatt mit dem Internet Assistent als HTML-Datei speichern
.Beschreibung
Ein Arbeitsblatt kann mit Hilfe des Internet Assistenten sehr
einfach als HTML-Datei gespeichert werden. Bei Microsoft Excel 97 steht der Internet
Assistent als separates Add-In zur Verfügung. Ab Microsoft Excel 2000 gehört er zur
Basis-Funktionalität. Der Internet Assistent kann nicht nur in der Anwendung Excel
aufgerufen werden sondern auch mit VBA. Dazu muss unter Microsoft Excel 97 im VBA-Projekt
ein Verweis auf das Add-In "Internet Assistent" ("html") gesetzt
werden. Bei Microsoft Excel 2000 und neuer wird der Verweis auf das Add-In "Internet
Assistent VBA" gesetzt. Sobald der Verweis angelegt wurde, kann die Funktion HTMLConvert
aufgerufen werden, die zum Generieren der HTML-Datei zuständig ist.
.VBA-Code
Sub CreateWebPage()
Dim objToConvert(0) As Variant
Dim intResult As Integer
Set objToConvert(0) = Sheets("Tabelle1").UsedRange
'Internet Assistent Add-In laden
AddIns("Internet-Assistent").Installed = True
'HTML-Seite generieren
intResult = htmlconvert(rangeandcharttoconvert:=objToConvert, _
useexistingfile:=False, usefrontpageforexistingfile:=False, _
addtofrontpageweb:=False, codepage:=1252, _
htmlfilepath:="Test.htm", headerfullpage:="Test
Page", _
linebeforetablefullpage:=True, namefullpage:="MyName")
If intResult = htmlconvert_success Then
MsgBox "Die Webseite wurde erfolgreich erstellt"
Else
MsgBox "Fehler aufgetreten"
End If
End Sub
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
Zellbereich oder Diagrammobjekt mit dem Internet Assistent als HTML-Datei speichern
.Beschreibung
Mit Hilfe des Internet Assistenten kann man einen Zellbereich
(oder auch mehrere) und auch Diagramme sehr einfach als HTML-Datei speichern. Bei
Microsoft Excel 97 steht der Internet Assistent als separates Add-In zur Verfügung. Ab
Microsoft Excel 2000 gehört er zur Basis-Funktionalität. Der Internet Assistent kann
nicht nur in der Anwendung Excel aufgerufen werden sondern auch mit VBA. Dazu muss unter
Microsoft Excel 97 im VBA-Projekt ein Verweis auf das Add-In "Internet
Assistent" ("html") gesetzt werden. Bei Microsoft Excel 2000 und neuer wird
der Verweis auf das Add-In "Internet Assistent VBA" gesetzt. Sobald der Verweis
angelegt wurde, kann die Funktion HTMLConvert aufgerufen werden, die zum
Generieren der HTML-Datei zuständig ist.
.VBA-Code
Sub CreateWebPage()
Dim objToConvert(2) As Variant
Dim intResult As Integer
'Array objToConvert mit den gewünschten Zellbereichen und
Diagrammen füllen
Set objToConvert(0) = Sheets("Tabelle1").Range("A1:A5")
Set objToConvert(1) = Sheets("Tabelle1").ChartObjects("Diagramm
1")
Set objToConvert(2) = Sheets("Tabelle1").Range("A7:A10")
'Internet Assistent Add-In laden
AddIns("Internet-Assistent").Installed = True
'HTML-Seite generieren
intResult = htmlconvert(rangeandcharttoconvert:=objToConvert, _
useexistingfile:=False, usefrontpageforexistingfile:=False, _
addtofrontpageweb:=False, codepage:=1252, _
htmlfilepath:="Test.htm", headerfullpage:="Test
Page", _
linebeforetablefullpage:=True, namefullpage:="MyName")
If intResult = htmlconvert_success Then
MsgBox "Die Webseite wurde erfolgreich erstellt"
Else
MsgBox "Fehler aufgetreten"
End If
End Sub
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
Zuletzt verwendete Arbeitsmappe öffnen
.Beschreibung
Über die RecentFiles-Auflistung erhält man Zugriff
auf die Dateinamen der zuletzt geöffneten Arbeitsmappen. Die neueste zuletzt geöffnete
Datei besitzt immer den Index 1 innerhalb der RecentFiles-Auflistung. Je nach
eingestellter Anzahl Einträge für zuletzt geöffnete Dateien enthält die Auflistung
maximal 9 Dateinamen (die Einstellung bezüglich Anzahl der zuletzt geöffneten Dateien
befindet sich im Excel Optionen-Dialog auf der Registerseite "Allgemein").
Beachten Sie bitte, dass die beiden RecentFiles-Eigenschaften Count und Maximum wichtige Informationen enthalten. Auf jeden Fall sollte, wie im Codebeispiel zu sehen ist, die Eigenschaft Count abgefragt werden. Dadurchdamit festgestellt werden kann, ob die Auflistung mindestens einen Eintrag enthält.
.VBA-Code
Sub OpenLastUsedFile()
If Application.RecentFiles.Count > 0 Then
Workbooks.Open Application.RecentFiles(1).Path
End If
End Sub
.Hinweis
Bitte beachten Sie, dass eine in RecentFiles
eingetragene Datei mit Workbooks.Open geöffnet werden sollte. RecentFiles
besitzt zwar ebenfalls eine Open-Methode zum Öffnen der Dateien; von der
Verwendung dieser Methode rate ich jedoch ab.
Diese Variante sollte daher nicht benutzt werden:
Sub OpenLastUsedFile()
Application.RecentFiles(1).Open
End Sub
Der Grund liegt am fehlerhaften Verhalten von Microsoft Excel beim Öffnen von CSV-Dateien. Trotz korrekt eingestelltem Listentrennzeichen in den Windows-Ländereinstellungen und angepasstem Registry-Eintrag für das DDE-Kommando 'Open' wird der Inhalt einer CSV-Datei beim Öffnen nicht auf die Tabellenspalten verteilt.
Verwandte Codebeispiele |
|
Weitere Informationen |
|
Zuletzt verwendete Dateien auflisten
.Beschreibung
Über die RecentFiles-Auflistung erhält man die
Dateinamen und -pfade der zuletzt in Microsoft Excel geöffneten Dateien. Gewöhnlich sind
dies Arbeitsmappen. Das hier vorgestellte Codebeispiel zeigt eine Komplettlösung: Es wird
ein neues Arbeitsblatt in der aktiven Arbeitsmappe eingefügt, in die Zelle A1 der Titel
"Zuletzt verwendete Dateien" und in die Zellen A3 und A4 die
Spaltenüberschriften "Datei" bzw. "Pfad" eingetragen. Ab Zeile 4
werden die Namen und Pfade der zuletzt verwendeten Dateien aufgelistet.
.VBA-Code
Sub ListRecentFiles()
Dim objRecentFiles As RecentFiles
Dim objRecentFile As RecentFile
Dim lngRow As Long
ActiveWorkbook.Worksheets.Add After:=Worksheets(Worksheets.Count)
With ActiveSheet
.Range("A1").Value = "Zuletzt verwendete Dateien"
.Range("A1").Font.Size = 12
.Range("A1").Font.Bold = True
.Range("A3").Value = "Datei"
.Range("B3").Value = "Pfad"
.Range("A3:B3").Font.Bold = True
End With
lngRow = 4
Set objRecentFiles = Application.RecentFiles
For Each objRecentFile In objRecentFiles
ActiveSheet.Cells(lngRow, 1).Value = objRecentFile.Name
ActiveSheet.Cells(lngRow, 2).Value = objRecentFile.Path
lngRow = lngRow + 1
Next
ActiveSheet.Range("A:B").EntireColumn.AutoFit
Set objRecentFiles = Nothing
End Sub
Verwandte Codebeispiele |
|
Weitere Informationen |
|
Arbeitsmappe schliessen ohne zu speichern
.Beschreibung
Es existieren mehrere Möglichkeiten, wie eine Arbeitsmappe
geschlossen werden kann, ohne dabei die Mappe zu speichern.
.Autor
Microsoft Support (Anpassungen durch Philipp von Wartburg)
Siehe auch MS KB-Artikel:
XL: Using Saved Property to Determine If
Workbook Has Changed
http://support.microsoft.com/?kbid=213634
.VBA-Code #1
Macro to Display Message If Active Workbook Has
Unsaved Changes
Sub TestForUnsavedChanges()
If ActiveWorkbook.Saved = False Then
MsgBox "Diese Mappe enthält nicht gespeicherte Änderungen."
End If
End Sub
This macro closes the workbook that contains the sample code and discards any changes to the workbook by setting the Saved property to True:
Sub CloseWithoutChanges()
ThisWorkbook.Saved = True
ThisWorkbook.Close
End Sub
Sub CloseWithoutChanges()
ThisWorkbook.Close SaveChanges:=False
End Sub
Weitere Informationen |
|
.Beschreibung
Die Objektbibliothek von Microsoft Excel bietet keine direkte
Möglichkeit zum Beenden einer anderen Anwendung. Es bleibt daher nur die Variante,
mittels geeigneten API-Funktionen von Windows der anderen Anwendung eine Aufforderung zu
schicken, sie solle sich beenden. Als Alternative kann man die Möglichkeiten der
Microsoft Word-Objektbibliothek einsetzen. Beide Lösungsvarianten besitzen Vor- und
Nachteile:
API-Funktionen:
- Vorteil: Microsoft Office bzw. Word muss nicht installiert sein.
- Vorteil: Schnelle Programmcodeausführung.
- Nachteil: Der genaue Fenstertitel muss bekannt sein.
- Nachteil: Eher komplizierter Programmcode wegen API-Deklarationen.
Word-VBA:
- Vorteil: Einfacher Programmcode in Word.
- Vorteil: Der genaue Fenstertitel muss nicht bekannt sein.
- Nachteil: Bei Automation relativ langsam.
- Nachteil: Microsoft Office bzw. Word muss installiert sein.
» Im ersten Beispiel wird der Windows-Taschenrechner beendet, indem das Fenster mit dem Titel "Rechner" gesucht wird und diesem mittels PostMessage ein WM_CLOSE-Befehl gesendet wird.
» Das zweite Codebeispiel beendet ebenfalls den Taschenrechner. Im Gegensatz zu Microsoft Excel existiert in der Objektbibliothek von Microsoft Word eine Tasks-Auflistung sowie ein Task-Objekt mit mehreren interessanten Methoden und Eigenschaften. Wenn Sie also in einem Word VBA-Programm oder mittels Automation eine andere Anwendung beenden wollen, sollten Sie das Task-Objekt anstelle der Windows API-Funktionen von Codebeispiel #1 verwenden.
» Das Codebeispiel #3 beendet den Taschenrechner, wobei der Programmcode im VBA-Projekt eines Word-Dokumentes ausgeführt werden muss.
.Autor
» Codebeispiel #1: Sam Huggill, VB-Square, www.vb-square.com (Anpassungen durch Philipp von Wartburg)
» Codebeispiel #2: Philipp von Wartburg
» Codebeispiel #3: Philipp von Wartburg
.VBA-Code #1
Public Declare Function FindWindow Lib "user32"
Alias "FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA"
(ByVal hwnd As Long, _
ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WM_CLOSE = &H10
Public Sub CloseTask1()
Dim lngHwnd As Long
lngHwnd = FindWindow(vbNullString, "Rechner")
If lngHwnd <> 0 Then
If PostMessage(lngHwnd, WM_CLOSE, 0&, 0&) = 0 Then
MsgBox "Fehler beim Beenden von 'Rechner'
aufgetreten!", vbExclamation
End If
Else
MsgBox "'Rechner' existiert nicht!", vbExclamation
End If
End Sub
.VBA-Code #2
Public Sub CloseTask2()
Const TaskName As String = "Rechner"
Dim objWord As Object
Set objWord = CreateObject("Word.Application")
On Error Resume Next
objWord.Tasks(TaskName).Close
If Err.Number = 5491 Then
MsgBox "Der Task '" & TaskName & "' existiert
nicht!", vbExclamation
ElseIf Err.Number <> 0 Then
MsgBox "Beim Beenden des Tasks '" & TaskName &
"' ist ein Fehler aufgetreten!", vbExclamation
End If
On Error GoTo 0
objWord.Quit
Set objWord = Nothing
End Sub
.VBA-Code #3
Public Sub CloseTask3()
Application.Tasks("Rechner").Close
End Sub
.Hinweis
Bei beiden Lösungsvarianten wird der Anwendungstask
beendet und nicht einfach der Prozess abgeschossen. Wenn Sie beispielsweise den Windows
Editor (Notepad.exe) beenden, so erscheint eine Rückfrage ...
TODO
Verwandte Codebeispiele |
|
|
Sicherungskopie einzelner Arbeitsblätter anlegen
.Beschreibung
Dieses Makro erstellt eine Sicherungskopie von bestimmten
Arbeitsblättern in Form einer neuen Arbeitsmappe. Im Beispiel wird exemplarisch das erste
und dritte Arbeitsblatt der aktiven Arbeitsmappe als Backup-Datei (Name der aktiven
Arbeitsmappe mit angehängter Dateinamenerweiterung 'bak') gesichert.
.Autor
Hans W. Herber, www.herber.de
(Anpassungen durch Philipp von Wartburg)
.VBA-Code
Sub SaveAndBackupSheets()
Dim wkbSource As Workbook
Dim wkbBackUp As Workbook
Dim strPath As String
Dim strFile As String
Application.ScreenUpdating = True
strPath = "C:\Temp\"
Set wkbSource = ActiveWorkbook
strFile = Left(wkbSource.Name, Len(wkbSource.Name) - 3) & "bak"
wkbSource.Save
wkbSource.Worksheets(1).Copy
Set wkbBackUp = ActiveWorkbook
wkbSource.Worksheets(3).Copy after:=wkbBackUp.Worksheets(1)
wkbBackUp.SaveAs strPath & strFile
wkbBackUp.Close savechanges:=False
Application.ScreenUpdating = False
End Sub
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
Eingabe eines gültigen Dateinamens im Speichern unter-Dialog erzwingen
.Beschreibung
Anhand einer Do-Loop-Schleife kann man einen Benutzer
dazu zwingen, einen gültigen Dateinamen im Speichern unter-Dialog einzugeben.
.VBA-Code #1
Sub GetFilenameForSave1()
Dim strFilename As String
Do
strFilename = Application.GetSaveAsFilename("NeueMappe.xls",
"Excel-Arbeitsmappen (*.xls),*.xls")
If strFilename <> "Falsch" And strFilename <>
"False" Then
If Dir(strFilename, vbNormal + vbHidden) = "" Then
Exit Do
Else
MsgBox "Eine Datei mit dem Namen '" &
strFilename & "' existiert bereits!"
End If
Else
Exit Sub
End If
Loop
ActiveWorkbook.SaveAs strFilename
End Sub
.VBA-Code #2
Sub GetFilenameForSave2()
Dim strFilename As String
Do
strFilename = Application.GetSaveAsFilename("NeueMappe.xls",
"Excel-Arbeitsmappen (*.xls),*.xls")
If strFilename <> "Falsch" And strFilename <>
"False" Then
If Dir(strFilename, vbNormal + vbHidden) = "" Then
Exit Do
Else
MsgBox "Eine Datei mit dem Namen '" &
strFilename & "' existiert bereits!"
End If
End If
Loop
ActiveWorkbook.SaveAs strFilename
End Sub
Weitere Informationen |
|
Arbeitsmappe nach 30 Sekunden speichern, sofern Benutzer nicht interveniert
.Beschreibung
Beschreibung folgt...
.VBA-Code
'Modul 'DieseArbeitsmappe'
Private Sub Workbook_Open()
Application.OnTime Now + TimeSerial(0, 0, 30), "AutomatischSpeichern"
dblOeffnenZeit = Timer
'Open-TimeStamp merken
bolAbbruch = False
'Abbruch-Flag initialisieren
End Sub
'Deklarationsbereich eines Codemoduls
Public bolAbbruch As Boolean
'Variable für Abbruch Ja/Nein
Public dblOeffnenZeit As Double
'Variable für Open-TimeStamp
'Codemodul
Public Sub AutomatischSpeichern()
If bolAbbruch = False Then
'Kein Abbruch durch Benutzer
ThisWorkbook.Close savechanges:=True
End If
End Sub
Public Sub SpeichernAbbrechen()
If Timer - dblOeffnenZeit <= 20 Then 'Wenn
<= 20 Sek. vergangen sind, dann Abbruch erlaubt
bolAbbruch = True
Else
If bolAbbruch = True Then 'Falls Abbruch, dann Abbruch zurücksetzen (siehe
Hinweis)
bolAbbruch = False
End If
End If
End Sub
.Hinweis
Die Codezeile "If bolAbbruch = True Then"
gibt dem Benutzer die Möglichkeit, eine innerhalb von 20 Sekunden deaktivierte
Auto-Speicherung neu zu aktivieren. Dazu hat er genau 10 Sekunden Zeit (zwischen 20 und 30
Sekunden seit Öffnen der Datei).
Arbeitsmappe mit dem Dateiformat "prn" speichern
.Beschreibung
Microsoft Excel stellt als Dateiformat unter anderem den
Dateityp "Formatierter Text (Leerzeichen getrennt)" zur Verfügung, welcher im
Speichern unter-Dialog von Excel ausgewählt werden kann. Mit diesem Dateiformat
gespeicherte Dateien erhalten standardmässig die Dateinamenerweiterung "prn".
Dieses Beispiel zeigt, wie automatisiert der Speichern unter-Dialog geöffnet, der
Dateityp "Formatierter Text" eingestellt und das aktive Arbeitsblatt als
prn-Datei gespeichert wird.
.VBA-Code
Public Sub SaveFileAsPRN()
'Wenn die Prozedur im VBA-Editor ausgeführt wird, zuerst
Excel aktivieren:
'AppActivate "Microsoft Excel"
SendKeys "MeineDatei{tab}{down}{home}{down 2}+{tab}" 'Siehe Hinweis
SendKeys "{enter}"
Application.CommandBars.FindControl(Id:=748).Execute '748 =
Speichern unter-Schaltfläche
End Sub
.Hinweis
Das Wort "MeineDatei" in der SendKeys-Zeichenfolge
muss mit dem zu gewünschten Dateinamen für die prn-Datei ersetzt werden.
Arbeitsmappe in Datei drucken (Ausdruck in Datei umleiten)
.Beschreibung
Der Ausdruck einer Arbeitsmappe kann, anstatt auf dem Drucker
auszugeben, auch problemlos in eine Datei umgeleitet werden. Das ist insofern problemlos,
weil es sich bei dieser Umleitungsmöglichkeit um eine Funktionalität handelt, die
standardmässig in Windows zur Verfügung steht. Auf dem Drucken-Dialog von Microsoft
Excel ist die Option "Ausdruck in Datei umleiten" zu finden, welche in
eingeschaltetem Zustand die Umleitung aktiviert. Wird bei eingeschalteter Option der
Druckvorgang gestartet, erscheint das Dialogfenster "Drucken in Dateien", worauf
der Benutzer den Namen für die Druckdatei eingeben muss.
.VBA-Code
Sub PrintIntoFile()
'AppActivate "Microsoft Excel" <--- Diese
Zeile einschalten, wenn Prozedur im VBA-Editor ausgeführt wird
SendKeys "C:\Ausdruck.txt{enter}"
ActiveWorkbook.PrintOut Copies:=1, PrintToFile:=True, Collate:=True
End Sub
.Hinweis
Berücksichtigen Sie, dass der in die Datei umgeleitete
Ausdruck nebst dem Inhalt der Arbeitsmappe auch Steuerzeichen für den Drucker enthält.
Das Dokument wird in einem Format gespeichert, das von Ihrem Druckgerät gelesen werden
kann, und nicht von der Anwendung, aus der Sie drucken.
Arbeitsmappe als PDF-Datei speichern
.Beschreibung
Wenn Sie den Adobe Acrobat PDFWriter® installiert
haben, können Sie eine Arbeitsmappe (oder beliebige Teile davon) als PDF-Datei speichern.
Eigentlich wird das Excel-Dokument nicht gespeichert sondern vielmehr in eine
PDF-formatierte Datei gedruckt.
.VBA-Code
Sub PrintAsPDFFile()
'AppActivate "Microsoft
Excel" <--- Diese Zeile einschalten, wenn Prozedur im VBA-Editor ausgeführt
wird
Dim strPDFName As String
Dim strCurrentPrinter As String
strPDFName = "C:\Daten\MeineMappe.pdf"
strCurrentPrinter = Application.ActivePrinter
SendKeys strPDFName & "{enter}"
ActiveWorkbook.PrintOut Copies:=1, ActivePrinter:="Acrobat PDFWriter auf
LPT1:"
Application.ActivePrinter = strCurrentPrinter
End Sub
.Hinweis
Wenn der Druckertreiber "Acrobat PDFWriter"
nicht mit dem Anschluss LPT1 verbunden ist, muss die Bezeichnung bei
"ActivePrinter:=" entsprechend angepasst werden.
Arbeiten mit einer lokalen Kopie der Arbeitsmappe
.Beschreibung
Bei langsamen Netzwerkverbindungen empfiehlt Microsoft die
Verwendung von lokalen Arbeitsmappen-Kopien.
.Autor
Microsoft Support (Anpassungen durch Philipp von Wartburg)
Siehe auch MS KB-Artikel:
XL97/XL2000: Workbooks Containing User
Forms Take Excessively Long Time to Save Across WAN Connections
http://support.microsoft.com/?kbid=254733
.VBA-Code
Private Const TEMPFILE As String =
"C:\LokaleMappe.xls"
Private Const TEMPFILE2 As String = "C:\LokaleMappe2.xls"
Private strOriginalName As String
Public bSaving As Boolean
Public Sub SaveLocalThenCopy()
Dim wbk As Workbook, wbk2 As Workbook
Set wbk = ThisWorkbook
If UCase(ThisWorkbook.FullName) <> UCase(TEMPFILE) Then _
strOriginalName = ThisWorkbook.FullName
If Dir(TEMPFILE) <> "" Then Kill TEMPFILE
If Dir(TEMPFILE2) <> "" Then Kill TEMPFILE2
ThisWorkbook.SaveAs TEMPFILE
ThisWorkbook.SaveAs TEMPFILE2
FileCopy TEMPFILE, strOriginalName
Set wbk2 = Workbooks.Open(strOriginalName)
bSaving = False
wbk.Close False
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As
Boolean, Cancel As Boolean)
If bSaving Then Cancel = False: Exit Sub
Dim iAns As Integer
iAns = MsgBox("Do you wish to Save As...?", vbYesNoCancel,
"Save")
Select Case iAns
Case vbYes
Cancel = True
bSaving = True
Application.Dialogs(xlDialogSaveAs).Show
bSaving = False
Exit Sub
Case vbNo
'Do normal - local save.
Case vbCancel
Cancel = True
Exit Sub
End Select
bSaving = True
Cancel = True
Application.OnTime Now + TimeValue("00:00:01"),
"SaveLocalThenCopy"
End Sub
Datei mit verknüpftem Programm öffnen
.Beschreibung
Anhand der Windows API-Funktion ShellExecute lässt
sich eine Datei mit der über den Dateityp referenzierten Anwendung öffnen. Es können
sämtliche in Windows registrierten Dateitypen verwendet werden, wie beispielsweise GIF-,
PDF-, TXT- oder HLP-Dateien. Im Gegensatz zu ShellExecute kann die VBA-Funktion Shell
nur ausführbare Programme öffnen bzw. starten. Eine weitere Möglichkeit ist die
Benutzung der FollowHyperlink-Methode des Workbook-Objektes von
Microsoft Excel. Letztere Lösungsmöglichkeit ist wesentlich kürzer als die ShellExecute-Lösung,
kann allerdings nur in Excel-VBA verwendet werden. ShellExecute kann in allen
VBA- und auch in VB-Programmen verwendet werden.
» Das Beispiel #1 verwendet die API-Funktion ShellExecute.
Argumente von ShellExecute
Diese Argumente werden von der API-Funktion verwendet:
| Argument | Beschreibung |
| hwnd | Window Handle (immer 0&) |
| lpOperation | DDE Command |
| lpFile | Pfad- und Dateiname |
| lpParameters | Befehlszeilen-Parameter |
| lpDirectory | Arbeitsverzeichnis |
| nShowCmd | Fensterstil |
» Das zweite Beispiel verwendet ebenfalls die API-Funktion ShellExecute, wobei zusätzlich der Rückgabewert der Funktion ausgewertet wird.
» Im dritten Beispiel wird die Lösungsvariante mit der FollowHyperlink-Methode vorgestellt.
.VBA-Code #1
'Deklarationsbereich
Declare Function ShellExecute Lib
"shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As _
String, ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
'Codemodul
Sub OpenFileWithAssociatedProgram1()
ShellExecute 0&, "open", "C:\EineDatei.pdf", vbNullString,
vbNullString, vbNormalFocus
End Sub
.VBA-Code #2
'Deklarationsbereich
Declare Function ShellExecute Lib
"shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As _
String, ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
'Codemodul
Sub OpenFileWithAssociatedProgram2()
Dim lngRetCode As Long
lngRetCode = ShellExecute(0&, "open",
"C:\EineDatei.pdf", vbNullString, vbNullString, vbNormalFocus)
If lngRetCode = 42 Then
'Kein Fehler aufgetreten
ElseIf lngRetCode = 2 Then
MsgBox "Datei nicht gefunden."
ElseIf lngRetCode = 31 Then
MsgBox "Kein verknüpftes Programm definiert oder DDE-Vorgang
fehlerhaft."
Else
MsgBox "Nicht näher bekannter Fehler aufgetreten."
End If
End Sub
.VBA-Code #3
'Codemodul
Sub OpenFileWithAssociatedProgram3()
ActiveWorkbook.FollowHyperlink "C:\Daten\Bild.gif"
End Sub
.Hinweis
Es können auch die in Datei-Verknüpfungen
hinterlegten Zieldateien mit ShellExecute geöffnet werden. Der Name der
Verknüpfungsdatei kann dabei mit oder ohne Dateinamenerweiterung 'lnk' angegeben werden.
Beispielsweise "C:\Verknüpfung mit Mappe1.xls.lnk" und "C:\Verknüpfung
mit Mappe1.xls" funktionieren beide.
Weitere Informationen |
|
Zieldatei aus einer Datei-Verknüpfung (lnk-Datei) ermitteln
.Beschreibung
Mit der hier vorgestellten Funktion wird der Dateiname der in
einer Verknüpfung (lnk-Datei) angegebenen Zieldatei ermittelt.
.VBA-Code
TODO: Programmcode
Verwandte Codebeispiele |
|
Verzeichnis über Ordnerauswahl-Dialog auswählen
.Beschreibung
Zum Auswählen eines Verzeichnisses anhand des
Ordnerauswahl-Dialoges existieren zwei verschiedene Musterlösungen. Die eine Lösung ist
für Office 97, die andere für Office 2000 und Office XP geeignet. Die Variante 2 kann
nicht in einem VBA-Programm unter Office 97 verwendet werden, da die Programmiersprache
VBA von Office 97 (VBA Version 5.0) den AddressOf-Operator nicht kennt.
TODO: Lösung 2!
.Autor
Philipp von Wartburg
Hans W. Herber, www.herber.de
.VBA-Code
'Deklarationsbereich
Public Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias _
"SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As
String) As Long
Declare Function SHBrowseForFolder Lib "shell32.dll" Alias _
"SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
'Codemodul
Function GetDirectory(Optional msg) As String
Dim bInfo As BROWSEINFO
Dim Path As String
Dim r As Long, x As Long, pos As Integer
bInfo.pidlRoot = 0&
If IsMissing(msg) Then
bInfo.lpszTitle = "Wählen Sie bitte einen Ordner aus."
Else
bInfo.lpszTitle = msg
End If
bInfo.ulFlags = &H1
x = SHBrowseForFolder(bInfo)
Path = Space$(512)
r = SHGetPathFromIDList(ByVal x, ByVal Path)
If r Then
pos = InStr(Path, Chr$(0))
GetDirectory = Left(Path, pos - 1)
Else
GetDirectory = ""
End If
End Function
'*** Aufruf ***
Sub TestCall()
Dim sMsg As String, sPath As String
sMsg = "Wählen Sie bitte einen Ordner aus:"
sPath = GetDirectory(sMsg)
If sPath <> "" Then MsgBox sPath
End Sub
Datei in einem Ordner und allen Unterordnern suchen (erste Fundstelle anzeigen)
.Beschreibung
Mit der hier vorgestellten Funktion SearchFileInFolders
wird eine Datei in einem Ordner und allen Unterordnern gesucht. Beachten Sie, dass nur die
erste gefundene Datei zurückgegeben wird. Beachten Sie zudem, dass die Platzhalterzeichen
'*' und '?' nicht verwendet werden können. Übrigens ist die
API-Funktion überaus schnell, insbesondere bei der zweiten und allen weiteren
Ausführungen der Dateisuche (siehe auch Hinweis am Ende des Codebeispiels).
Im nachstehenden Beispiel wird die Datei "EineMappe.xls" im Ordner "C:\Daten" und allen Unterverzeichnissen gesucht.
.Autor
KPD-Team 2000, www.allapi.net
(Anpassungen durch Philipp von Wartburg)
Eine nahezu identische Lösung stammt von Michael Schwimmer, http://schwimmer.bei.t-online.de/index.htm
.VBA-Code
'Deklarationsbereich
Declare Function SearchTreeForFile Lib
"imagehlp" (ByVal RootPath As String, _
ByVal InputPathName As String, ByVal OutputPathBuffer As String) As Long
Const MAX_PATH = 260
'Codemodul
Function SearchFileInFolders(strRootFolder As String, strFile As String) As String
Dim strDummy As String
Dim lngRetCode As Long
strDummy = String(MAX_PATH, 0)
lngRetCode = SearchTreeForFile(strRootFolder, strFile, strDummy)
If lngRetCode <> 0 Then
SearchFileInFolders = Left$(strDummy, InStr(1, strDummy, Chr$(0)) - 1)
Else
SearchFileInFolders = ""
End If
End Function
'*** Aufruf ***
Sub TestCall()
Dim strLocation As String
strLocation = SearchFileInFolders("C:\Daten", "EineMappe.xls")
If strLocation <> "" Then
MsgBox "Datei gefunden: " & strLocation
Else
MsgBox "Datei nicht gefunden"
End If
End Sub
.Hinweis
Die API-Funktion SearchTreeForFile betreibt
ein vorzügliches Caching, d.h. dass Informationen über durchsuchte Ordner für weitere
Suchläufe im Speicher erhalten bleiben. Dadurch verkürzt sich die Suchdauer bei der
nächsten Dateisuche erheblich, da praktisch keine Festplattenzugriffe mehr erfolgen; und
zwar ganz egal, nach welcher Datei gesucht wird! Suchen Sie beispielsweise zuerst nach
einer Datei "Textdatei.txt", die sich irgendwo auf der Festplatte befindet (was
aber nicht zwingend der Fall sein muss), und suchen Sie anschliessend - ebenfalls nur als
Beispiel - die Datei "Windows.hlp" (die sich üblicherweise im Windows
System-Verzeichnis befindet), so wird die Datei "Windows.hlp" in Rekordzeit
gefunden. Je mehr Ordner-Informationen sich im Cache befinden desto schneller wird die
Suche ablaufen. Bei meiner etwa 25'000 Dateien umfassenden Test-Festplatte dauerte die
Suche - nachdem bereits ein paar wenige Suchläufe durchgeführt wurden - nach einer
beliebigen Datei nur noch ca. 2 Sekunden!
Trotz hoher Geschwindigkeit sollten Sie bedenken, dass die Suche gänzlich innerhalb der API-Funktion abläuft. Beim Aufruf dieser Funktion wird die Programmkontrolle übergeben. Das bedeutet, dass der VBA-Code erst weiterläuft, wenn die Suche vollständig ausgeführt wurde. Sie besitzen somit keine Möglichkeit, die Suche abzubrechen bzw. zu unterbrechen.
Datei über ein gesamtes Laufwerk suchen
.Beschreibung
Mit der Funktion SearchFileOnDrive kann eine Datei
über ein gesamtes Laufwerk gesucht werden. Es wird nur die erste gefundene
Übereinstimmung zurückgegeben. Beachten Sie, dass die Platzhalter '*' und '?' nicht
verwendet werden können.
Im nachstehenden Beispiel wird die Datei "EineMappe.xls" auf dem Laufwerk "C:" gesucht.
.Autor
KPD-Team 2000, www.allapi.net
(Anpassungen durch Philipp von Wartburg)
Eine nahezu identische Lösung stammt von Michael Schwimmer, http://schwimmer.bei.t-online.de/index.htm
.VBA-Code
'Deklarationsbereich
Declare Function SearchTreeForFile Lib "imagehlp" (ByVal RootPath As String, _
ByVal InputPathName As String, ByVal OutputPathBuffer As String) As Long
Const MAX_PATH = 260
'Codemodul
Function SearchFileOnDrive(strDrive As String, strFile As String) As String
Dim strDummy As String
Dim lngRetCode As Long
strDummy = String(MAX_PATH, 0)
lngRetCode = SearchTreeForFile(strDrive, strFile, strDummy)
If lngRetCode <> 0 Then
SearchFileOnDrive = Left$(strDummy, InStr(1, strDummy, Chr$(0)) - 1)
Else
SearchFileOnDrive = ""
End If
End Function
'*** Aufruf ***
Sub TestCall()
Dim strLocation As String
strLocation = SearchFileOnDrive("C:", "EineMappe.xls")
If strLocation <> "" Then
MsgBox "Datei gefunden in Verzeichnis " & strLocation
Else
MsgBox "Datei nicht gefunden"
End If
End Sub
.Hinweis
Die API-Funktion SearchTreeForFile betreibt
ein vorzügliches Caching, d.h. dass Informationen über durchsuchte Ordner für weitere
Suchläufe im Speicher erhalten bleiben. Dadurch verkürzt sich die Suchdauer bei der
nächsten Dateisuche erheblich, da praktisch keine Festplattenzugriffe mehr erfolgen; und
zwar ganz egal, nach welcher Datei gesucht wird! Suchen Sie beispielsweise zuerst nach
einer Datei "Textdatei.txt", die sich irgendwo auf der Festplatte befindet (was
aber nicht zwingend der Fall sein muss), und suchen Sie anschliessend - ebenfalls nur als
Beispiel - die Datei "Windows.hlp" (die sich üblicherweise im Windows
System-Verzeichnis befindet), so wird die Datei "Windows.hlp" in Rekordzeit
gefunden. Je mehr Ordner-Informationen sich im Cache befinden desto schneller wird die
Suche ablaufen. Bei meiner etwa 25'000 Dateien umfassenden Test-Festplatte dauerte die
Suche - nachdem bereits ein paar wenige Suchläufe durchgeführt wurden - nach einer
beliebigen Datei nur noch ca. 2 Sekunden!
Trotz hoher Geschwindigkeit sollten Sie bedenken, dass die Suche gänzlich innerhalb der API-Funktion abläuft. Beim Aufruf dieser Funktion wird die Programmkontrolle übergeben. Das bedeutet, dass der VBA-Code erst weiterläuft, wenn die Suche vollständig ausgeführt wurde. Sie besitzen somit keine Möglichkeit, die Suche abzubrechen bzw. zu unterbrechen.
Unterordner eines Ordners auflisten
.Beschreibung
Es existieren mehrere Möglichkeiten zum Auflisten der
direkten Unterordner eines bestimmten Ordners. Hier werden zwei Lösungen vorgestellt:
» Das Beispiel #1 verwendet das FileSystemObject-Objekt. Hier wird die SubFolders-Auflistung des Folder-Objektes durchlaufen und alle dadurch ermittelten Ordner in der Spalte B eines neuen Arbeitsblattes in der aktiven Arbeitsmappe aufgelistet. Der Programmcode muss in einem VBA-Projekt von Microsoft Excel ablaufen.
» Im Beispiel #2 werden die VBA-Funktionen Dir und GetAttr eingesetzt. Beim Aufruf der vorgestellten Prozedur wird das Verzeichnis mitgegeben, dessen Unterverzeichnisse in einem Meldungsdialog (MsgBox) angezeigt werden sollen. Der Programmcode kann in einem VBA-Projekt eines beliebigen Microsoft Office-Programmes oder auch in einem VB-Projekt ablaufen.
.VBA-Code #1
Public Sub GetSubFolders1()
Dim lngRow As Long
Dim strPath As String
Dim objFSO As Object
Dim objSubfolders As Object
Dim objFolder As Object
lngRow = 1
strPath = "C:\Daten"
ActiveWorkbook.Worksheets.Add Type:=xlWorksheet
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objSubfolders = objFSO.GetFolder(strPath).SubFolders
ActiveSheet.Range("A1").Value = strPath
For Each objFolder In objSubfolders
ActiveSheet.Range("B" & lngRow).Value = objFolder.Name
lngRow = lngRow + 1
Next
Set objSubfolders = Nothing
Set objFSO = Nothing
End Sub
.VBA-Code #2
Public Sub GetSubFolders2(ByVal strDir As String)
Dim strItem As String
On Error Resume Next
If Right$(strDir, 1) <> "\" Then
strDir = strDir & "\"
End If
strItem = Dir(strDir & "*", vbDirectory)
Do While strItem <> ""
If strItem <> "." And strItem <> ".."
Then
If (GetAttr(strDir & strItem) And vbDirectory) =
vbDirectory Then
If Err.Number = 0 Then
MsgBox strItem
Else
Err.Clear
End If
End If
End If
strItem = Dir
Loop
End Sub
.Hinweis
Die Laufzeitfehler-Abfrage (siehe Codezeile "If
Err.Number = 0 Then") ist notwendig, weil sich die GetAttr-Funktion nicht
mit allen Dateien und Ordnern verträgt. Eine derartige Datei ist unter anderem die
Windows-Speicherauslagerungsdatei pagefile.sys, die permanent von einem Windows-Prozess
benutzt wird und somit kein anderer Prozess - in unserem Fall VBA bzw. das VBA-Programm -
auf diese Datei zugreifen kann. Bei Verwendung von GetAttr mit der Datei
"pagefile.sys" tritt der Laufzeitfehler 5 "Unzulässiger Prozeduraufruf
oder ungültiges Argument" auf.
Weitere Informationen |
|
Verwandte Codebeispiele |
|
|
Spezialordner mit Pfad auflisten
.Beschreibung
Es gibt verschiedene Möglichkeiten zum Ermitteln der
Windows-Spezialordner. Wenn Sie eine Liste auf einem Arbeitsblatt einer Microsoft
Excel-Arbeitsmappe erstellen möchten, empfiehlt sich die Verwendung des SpecialFolders-Objektes
aus der Windows Script Host-Objektbibliothek.
.VBA-Code
Public Sub ListSpecialFolders()
Dim intCounter As Integer
Dim objFolders As Object
Set objFolders = CreateObject("WScript.Shell").SpecialFolders
For intCounter = 0 To objFolders.Count - 1
ActiveSheet.Cells(intCounter + 1, 1).Value = objFolders(intCounter)
Next intCounter
Set objFolders = Nothing
End Sub
Diese Ordnernamen werden aufgelistet:
- D:\WINNT\Profiles\All Users\Desktop
- D:\WINNT\Profiles\All Users\Startmenü
- D:\WINNT\Profiles\All Users\Startmenü\Programme
- D:\WINNT\Profiles\All Users\Startmenü\Programme\Autostart
- D:\WINNT\Profiles\Administrator\Desktop
- D:\WINNT\Profiles\Administrator\Anwendungsdaten
- D:\WINNT\Profiles\Administrator\Druckumgebung
- D:\WINNT\ShellNew
- D:\WINNT\Fonts
- D:\WINNT\Profiles\Administrator\Netzwerkumgebung
- D:\WINNT\Profiles\Administrator\Desktop
- D:\WINNT\Profiles\Administrator\Startmenü
- D:\WINNT\Profiles\Administrator\SendTo
- D:\WINNT\Profiles\Administrator\Recent
- D:\WINNT\Profiles\Administrator\Startmenü\Programme\Autostart
- D:\WINNT\Profiles\Administrator\Favoriten
- D:\WINNT\Profiles\Administrator\Eigene Dateien
- D:\WINNT\Profiles\Administrator\Startmenü\Programme
Weitere Informationen |
|
|
Verwandte Codebeispiele |
|
.Beschreibung
Hier ein Codebeispiel für das Auflisten der verfügbaren
Laufwerke unter Verwendung des FileSystemObject-Objektes. Zu jedem Laufwerk wird
die Datenträger-Bezeichnung (Volume) angezeigt, ausser bei Netzwerk-Laufwerken. Bei
diesen Laufwerkstypen wird der Freigabename (Share) ausgegeben.
.Autor
Microsoft Excel VBA-Referenz (Anpassungen durch Philipp von Wartburg)
.VBA-Code
Public Sub ShowDriveList
Dim fs, d, dc, s, n
Set fs = CreateObject("Scripting.FileSystemObject")
Set dc = fs.Drives
For Each d in dc
s = s & d.DriveLetter & " - "
If d.DriveType = 3 Then 'Typ 3
bedeutet Netzwerk-Laufwerk
n = d.ShareName
Else
n = d.VolumeName
End If
s = s & n & vbCrLf
Next
MsgBox s
End Sub
Weitere Informationen |
|
Mehrere Arbeitsmappendateien zu einer Arbeitsmappe zusammenführen
.Beschreibung
Diese Prozedur führt die Arbeitsblätter mehrerer
Exceldateien in einer neuen Arbeitsmappe zusammen. Im Beispiel werden exemplarisch die
Blätter von zwei Arbeitsmappen (xls-Dateien) sowie die Blätter einer Vorlagemappe
(xlt-Datei) zu einer einzigen neuen Mappe mit der Bezeichnung
"KonsolidierteMappe.xls" zusammengefügt. Das Beispiel verwendet Office
Automation; der Programmcode kann somit in einem beliebigen Office-Programm ausgeführt
werden (Microsoft Excel muss allerdings installiert sein).
.VBA-Code
Public Sub CollectSheets()
Dim appExcel As Object
Set appExcel = CreateObject("Excel.Application")
With appExcel
.Visible = True
.DisplayAlerts = False
.Workbooks.Add Template:=1
With .Workbooks(1).Sheets
.Add Type:="D:\Meine Daten\Mappe_XYZ.xls"
.Add Type:="D:\Diverses\A1.xls"
.Add Type:="C:\Vorlagen\Excel\VorlageMappe.xlt"
End With
.Workbooks(1).Sheets(.Workbooks(1).Sheets.Count).Delete
.DisplayAlerts = True
.Workbooks(1).SaveAs "C:\Daten\KonsolidierteMappe.xls"
.UserControl = True
End With
Set appExcel = Nothing
End Sub
.Hinweis
Die Codezeile ".DisplayAlerts = False" ist
wichtig, da ansonsten die Meldung "Ausgewählte Blätter werden endgültig
gelöscht" beim Löschen des Arbeitsblattes erscheint (siehe Codezeile
".Workbooks(1).Sheets(.Workbooks(1).Sheets.Count).Delete").
Dateiformat einer geöffneten Arbeitsmappe abfragen
.Beschreibung
Durch Abfragen der FileFormat-Eigenschaft lässt sich
das Dateiformat der Arbeitsmappe ermitteln. Bei einer neuen, d.h. noch nicht gespeicherten
Mappe wird das Dateiformat der aktuell verwendeten Excelversion zurückgegeben;
unabhängig davon, welches Standard-Dateiformat eingestellt ist. Das Standard-Dateiformat
lässt sich anhand der Eigenschaft DefaultSaveFormat des Application-Objektes
bzw. über die Einstellung "Standard-Dateityp" im Excel Optionen-Dialog
(Menübefehl Extras/Optionen) festlegen.
.VBA-Code
Public Sub GetFileFormat()
MsgBox ActiveWorkbook.FileFormat
End Sub
Weitere Informationen |
|
Verwandte Codebeispiele |
|
Dateiformat einer geschlossenen Arbeitsmappe abfragen
.Beschreibung
Das Format einer geschlossenen Arbeitsmappendatei lässt sich
nicht ganz so einfach ermitteln. Es existiert zwar schon eine Möglichkeit, mit VBA das
Dateiformat herauszufinden - und zwar ohne dass dabei die Arbeitsmappe mit Microsoft Excel
geöffnet werden muss. Dazu wird allerdings eine von Microsoft Developer Support
entwickelte DLL-Datei namens "dsofile.dll" benötigt, die den Zugriff auf die
Dokument-Eigenschaften der Datei ermöglicht.
Das nachfolgende VBA-Codebeispiel zeigt, wie man die Dateiformatversion einer Excel-Arbeitsmappe herausfindet, ohne dass die Datei geöffnet werden muss - weder mit Microsoft Excel noch mit einem anderen Programm. Die in der DLL bereitgestellten Funktionen sind so implementiert, dass nur auf einen bestimmten Teil der Datei zugegriffen wird (auf den 'SummaryInformation'-Stream bzw. 'DocumentSummaryInformation'-Stream des OLE2 Structured File Formates).
.VBA-Code
Public Sub GetFileFormatVersion()
Dim objDSOReader As Object
Dim objDSODocument As Object
Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
Set objDSODocument =
objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")
MsgBox "Dateiformatversion der Datei: " & objDSODocument.Version
Set objDSODocument = Nothing
Set objDSOReader = Nothing
End Sub
.Hinweis
Die bei GetDocumentProperties angegebene Datei
darf zum Zeitpunkt der Codeausführung nicht in Bearbeitung sein, weil GetDocumentProperties
immer einen exklusiven Dateizugriff durchführt. Wenn die Datei nicht verfügbar ist,
sprich geöffnet ist, erscheint der Laufzeitfehler 3 "The file is currently open and
cannot be read". Auf der anderen Seite wird mit obigem Programmcode die Datei so
lange gesperrt, bis die Codezeile "Set objDSODocument = Nothing" ausgeführt
wird.
Weitere Informationen |
|
Verwandte Codebeispiele |
|
.Beschreibung
Datei-Attribute können mit der GetAttr-Funktion von
VBA abgefragt werden.
.VBA-Code
Sub GetFileAttribute()
MsgBox GetAttr("C:\Daten\MeineMappe.xls")
End Sub
.Hinweis
Als Alternative zu GetAttr kann auch die Attributes-Eigenschaft
von File des FileSystemObject-Objektes verwendet werden.
Weitere Informationen |
|
.Beschreibung
Die unscheinbare VBA-Anweisung Name kann nicht nur
Dateien umbenennen sondern auch verschieben oder sogar gleichzeitig umbenennen und
verschieben. Das Verschieben funktioniert allerdings nur wenn sich das Zielverzeichnis
(also der Ort, wohin die Datei verschoben werden soll) auf dem gleichen Laufwerk befindet
wie das Quellverzeichnis der Datei. Das Verschieben einer Datei beispielsweise von
Laufwerk C: nach Laufwerk D: kann mit der Name-Anweisung somit nicht
durchgeführt werden. Das laufwerkübergreifende Verschieben lässt sich nur mit dem FileSystemObject-Objekt
oder mit der Windows API-Funktion MoveFile bewerkstelligen.
» Das Codebeispiel #1 zeigt die Lösungsvariante mit dem VBA-Befehl Name zum Verschieben einer Datei. Wenn im Zielverzeichnis bereits eine gleichnamige Datei existiert, tritt der Laufzeitfehler 58 "Datei existiert bereits" auf.
» Das Beispiel #2 verwendet ebenfalls den Befehl Name, wobei die Datei verschoben und gleichzeitig umbenannt wird. Auch hier tritt bei bereits vorhandener Datei der Laufzeitfehler 58 "Datei existiert bereits" auf.
» Das dritte Beispiel verwendet die API-Funktion MoveFile. Wenn im Zielverzeichnis bereits eine gleichnamige Datei existiert, gibt die Funktion den Wert 0 zurück. Die Datei wird in diesem Fall nicht verschoben.
» Im Beispiel #4 wird eine Datei anhand der API-Funktion MoveFile verschoben und umbenannt. Wenn im Zielverzeichnis die Datei bereits existiert, gibt die Funktion den Wert 0 zurück. Die Datei wird in diesem Fall nicht verschoben und umbenannt.
» Das fünfte Beispiel zeigt die Verwendung der MoveFile-Methode des FileSystemObject-Objektes.
.VBA-Code #1
Sub MoveFile1()
Name "C:\AlteDateien\EineDatei.xls" As
"C:\NeueDateien\EineDatei.xls"
End Sub
.VBA-Code #2
Sub MoveFile2()
Name "C:\AlteDateien\AlterDateiname.xls" As
"C:\NeueDateien\NeuerDateiname.xls"
End Sub
.VBA-Code #3
Declare Function MoveFile Lib "kernel32" Alias
"MoveFileA" (ByVal _
lpExistingFileName As String, ByVal lpNewFileName As String) As Long
Sub MoveFile3()
Dim lngRetVal As Long
lngRetVal = MoveFile("C:\AlteDateien\EineDatei.xls",
"C:\NeueDateien\EineDatei.xls")
If lngRetVal = 0 Then
MsgBox "Fehler beim Verschieben der Datei."
End If
End Sub
.VBA-Code #4
Declare Function MoveFile Lib "kernel32" Alias
"MoveFileA" (ByVal _
lpExistingFileName As String, ByVal lpNewFileName As String) As Long
Sub MoveFile4()
Dim lngRetVal As Long
lngRetVal = MoveFile("C:\AlteDateien\AlterDateiname.xls",
"C:\NeueDateien\NeuerDateiname.xls")
If lngRetVal = 0 Then
MsgBox "Fehler beim Verschieben und Umbenennen der
Datei."
End If
End Sub
.VBA-Code #5
Sub MoveFile5()
CreateObject("Scripting.FileSystemObject").MoveFile
"C:\AlteDateien\EineDatei.xls", "C:\NeueDateien\EineDatei.xls"
End Sub
.Hinweis
Beachten Sie bitte, dass bei keiner Lösungvariante
Platzhalterzeichen (? und *) erlaubt sind. Weder Name, noch die MoveFile-Methode
noch die API-Funktion MoveFile unterstützen Platzhalter. Es kann daher immer nur
eine einzelne Datei verschoben/umbenannt werden.
Weitere Informationen |
|
Verwandte Codebeispiele |
|
Neue Arbeitsmappe basierend auf dem aktiven Arbeitsblatt erstellen
.Beschreibung
Wenn Sie bei der Copy-Methode von Worksheets
weder den After- noch Before-Parameter angeben, kopiert Microsoft Excel
das Arbeitsblatt in eine neue Arbeitsmappe. Im Codebeispiel wird das aktive Arbeitsblatt
kopiert.
.VBA-Code
Sub CreateNewBook
ActiveSheet.Copy
Sub End
.Hinweis
Probieren Sie bitte auf keinen Fall, ein ausgeblendetes
Arbeitsblatt in eine neue Arbeitsmappe zu kopieren. Excel versucht nämlich, dass
Arbeitsblatt mit sämtlichen Einstellungen in die neue Mappe zu übertragen, sprich die
aktuellen Blatt-Eigenschaften auch in der neuen Arbeitsmappe unverändert anzuwenden. Da
bekanntlich eine Arbeitsmappe grundsätzlich mindestens ein sichtbares Arbeitsblatt
enthalten muss, das kopierte Blatt (welches das einzige in der neuen Mappe ist) jedoch
ausgeblendet ist, gerät Excel aus der Fassung. Excel versucht, die an sich korrekt
verwendete Copy-Methode vollständig auszuführen, was aber nicht funktioniert.
Die Folge ist ein Programm-Absturz von Microsoft Excel.
Seriennummer eines Laufwerkes abfragen
.Beschreibung
Am einfachsten lässt sich die Seriennummer eines Laufwerkes
anhand der SerialNumber-Eigenschaft des Drive-Objektes aus der FileSystemObject-Objektbibliothek
ermitteln. Die SerialNumber-Eigenschaft enthält allerdings die Seriennummer nur
als Dezimalzahl. Wenn Sie die Information in Hex-Schreibweise benötigen (unter Windows
und MS-DOS ist eigentlich die Hex-Darstellung gebräuchlich), so muss die Dezimalzahl
umgewandelt werden.
.Autor
Microsoft Excel VBA-Referenz (Anpassungen durch Philipp von Wartburg)
.VBA-Code
Public Sub ShowDriveInfo()
Dim fs, d, s, t, dr
dr = "E:\Daten"
Set fs = CreateObject("Scripting.FileSystemObject")
Set d = fs.GetDrive(fs.GetDriveName(fs.GetAbsolutePathName(dr)))
Select Case d.DriveType
Case 0: t = "Unbekannt"
Case 1: t = "Austauschbar"
Case 2: t = "Fest"
Case 3: t = "Netzwerk"
Case 4: t = "CD-ROM"
Case 5: t = "RAM Disk"
End Select
MsgBox "Laufwerk " & d.DriveLetter & ": - " & t
& vbCrLf & "Seriennummer: " & d.SerialNumber
End Sub
.Hinweis
7DD-0B76
131926902
924914921
3721-14E9
2022265388
7889-522C
CreateObject("Scripting.FileSystemObject").GetDrive("C:").SerialNumber
Function SerialNumberHex(ByVal lngSerialNumber As Long)
As String
Dim strHex As String
strHex = Val("&H" & lngSerialNumber)
strHex = Format$(strHex, "&&&&-@@@@")
strHex = String$(9 - Len(strHex), "0") & strHex
SerialNumberHex = xx
End Function
Weitere Informationen |
|
Prüfen, ob eine geöffnete Arbeitsmappe ein Dateikennwort verwendet
.Beschreibung
Die Eigenschaft HasPassword des Workbook-Objektes
gibt an, ob eine geöffnete Arbeitsmappe ein Dateikennwort (d.h. ein
Lese-/Schreibkennwort) verwendet. Im Codebeispiel wird die aktive Mappe überprüft.
.VBA-Code
Public Sub CheckFilePassword()
If ActiveWorkbook.HasPassword = True Then
MsgBox "Die Arbeitsmappe besitzt ein Dateikennwort."
End If
End Sub
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
Prüfen, ob eine geschlossene Arbeitsmappe ein Dateikennwort verwendet
.Beschreibung
Bei einer geschlossenen Arbeitsmappendatei ist es schwierig
herauszufinden, ob die Mappe ein Dateikennwort verwendet; es ist aber nicht unmöglich.
Mit reinem VBA ist diese Aufgabe allerdings nur ziemlich aufwändig und umständlich
lösbar. Einfacher geht es mit Hilfe von geeigneten DLLs (z.B. der DLL
"dsofile.dll" von Microsoft Developer Support und Utilities (z.B. dem Freeware
Tool "FileFox"). Trotz allen Schwierigkeiten hier eine Lösungsvariante mit VBA.
Zuerst aber ein kurzer Blick auf die angesprochenen Schwierigkeiten:
Damit herausgefunden werden kann, ob eine Arbeitsmappe ein Dateikennwort besitzt, muss auf die Arbeitsmappendatei (xls-Datei) zugegriffen werden; und zwar wird die Datei mit dem Binär-Lese-Zugriffsmodus geöffnet und in den Arbeitsspeicher eingelesen (Binary Access Read), wobei die Arbeitsmappe nicht im eigentlichen Sinne geöffnet wird, da sie weder bearbeitet werden kann (sie ist mit Read geöffnet) noch für Excel-Benutzer gesperrt ist (sie ist nicht mit Lock geöffnet).
- Die erste Schwierigkeit tritt beim xls-Dateiformat für Arbeitsmappen auf: Damit in der Datei nachgesehen werden kann, ob ein Kennwort verwendet wird, muss man sich mit dem Excel-Dateiformat BIFF (BIFF steht für Binary Interchange File Format) gut auskennen. Man muss einiges über das Structured Storage Format der Datei, die enthaltenen Storages, die Streams und die Recordtypen wissen, damit man die Information "Dateikennwort ja oder nein" am richtigen Ort sucht. Und da wären wir bereits bei der zweiten Schwierigkeit.
- Die Daten einer Arbeitsmappe stehen nicht immer am gleichen Ort in der xls-Datei. Schon der Record mit der BOF-Markierung (BOF=Begin Of File) muss nicht zwangsläufig am Anfang der Datei stehen.
- Die dritte Schwierigkeit betrifft die Version der Dateiformate: Excel 97, 2000, 2002 und 2003 verwenden das Format BIFF8, Excel 95 das Format BIFF7 und Excel 5.0 das Format BIFF5. Die Unterschiede dieser Formatversionen müssen im VBA-Code berücksichtigt werden. So ist unter anderem der BOF-Record von BIFF5/BIFF7 exakt um 8 Bytes kürzer als der BOF-Record von BIFF8.
TODO
Das Objekt DocumentProperties besitzt eine Eigenschaft namens LocaleInfo, die in der Objektbibliothek ausgeblendet ist. Dieses Property enthält gewöhnlich den Länder-/Gebietsschema-Code bzw. Länder-/Gebietsschema-Name des Dokumentes. Wenn LocaleInfo aber lediglich ein einzelnes Fragezeichen '?' enthält, dann bedeutet dies, dass das Dokument mittels Kennwort geschützt ist. Das ist jedoch nur bei Excel-Dokumentdateien der Fall.
.VBA-Code
Public Sub CheckPassword()
Dim objDSOReader As Object
Dim objDSODocument As Object
Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
Set objDSODocument =
objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")
If objDSODocument.LocaleInfo = "?" Then
MsgBox "Die Arbeitsmappe ist mit einem Kennwort
geschützt."
Else
MsgBox "Die Arbeitsmappe ist nicht geschützt."
End If
Set objDSODocument = Nothing
Set objDSOReader = Nothing
End Sub
Weitere Informationen |
|
Verwandte Codebeispiele |
|
|
Prüfen, ob eine Arbeitsmappe ein Auto_Open-Makro enthält
.Beschreibung
Mit der folgenden Funktion kann überprüft werden, ob sich im
VBA-Projekt einer geöffneten Arbeitsmappe ein Auto_Open-Makro befindet. Wenn das
Makro Auto_Open existiert, wird der Name des Codemoduls zurückgeben, in dem das
Makro vorgefunden wurde.
.VBA-Code
Function CheckIfSubExists(strSubName As String) As String
Dim lngLineCounter As Long
Dim strSubNamePublic As String
Dim objComponent As VBComponent
strSubName = UCase("Sub " & strSubName & "()")
strSubNamePublic = UCase("Public " & strSubName)
For Each objComponent In
Workbooks("MeineMappe.xls").VBProject.VBComponents
With objComponent.CodeModule
For lngLineCounter = 1 To .CountOfLines
If UCase(.Lines(lngLineCounter, 1)) =
strSubName Or _
UCase(.Lines(lngLineCounter, 1)) = strSubNamePublic Then
CheckIfSubExists =
objComponent.CodeModule
Exit Function
End If
Next lngLineCounter
End With
Next objComponent
CheckIfSubExists = ""
End Function
'*** Aufruf ***
Sub TestCall()
Dim strModule As String
strModule = CheckIfSubExists("Auto_Open")
If strModule <> "" Then
MsgBox "Prozedur gefunden in " & strModule & "."
Else
MsgBox "Prozedur nicht gefunden."
End If
End Sub
.Hinweis
Abgesehen von der Prozedur Auto_Open kann
natürlich auch das Auto_Close-Makro überprüft werden, indem der
Funktionsaufruf entsprechend angepasst wird (siehe Prozedur TestCall).
Der oben vorgestellte VBA-Programmcode funktioniert nur, wenn das VBA-Projekt nicht mit einem Kennwort geschützt ist. Wie Sie herausfinden können, ob ein geschütztes Projekt ein Auto_Open-Makro enthält, lesen Sie hier:
Weitere Informationen |
|
Verwandte Codebeispiele |
|
Prüfen, ob eine Dokument-Datei Makros enthält
.Beschreibung
Es gibt eine interessante Möglichkeit, wie man herausfinden
kann, ob sich in einer Excel-Arbeitsmappe oder einem Word-Dokument Makros befinden. Dazu
bedient man sich der HasMacros-Eigenschaft aus der Bibliothek "OLE Document
Properties Reader" (Datei "DSOFile.dll").
Bei der HasMacros-Eigenschaft muss beachtet werden, dass sie nur dann einen korrekten Wert liefert, wenn die Datei eine Microsoft Excel- oder eine Microsoft Word-Datei ist. Ob die Excel-Datei eine Arbeitsmappe (Dateinamenerweiterung xls), eine Vorlagemappe (xlt), ein Add-In (xla) oder eine Sicherungskopie (xlk) ist, ist jedoch nicht von Bedeutung, da alle diese Dateien intern gleich strukturiert sind (bei Word-Dateien verhält es sich gleich). Wenn Sie HasMacros bei einem anderen Dokumentdateityp abfragen, beispielsweise bei einer PowerPoint-Präsentation, einem Microsoft Projekt-Projektplan oder einem Crystal Reports-Bericht, so erscheint der Laufzeitfehler -2147220988 (&H80040204) "This property can only be called on Word or Excel documents". Dieser Fehler ist im hier vorgestellten Codebeispiel abgefangen.
.VBA-Code
Public Sub CheckIfHasMacros()
Dim objDSOReader As Object
Dim objDSODocument As Object
Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
Set objDSODocument =
objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")
On Error Resume Next
strMacros = CStr(objDSODocument.HasMacros)
If Err.Number = &H80040204 Then
MsgBox "Die Existenz von Makros kann für diesen
Dokumenttyp nicht abgefragt werden."
Else
If strMacros = "True" Then
MsgBox "Das Dokument enthält Makros."
Else
MsgBox "Das Dokument enthält keine
Makros."
End If
End If
Set objDSODocument = Nothing
Set objDSOReader = Nothing
End Sub
.Hinweis
HasMacros verwendet ein 'pessimistisches'
Verfahren zum Ermitteln, ob ein Dokument Makros enthält. Überprüft wird nicht die
tatsächliche Existenz eines Makros, sondern das blosse Vorhandensein des VBA-Projektes.
Auch wenn das VBA-Projekt keinerlei Programmcode enthält, gibt HasMacros Wahr/True
zurück, weil die Projektstruktur vorhanden ist und somit VBA-Code aufnehmen könnte. In
Excel-Arbeitsmappen ist die Projektstruktur in einem Storage mit der Bezeichnung
"_VBA_PROJECT_CUR" gespeichert (bei Excel 5.0/95-Mappen im Storage
"_VBA_PROJECT"). HasMacros prüft lediglich, ob dieser Storage
existiert. Wenn also HasMacros die Existenz von Makros meldet, so bedeutet dies
nicht zwingend, dass tatsächlich Makros in Form von ausführbarem VBA-Code vorhanden
sind.
Weitere Informationen |
|
.Beschreibung
Mit der VBA-Anweisung Kill lässt sich eine einzelne
Datei löschen. Die Datei wird dabei unwiederherstellbar gelöscht, d.h. nicht in den
Papierkorb von Windows verschoben.
Nebenbei erwähnt können mit Kill auch mehrere Dateien auf einen Schlag gelöscht werden. Siehe dazu das unter "Verwandte Codebeispiele" angegebene Beispiel.
.VBA-Code #1
Public Sub DeleteFile1()
Kill "C:\Daten\MeineMappe.xls"
End Sub
.Hinweis
Da beim Versuch, eine nicht vorhandene Datei zu
löschen, der Laufzeitfehler 53 "Datei nicht gefunden" auftritt, sollte dieser
Laufzeitfehler mit einer Fehlerbehandlungsroutine abgefangen werden. Wird versucht, eine
momentan gesperrte Datei zu löschen, so erscheint der Laufzeitfehler 70 "Zugriff
verweigert". Der durch eine Fehlerbehandlung erweiterte VBA-Code sieht so aus:
.VBA-Code #2
Public Sub DeleteFile2()
On Error Resume Next
Kill "C:\Daten\MeineMappe.xls"
If Err.Number = 53 Then
MsgBox "Die Datei ist nicht vorhanden."
ElseIf Err.Number = 70 Then
MsgBox "Die Datei ist gesperrt."
ElseIf Err.Number <> 0 Then
MsgBox "Ein Fehler ist aufgetreten."
End If
On Error Goto 0
End Sub
Grundsätzlich sollte man bei Dateioperationen alle potenziellen Laufzeitfehler abfangen und behandeln. Angenommen, der im obigen Beispiel angegebene Dateipfad "C:\Daten\MeineMappe.xls" würde auf ein Laufwerk verweisen, welches nicht verfügbar ist (z.B. ein nicht verbundenes Netzlaufwerk oder eine defekte Festplatte), so würde der Laufzeitfehler 68 "Gerät nicht verfügbar" erscheinen.
Detaillierte Informationen mit Empfehlungen bezüglich korrekter Behandlung von Datei- und Pfad-Laufzeitfehlern erhalten Sie hier:
Weitere Informationen |
|
Verwandte Codebeispiele |
|
Datei über den Löschen-Dialog löschen
.Beschreibung
Kaum ein Excel-Programmierer weiss, dass Microsoft Excel ein
spezielles Dialogfenster zum Löschen von Dateien besitzt. Es gleicht dem
Öffnen-Dialogfenster, ausser dass es mit "Löschen" betitelt und anstelle der
Öffnen-Schaltfläche eine mit "Löschen" beschriftete Schaltfläche zu sehen
ist.
.VBA-Code #1
Public Sub DeleteFileWithDialog()
Application.Dialogs(xlDialogFileDelete).Show
End Sub
.VBA-Code #2
Public Sub DeleteFileWithDialog2()
Dim bolReturnCode As Boolean
bolReturnCode = Application.Dialogs(xlDialogFileDelete).Show
End Sub
.Hinweis
Sobald eine Datei über die Löschen-Schaltfläche des
Dialogfensters gelöscht wird, erscheint die Rückfragemeldung, ob die Datei wirklich
gelöscht werden soll. Damit diese Rückfrage nicht angezeigt wird, werden Sie als
versierter VBA-Programmierer vermutlich versuchen, mit der Codezeile
"Application.DisplayAlerts = False" die Meldung auszuschalten. Sie können die DisplayAlerts-Codezeile
ruhig weglassen, denn sie funktioniert beim Löschen-Dialog nicht wie erwartet. Die
Löschen-Rückfrage wird zwar korrekt unterdrückt; die selektierte Datei jedoch wird bei
Anklicken der Löschen-Schaltfläche nicht gelöscht. Mit anderen Worten: Es passiert
nichts.
Weitere Informationen |
|
|
Verwandte Codebeispiele |
|
.Beschreibung
Kaum ein Excel-Programmierer weiss, dass Microsoft Excel ein
integriertes Dialogfenster zum Löschen von Dateien besitzt. Es kann mit VBA über die Dialogs-Auflistung
aufgerufen werden.
» Das Beispiel #1 öffnet den Löschen-Dialog, wobei das aktuelle Arbeitsverzeichnis (Current Directory; CurDir) angezeigt und der Dateityp-Filter auf "Alle Dateien (*.*)" eingestellt werden.
» Das Beispiel #2 öffnet den Löschen-Dialog, wobei das aktuelle Arbeitsverzeichnis (Current Directory; CurDir) angezeigt, der Dateiname "MeineMappe.xls" vorgeblendet und der Dateityp-Filter auf "Tabellen (*.xls)" eingestellt werden.
» Das Beispiel #3 öffnet den Löschen-Dialog, wobei das Verzeichnis "C:\Daten" angezeigt, der Dateiname "MeineMappe.xls" vorgeblendet und der Dateityp-Filter auf "Tabellen (*.xls)" eingestellt werden.
» Das Beispiel #4 öffnet den Löschen-Dialog, wobei das Verzeichnis "C:\Daten" angezeigt und der Dateityp-Filter auf "Alle Dateien (*.*)" eingestellt werden.
» Das Beispiel #5 öffnet den Löschen-Dialog, wobei das Verzeichnis "C:\Daten" angezeigt, der Dateityp-Filter auf "Tabellen (*.xls)" eingestellt und alle mit der Zeichenfolge "Meine" beginnenden xls-Dateien angezeigt werden.
» Das Beispiel #6 öffnet den Löschen-Dialog, wobei das Verzeichnis "C:\Daten" angezeigt, der Dateityp-Filter auf "Alle Dateien (*.*)" eingestellt und alle mit der Zeichenfolge "Mappe" endenden csv-Dateien angezeigt werden. Excel stellt automatisch den Dateityp "Alle Dateien (*.*)" und nicht "CSV (*.csv)" ein, da es im Löschen-Dialog für csv-Dateien keinen separaten Eintrag in der Dateityp-Auswahlliste gibt.
.VBA-Code #1
Sub ShowFileDeleteDialog1()
Application.Dialogs(xlDialogFileDelete).Show
End Sub
.VBA-Code #2
Sub ShowFileDeleteDialog2()
Application.Dialogs(xlDialogFileDelete).Show "MeineMappe.xls"
End Sub
.VBA-Code #3
Sub ShowFileDeleteDialog3()
Application.Dialogs(xlDialogFileDelete).Show
"C:\Daten\MeineMappe.xls"
End Sub
.VBA-Code #4
Sub ShowFileDeleteDialog4()
Application.Dialogs(xlDialogFileDelete).Show "C:\Daten"
End Sub
.VBA-Code #5
Sub ShowFileDeleteDialog5()
Application.Dialogs(xlDialogFileDelete).Show "C:\Daten\Meine*.xls"
End Sub
.VBA-Code #6
Sub ShowFileDeleteDialog6()
Application.Dialogs(xlDialogFileDelete).Show "C:\Daten\*Mappe.csv"
End Sub
.Hinweis
Sobald eine Datei über die Löschen-Schaltfläche des
Dialogfensters gelöscht wird, erscheint die Rückfragemeldung, ob die Datei wirklich
gelöscht werden soll. Damit diese Rückfrage nicht angezeigt wird, werden Sie als
versierter VBA-Programmierer vermutlich versuchen, mit der Codezeile
"Application.DisplayAlerts = False" die Meldung auszuschalten. Sie können die DisplayAlerts-Codezeile
ruhig weglassen, denn sie funktioniert beim Löschen-Dialog nicht wie erwartet. Die
Löschen-Rückfrage wird zwar korrekt unterdrückt; die selektierte Datei jedoch wird bei
Anklicken der Löschen-Schaltfläche nicht gelöscht. Mit anderen Worten: Es passiert
nichts.
Weitere Informationen |
|
|
Verwandte Codebeispiele |
|
Datei in den Papierkorb verschieben
.Beschreibung
Mit der API-Funktion SHFileOperation kann man eine
beliebige Datei in den Windows-Papierkorb verschieben. Auf diese Weise wird die Datei zwar
gelöscht, ist aber im Papierkorb noch vorhanden und kann somit bei Bedarf
wiederhergestellt werden.
Das folgende Codebeispiel zeigt eine Musterlösung. Der Zugriff auf die SHFileOperation-API-Funktion wurde in der Funktion MoveFileToRecycleBin gekapselt und verschiedene Kontrollabfragen eingebaut.
.VBA-Code
'Deklarationsbereich
Public Type SHFILEOPSTRUCT
hwnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAnyOperationsAborted As Long
hNameMappings As Long
lpszProgressTitle As Long
End Type
Public Declare Function SHFileOperation Lib "shell32.dll" Alias _
"SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
Public Const FO_DELETE = &H3
Public Const FOF_ALLOWUNDO = &H40
Public Const FOF_NOCONFIRMATION = &H10
'Codemodul
Public Function MoveFileToRecycleBin(ByVal Filename As
String, Optional Confirm As Boolean = False) As Long
Dim SHop As SHFILEOPSTRUCT
If Len(Filename) < 4 Then
MoveFileToRecycleBin = -3
Exit Function
ElseIf InStr(Filename, "*") Or InStr(Filename, "?") Then
MoveFileToRecycleBin = -2
Exit Function
ElseIf Dir(Filename, vbHidden) = "" Then
MoveFileToRecycleBin = -1
Exit Function
End If
With SHop
.wFunc = FO_DELETE
.pFrom = Filename
If Confirm Then
.fFlags = FOF_ALLOWUNDO 'Rückfrage
"Soll wirklich in den Papierkorb verschoben werden?" einblenden
Else
.fFlags = FOF_ALLOWUNDO Or FOF_NOCONFIRMATION 'Keine Rückfrage einblenden
End If
End With
MoveFileToRecycleBin = SHFileOperation(SHop)
End Function
'*** Aufruf ***
Sub TestCall()
Dim lngRC As Long
lngRC = MoveFileToRecycleBin("C:\Daten\EineMappe.xls", True)
If lngRC = 0 Then
MsgBox "Die Datei wurde in den Papierkorb verschoben (ausser
Benutzer hat Rückfrage verneint).", vbInformation
ElseIf lngRC = -1 Then
MsgBox "Die Datei ist nicht vorhanden!", vbExclamation
ElseIf lngRC = -2 Then
MsgBox "Die Platzhalterzeichen * und ? sind nicht erlaubt!",
vbExclamation
ElseIf lngRC = -3 Then
MsgBox "Der Dateiname ist zu kurz!", vbExclamation
ElseIf lngRC = 5 Then
MsgBox "Zugriffsfehler aufgetreten! Wahrscheinlich keine
Löschberechtigung vorhanden.", vbExclamation
ElseIf lngRC = 32 Then
MsgBox "Zugriffsfehler aufgetreten! Wahrscheinlich ist die Datei
gesperrt.", vbExclamation
Else
MsgBox "Fehler aufgetreten!", vbExclamation
End If
End Sub
ACHTUNG!
Beachten Sie unbedingt, dass Sie der Variable SHop.pFrom einen gültigen
Pfad-/Dateinamen zuweisen, bevor Sie die Datei verschieben (was mit der Codezeile
"SHFileOperation SHop" erfolgt). Kontrollieren Sie in Ihrem VBA-Programmcode
besser gleich doppelt, ob tatsächlich eine gültige, existierende Datei angegeben ist.
Die Folgen eines falschen Dateinamens können absolut fatal sein.
Anmerkung des Autors
Ich spreche hier aus eigener Erfahrung. Ich verwendete in einem Programm
sinngemäss die Anweisung
strFile = strPath & "\" & strFileToDelete
zum Festlegen der zu löschenden Datei. Da beim Aufruf der Prozedur MoveFileToRecycleBin die beiden obigen Variablen strPath und strFileToDelete irrtümlich leer waren, wurde der Variable strFile lediglich das Backslash-Zeichen ('\') zugewiesen. Wer die Möglichkeiten der Shell bzw. Befehlszeile kennt, der weiss, dass der Backslash gleich Stammverzeichnis der Festplatte bedeutet. Dies führte schliesslich zu einer Katastrophe: Es wurden alle Dateien und Ordner der gesamten Festplatte gelöscht!
.Hinweis
Weder die Kill-Anweisung von VBA noch die DeleteFile-Methode
aus der FileSystemObject-Objektbibliothek kann eine Datei in den Papierkorb verschieben.
Beide löschen die Datei sofort und unwiderruflich.
Verwandte Codebeispiele |
|
|
|
Datei der aktiven Arbeitsmappe löschen
.Beschreibung
Die Datei der aktiven Arbeitsmappe kann normalerweise gar
nicht gelöscht werden, da sie geöffnet und somit gesperrt ist. Dies gilt jedoch nur,
wenn die aktive Mappe zur Bearbeitung im Schreib-Lese-Zugriffsmodus (auch Exklusivmodus
genannt) geöffnet wurde, was normalerweise der Fall ist. Eine Arbeitsmappe, die
schreibgeschützt geöffnet wurde (read-only) oder die für die gemeinsame Bearbeitung
freigegeben wurde, kann dagegen ohne weiteres gelöscht werden, da in diesem Fall die
xls-Datei nicht gesperrt ist. Damit eine "normal" geöffnete Arbeitsmappe
gelöscht werden kann, muss zuerst der Zugriffsmodus für die Arbeitsmappendatei auf
"Schreibgeschützt" geändert werden.
Das VBA-Beispiel löscht die Datei der aktiven Arbeitsmappe und schliesst anschliessend die Mappe.
.Autor
Hans W. Herber, www.herber.de
(Anpassungen durch Philipp von Wartburg)
.VBA-Code
Public Sub KillActiveWorkbookFile()
ActiveWorkbook.ChangeFileAccess xlReadOnly
Kill ActiveWorkbook.FullName
ThisWorkbook.Close False
End Sub
.Hinweis
Bitte beachten Sie, dass die aktive Arbeitsmappe sofort
und endgültig gelöscht wird; sowohl von der Festplatte als auch aus dem Arbeitsspeicher.
Weitere Informationen |
|
Prüfen, ob ein Datenträger in Laufwerk A: eingelegt ist
.Beschreibung
Mit der nachfolgenden Prozedur kann man überprüfen, ob sich
eine Diskette im Laufwerk A: befindet. Zusätzlich wird geprüft, ob sich auf der
eingelegten Diskette mindestens eine Datei oder ein Ordner befindet oder ob die Diskette
leer ist.
Anhand den drei Konstanten vbNormal, vbHidden und vbDirectory, die durch Verwendung des Or-Operators zu einer so genannten logischen Disjunktion kombiniert werden, können sowohl Dateien als auch Ordner, die auch versteckt sein dürfen, erkannt werden.
.VBA-Code
Public Sub IsDiskAvailable()
Dim strFileOrFolder As String
On Error GoTo ErrorHandler
strFileOrFolder = Dir("A:", vbNormal Or vbHidden Or vbDirectory)
If strFileOrFolder <> "" Then
MsgBox "Datenträger ist bereit. Er ist leer."
ElseIf strFileOrFolder = "" Then
MsgBox "Datenträger ist bereit. Er ist nicht leer."
End If
Exit Sub
ErrorHandler:
If Err.Number = 71 Then
MsgBox "Datenträger ist nicht bereit."
Else
MsgBox "Fehler " & Err.Number & "
aufgetreten!"
End If
End Sub
Verwandte Codebeispiele |
|
Weitere Informationen |
|
|
Prüfen, ob das Laufwerk A: bereit ist
.Beschreibung
Mit Hilfe der IsReady-Eigenschaft des Drive-Objektes
aus der FileSystemObject-Bibliothek kann man überprüfen, ob ein Laufwerk bereit
ist. Im nachstehenden Codebeispiel wird das Disketten-Laufwerk A: überprüft. Der Vorteil
bei der Verwendung von IsReady ist, dass, im Gegensatz zur VBA-Funktion Dir,
kein Fehler auftritt, wenn keine Diskette eingelegt ist. Bei
"Dir("A:")" würde der Laufzeitfehler 71 "Datenträger nicht
bereit" erscheinen.
Der Programmcode funktioniert übrigens auch mit anderen Geräten, beispielsweise mit einem CD ROM-Laufwerk.
.VBA-Code
Public Sub IsDiskDriveReady()
If
CreateObject("Scripting.FileSystemObject").GetDrive("A:").IsReady =
True Then
MsgBox "Laufwerk A: ist bereit."
Else
MsgBox "Laufwerk A: ist nicht bereit."
End If
End Sub
Verwandte Codebeispiele |
|
Weitere Informationen |
|
.Beschreibung
Diese Beispiel zeigen, wie man ein Netzlaufwerk bzw. eine
freigegebene Remote-Ressource verbinden kann (Laufwerk mappen). Damit der Programmcode
ausgeführt werden kann, muss im VBA-Projekt ein Verweis auf die Windows Script Host-Bibliothek
gesetzt werden.
» Das Codebeispiel #1 verbindet den Ordner SharedFolder des Servers DataServer als neues Laufwerk mit dem Buchstaben "H:".
» Das Beispiel #2 stellt ebenfalls die Verbindung her, wobei hier kein Laufwerkbuchstabe zugeordnet wird.
» Das dritte Beispiel mappt die Netzwerk-Ressource als Laufwerk "H:" und verwendet für die Anmeldung mit der Ressource den Benutzernamen "<Username>" und das Passwort "<Password>".
» Das Codebeispiel #4 verbindet die Netzwerk-Ressource via Automation mit Microsoft Word.
» Das Codebeispiel #5 verbindet die Netzwerk-Ressource via Automation mit Microsoft Word, wobei hier ein Passwort verlangt wird.
.VBA-Code #1
Sub MapNetworkDrive1()
Dim wshNetwork As New IWshRuntimeLibrary.IWshNetwork_Class
wshNetwork.MapNetworkDrive "H:",
"\\DataServer\SharedFolder"
Set wshNetwork = Nothing
End Sub
.VBA-Code #2
Sub MapNetworkDrive2()
Dim wshNetwork As New IWshRuntimeLibrary.IWshNetwork_Class
wshNetwork.MapNetworkDrive "\\DataServer\SharedFolder"
Set wshNetwork = Nothing
End Sub
.VBA-Code #3
Sub MapNetworkDrive3()
Dim wshNetwork As New IWshRuntimeLibrary.IWshNetwork_Class
wshNetwork.MapNetworkDrive "H:",
"\\DataServer\SharedFolder", , "<Username>",
"<Password>"
Set wshNetwork = Nothing
End Sub
.VBA-Code #4
Sub MapNetworkDrive4()
Dim objWord As Object
Set objWord = CreateObject("Word.Application")
On Error Resume Next
objWord.System.Connect "\\Server\Freigabe"
If Err.Number = 5688 Then
MsgBox "Die Netzwerkverbindung konnte nicht hergestellt
werden!", vbExclamation
Err.Clear
End If
objWord.Quit
Set objWord = Nothing
End Sub
.VBA-Code #5
Sub MapNetworkDrive5()
Dim objWord As Object
Set objWord = CreateObject("Word.Application")
On Error Resume Next
objWord.System.Connect "\\Server\Freigabe", 1, "<Password>"
If Err.Number = 5688 Then
MsgBox "Die Netzwerkverbindung konnte nicht hergestellt
werden!", vbExclamation
Err.Clear
End If
objWord.Quit
Set objWord = Nothing
End Sub
Weitere Informationen |
|
.Beschreibung
Mit der hier vorgestellten Prozedur wird ein Netzlaufwerk bzw.
die Verbindung mit einer Remote-Ressource getrennt. Damit das Beispiel ausgeführt werden
kann, muss im VBA-Projekt ein Verweis auf die Windows Script Host-Bibliothek
gesetzt werden.
» Im ersten Beispiel die dem Laufwerkbuchstaben "H:" zugeordnete Netzlaufwerk-Verbindung getrennt.
» Das Beispiel #2 trennt die Verbindung zur Remote-Ressource "\\DataServer\SharedFolder", welcher kein Laufwerkbuchstabe zugewiesen wurde.
.VBA-Code #1
Sub RemoveNetworkDrive1()
Dim wshNetwork As New IWshRuntimeLibrary.IWshNetwork_Class
wshNetwork.RemoveNetworkDrive "H:"
Set wshNetwork = Nothing
End Sub
.VBA-Code #2
Sub RemoveNetworkDrive2()
Dim wshNetwork As New IWshRuntimeLibrary.IWshNetwork_Class
wshNetwork.RemoveNetworkDrive "\\DataServer\SharedFolder"
Set wshNetwork = Nothing
End Sub
Weitere Informationen |
|
Textdatei in Excel öffnen und als Arbeitsmappe speichern
.Beschreibung
Hier wird gezeigt, wie eine Textdatei in Microsoft Excel
geöffnet und anschliessend als Arbeitsmappe (xls-Dateiformat) gespeichert wird. Das
Beispiel verwendet Office Automation; der Programmcode kann somit in einem beliebigen
Microsoft Office-Programm wie zum Beispiel Word oder PowerPoint ausgeführt werden
(Microsoft Excel muss jedoch installiert sein, da sonst die Objekterstellung mit CreateObject
fehlschlägt).
.VBA-Code
Sub ConvertTextfileToWorkbook()
'Neue Instanz von Microsoft Excel anlegen
Dim objExcel As Object
Dim objBook As Object
Set objExcel = CreateObject("Excel.Application")
'Textdatei öffnen
Set objBook =
objExcel.Workbooks.Open("C:\Daten\EineTextdatei.txt")
'Speichern als Arbeitsmappe
objBook.SaveAs "C:\Daten\EineMappe.xls", -4143
'Excel-Instanz beenden
objExcel.Quit
Set objBook = Nothing
Set objExcel = Nothing
End Sub
Weitere Informationen |
|
|
|
.Beschreibung
Textdateien können mit Excel-VBA genau gleich wie
gewöhnliche Arbeitsmappen (xls-Dateiformat) geöffnet werden, nämlich mit der Open-Methode
des Workbooks-Auflistungsobjektes. Microsoft Excel nimmt die Konvertierung des
Dateiinhaltes automatisch vor. Alternativ zu Open kann eine Textdatei auch mit
der OpenText-Methode geöffnet werden. OpenText ist eigentlich die
'bessere' Lösung, da diese Methode speziell für Textdateien vorgesehen ist. Leider
besitzt sie einen Nachteil gegenüber der Open-Methode (siehe Hinweis weiter
unten).
.VBA-Code #1
Sub OpenTextFile1()
Workbooks.Open "C:\Daten\EineTextdatei.txt"
End Sub
.VBA-Code #2
Sub OpenTextFile2()
Workbooks.OpenText "C:\Daten\EineTextdatei.txt"
End Sub
.Hinweis
Obwohl in den meisten Fällen sowohl Open als
auch OpenText gleichermassen zum erwarteten Ergebnis führen, besitzen die beiden
Methoden einen wichtigen Unterschied:
Open ist eine Funktion, d.h. es wird eine Referenz auf ein Workbook-Objekt zurückgegeben. OpenText dagegen ist eine Prozedur und kann folgedessen keine Objektreferenz zurückgeben. Dieser Unterschied ist von Bedeutung - und ein Nachteil, wenn Sie mit Objektvariablen arbeiten. Diese Codezeile funktioniert problemlos und erstellt eine Objektvariable:
Set wkbWorkbook = Workbooks.Open("C:\Daten\EineTextdatei.txt")
Diese Codezeile dagegen funktioniert nicht, da OpenText wie erwähnt keine Objektreferenz liefert:
Set wkbWorkbook = Workbooks.OpenText("C:\Daten\EineTextdatei.txt")
Wenn Sie auf OpenText angewiesen sind, so müssen Sie diese Umgehungslösung verwenden:
Workbooks.OpenText
"C:\Daten\EineTextdatei.txt"
Set wkbWorkbook = ActiveWorkbook
Bei der Umgehungslösung müssen Sie unbedingt allfällige Laufzeitfehler abfangen und korrekt behandeln. Falls nämlich OpenText fehlschlägt (z.B. weil die Textdatei nicht existiert), wird mit der Set-Anweisung trotzdem eine Referenz auf die aktive Arbeitsmappe gesetzt. Und dies ist wohlgemerkt nicht die Datei, die zuvor mit OpenText geöffnet werden sollte.
TODO...
Sub OpenText(Filename As String, [Origin], [StartRow], [DataType], [TextQualifier As XlTextQualifier = xlTextQualifierDoubleQuote], [ConsecutiveDelimiter], [Tab], [Semicolon], [Comma], [Space], [Other], [OtherChar], [FieldInfo], [TextVisualLayout])
XlTextQualifier
xlTextQualifierDoubleQuote
xlTextQualifierNone
xlTextQualifierSingleQuote
Beachten Sie unbedingt, dass die OpenText-Methode von Excel 2000 gegenüber Excel 97 geändert hat. Die OpenText-Methode von Excel 2002 hat sich gegenüber Excel 2000 ebenfalls geändert.
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
Text an Drucker anstelle an Datei senden (Speichern in Druckerdatei)
.Beschreibung
Mit einem kleinen Trick können Sie beliebigen Text direkt in
eine Art Druckerdatei statt in eine gewöhnliche (Text-)Datei speichern. Dazu muss
anstelle eines Dateinamens bei der Open-Anweisung lediglich das Schlüsselwort
"PRN" angegeben werden, wodurch der Standard-Drucker der Arbeitsstation
verwendet wird.
.VBA-Code
Sub WriteToPrinter()
Open "PRN" For Output As #1
Print #1, "Hallo Drucker!"
Close #1
End Sub
.Hinweis
Beachten Sie, dass bei dieser "Speicherung"
der Text an den Drucker gesendet wird und ohne dass der Drucker ein Blatt ausgibt. Damit
Sie ein mit dem Text bedrucktes Blatt erhalten, müssen Sie bei Ihrem Drucker auf die
"Vorschub"-Taste (englisch 'Form Feed') drücken. Je nach Typ und Modell des
Druckers kann die Taste unterschiedlich beschriftet sein.
Weitere Informationen |
|
.Beschreibung
Mit den Möglichkeiten des Windows Script Host (WSH)
lässt sich sehr einfach eine Datei-Verknüpfung (Dateinamenerweiterung 'lnk') anlegen.
Dieses Beispiel zeigt exemplarisch, wie eine Verknüpfung mit einer Excel-Arbeitsmappe (im
VBA-Codebeispiel "DemoMappe.xls") erstellt wird. Die Verknüpfung wird im Ordner
"C:\Excel" angelegt und verwendet als Arbeitsverzeichnis "C:\Windows".
Der Dateiname der Verknüpfung lautet im Beispiel "Link zu DemoMappe.lnk", wobei
Sie auch einen beliebigen anderen Namen wählen können.
Bitte beachten Sie den Hinweis bezüglich Objektbibliothek-Verweis am Ende des Codebeispiels.
.VBA-Code
Sub CreateFileShortcut()
Dim objWSHShell As New IWshRuntimeLibrary.IWshShell_Class
Dim objWSHShortcut As IWshRuntimeLibrary.IWshShortcut_Class
Set objWSHShortcut = objWSHShell.CreateShortcut("C:\Excel\Link zu
DemoMappe.lnk")
With objWSHShortcut
.TargetPath = "D:\Daten\DemoMappe.xls"
.Description = "Dies ist eine neue Verknüpfung"
.WorkingDirectory = "C:\Windows"
.WindowStyle = 1 '1 = normale
Fenstergrösse
.Save
End With
Set objWSHShortcut = Nothing
Set objWSHShell = Nothing
End Sub
.Hinweis
Bitte beachten Sie, dass für die Ausführung des
obigen Codes ein Verweis auf die Bibliothek "Windows Script Host Object Model (Ver
1.0)" gesetzt werden muss (nicht zu verwechseln mit der Bibliothek "Microsoft
Scripting Runtime", Datei scrrun.dll). Wenn die Bibliothek nicht in der Liste
"Verfügbare Verweise" aufgeführt ist, können Sie mit der Durchsuchen-Schaltfläche
die benötigte Datei einbinden; sie heisst WSHOM.ocx und sollte in einem
Windows-Verzeichnis aufzuspüren sein (d.h. Windows, Windows\System oder
Windows\System32).
Wenn Sie dem VBA-Projekt keinen Verweis hinzufügen möchten, können Sie als Alternative die Variante "Late Binding" verwenden. Ersetzen Sie dazu die beiden Codezeilen
Dim objWSHShell As New
IWshRuntimeLibrary.IWshShell_Class
Dim objWSHShortcut As IWshRuntimeLibrary.IWshShortcut_Class
durch diese drei Zeilen:
Dim objWSHShell As Object
Dim objWSHShortcut As Object
Set objWSHShell = CreateObject("WScript.Shell")
Die restlichen Programmzeilen müssen nicht angepasst werden.
Weitere Informationen |
|
.Beschreibung
Mit der Objektbibliothek Windows Script Host (WSH)
kann man nebst Datei-Verknüpfungen auch Ordner-Verknüpfungen erstellen. In diesem
Codebeispiel wird eine Verknüpfung auf den Ordner "C:\Daten" mit dem Namen
"C:\Excel\Ordner-Verknüpfung.lnk" angelegt.
Bitte beachten Sie den Hinweis bezüglich Objektbibliothek-Verweis am Ende dieses Codebeispiels.
.VBA-Code
Sub CreateFolderShortcut()
Dim objWSHShell As New IWshRuntimeLibrary.IWshShell_Class
Dim objWSHShortcut As IWshRuntimeLibrary.IWshShortcut_Class
Set objWSHShortcut =
objWSHShell.CreateShortcut("C:\Excel\Ordner-Verknüpfung.lnk")
With objWSHShortcut
.TargetPath = "C:\Daten"
.Description = "Dies ist eine Ordner-Verknüpfung"
.WorkingDirectory = ""
.WindowStyle = WshNormalFocus
.Save
End Witn
Set objWSHShortcut = Nothing
Set objWSHShell = Nothing
End Sub
.Hinweis
Bitte beachten Sie, dass im VBA-Projekt ein Verweis auf
die Bibliothek "Windows Script Host Object Model (Ver 1.0)" gesetzt werden muss
(nicht zu verwechseln mit der Bibliothek "Microsoft Scripting Runtime"). Wenn
die Bibliothek nicht in der Liste der Verweise aufgeführt ist, können Sie mit der Durchsuchen-Schaltfläche
die benötigte Datei einbinden; sie heisst "WSHOM.ocx" und sollte in einem
Windows-Verzeichnis aufzuspüren sein (z.B. Windows\System oder Windows\System32).
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
Fortlaufend nummerierte Mappenkopien im Temp-Verzeichnis von Windows anlegen
.Beschreibung
Vielleicht haben Sie schon mal eine Möglichkeit gesucht, wie
man von einer geöffneten Arbeitsmappe Sicherungsdateien im Temp-Verzeichnis von Windows
erstellen kann. Die Dateien sollen dabei als Dateiname eine fortlaufende Nummer verwenden.
Die erste erstellte Sicherungsdatei besitzt also den Namen "1.tmp", die nächste
Datei "2.tmp", dann "3.tmp" und so weiter.
Diese Aufgabestellung könnte man mit ein bisschen VBA-Code
so lösen:
1. Temp-Verzeichnis von Windows herausfinden
2. Dateiname (Nummer) der zuletzt gespeicherten tmp-Datei ermitteln
3. Nummer um 1 erhöhen
4. Datei mit der neuen Nummer im Temp-Verzeichnis speichern
Das Temp-Verzeichnis lässt sich beispielsweise anhand von Environ("Temp") einfach ermitteln. Schwierig wird es beim Dateinamen einer Sicherungsdatei. Seit der Speicherung der letzten Sicherungsdatei könnte ein anderes Programm eine tmp-Datei mit einer Zahl als Dateiname erstellt haben. Man muss also herausfinden, ob die gewünschte Zahl bereits vorkommt. Wenn dies der Fall ist, muss ermittelt werden, welche Zahl in der Zahlenreihe denn verfügbar ist. Problematisch wird es, wenn zwischen Festlegen der neuen Nummer und Speichern der neuen Sicherungsdatei ein anderes Programm eine tmp-Datei mit 'unserem' Dateinamen anlegt. Diese Situation muss unbedingt abgefangen und gelöst werden.
Zum Glück gibt es einen Trick, der das Schreiben des erforderlichen Programmcodes überflüssig macht: Bekanntlich kann man mit der SaveCopyAs-Methode des Workbook-Objektes eine Sicherungskopie einer Arbeitsmappe erstellen. Kaum bekannt ist, dass SaveCopyAs eine zur Lösung unserer Aufgabe äusserst nützliche Eigenschaft aufweist.
Das Argument FileName der SaveCopyAs-Methode ist gemäss der im Excel-Objektmodell beschriebenen Parameter-Definition ein optionales Argument; laut der Online-Hilfe/Excel VBA-Referenz dagegen zwingend erforderlich. Wird das Argument weggelassen, erscheint tatsächlich der Laufzeitfehler 1004 "Anwendungs- oder objektdefinierter Fehler". Was jedoch nirgends steht, ist, dass das Argument auch leer sein darf.
Bei Angabe eines leeren Dateinamens für das FileName-Argument (z.B. 'FileName:=""') oder bei Verwendung einer nicht initialisierten Variable (z.B. 'FileName:=varDummy') speichert Microsoft Excel die Arbeitsmappe im Temp-Verzeichnis von Windows und gibt dieser Datei automatisch einen Dateinamen, der aus einer fortlaufenden Nummer und der Dateinamenerweiterung ".tmp" zusammengesetzt ist. Die fortlaufende Nummer ist eine Zahl, die basierend auf den im Temp-Verzeichnis bereits vorhandenen tmp-Dateien ermittelt wird. Ist beispielsweise eine Datei mit dem Namen "3.tmp" bereits vorhanden, so erhält die nächste mit SaveCopyAs gespeicherte Arbeitsmappe den Dateinamen "4.tmp".
.VBA-Code
Sub CreateTempFile()
ActiveWorkbook.SaveCopyAs ""
End Sub
.Hinweis
Beim Speichern einer Mappe mittels SaveCopyAs
werden die Saved-Eigenschaft und der Dateiname der geöffneten Arbeitsmappe nicht
verändert.
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
|
Internet Explorer starten und Seite anzeigen
.Beschreibung
Mit einer einzigen Codezeile lässt sich der Internet Explorer
starten und eine beliebige Seite bzw. Datei anzeigen. Die Adresse der Seite kann als URL
(z.B. "www.xyz.com") oder als Pfad zur gewünschten HTML-Datei (z.B.
"C:\Daten\EineSeite.htm") angegeben werden.
» Das erste Codebeispiel zeigt die am häufigsten verwendete Lösungsvariante mit der FollowHyperlink-Methode.
» Im zweiten Beispiel wird die Webseite mit der Run-Methode des Shell-Objektes aus der Windows Script Host-Bibliothek geöffnet.
.VBA-Code #1
Sub OpenInternetExplorer1()
ActiveWorkbook.FollowHyperlink Address:="http://www.xyz.com",
NewWindow:=True
End Sub
.VBA-Code #2
Sub OpenInternetExplorer2()
CreateObject("WScript.Shell").Run
"http://www.xyz.com"
End Sub
.Hinweis
Geben Sie für das FollowHyperlink-Argument NewWindow
den Wert True an, da ansonsten die aktive Arbeitsmappe ausgeblendet wird.
Verwandte Codebeispiele |
|
|
|
Internet Explorer im Vollbildmodus starten und Seite anzeigen
.Beschreibung
Der Internet Explorer verfügt über einen so genannten
Kiosk-Modus, der unter anderem zum Ausführen des Webbrowsers im Vollbildmodus und ohne
Menü-/Symbol- und Statusleiste benutzt wird. Der Modus wird Kiosk genannt, weil der
Benutzer auf dem Bildschirm ausschliesslich den Inhalt der angezeigten Webseite sieht und
unter anderem kein Adressfeld für die Eingabe einer URL zur Verfügung steht. Also Dinge,
die bei Informationssystemen vorhanden sein müssen, welche eben beispielsweise in Kiosken
stehen.
Der Kiosk-Modus wird durch Angabe des Befehlszeilen-Parameters "-k" beim Starten des Internet Explorers aktiviert. Ist der Explorer einmal gestartet, kann der Modus nicht mehr deaktiviert werden. Sie können den Internet Explorer durch Drücken der Tastenkombination Alt+F4 beenden.
Das Codebeispiel verwendet die Run-Methode des Shell-Objektes aus der Windows Script Host-Bibliothek, damit die Datei "IExplore.exe" ohne Angabe des vollständigen Dateipfades gestartet werden kann. Bei der Shell-Funktion von VBA ist dies nicht möglich.
.VBA-Code
Sub OpenInternetExplorer()
CreateObject("WScript.Shell").Run "IExplore.exe -k"
End Sub
Verwandte Codebeispiele |
|
Weitere Informationen |
|
Login-Name des angemeldeten Benutzers abfragen
.Beschreibung
Der Login-Name des aktuell in Windows angemeldeten Benutzers
lässt sich mindestens auf zwei verschiedene Wege ermitteln. Wenn der Benutzer nicht
angemeldet ist oder kein Benutzerprofil verwendet wird, kann es sein, dass als Name nichts
oder lediglich zwei Punkte ("..") zurückgegeben werden (Anmerkung des Autors:
Beispielsweise gibt Windows ME zwei Punkte zurück). Beide Lösungsvorschläge
funktionieren übrigens gleich gut.
» Das erste Codebeispiel benötigt dazu lediglich eine einzige Codezeile und verwendet das Network-Objekt aus der Windows Script Host-Objektbibliothek.
» Das zweite Beispiel zeigt eine Lösungsvariante, welche die API-Funktion GetUserName benutzt.
.VBA-Code #1
Sub GetUserLoginName1()
MsgBox CreateObject("WScript.Network").UserName
End Sub
.VBA-Code #2
'Deklarationsbereich
Declare Function GetUserName Lib "advapi32.dll"
Alias "GetUserNameA" _
(ByVal lpBuffer As String, nSize As Long) As Long
'Codemodul
Sub GetUserLoginName2()
Dim strUsername As String
Dim lngLength As Long
Dim lngRetVal As Long
strUsername = Space$(255)
lngLength = 255
lngRetVal = GetUserName(strUsername, lngLength)
strUsername = Left(strUsername, lngLength - 1)
GetUserLoginName2 = strUsername
End Sub
.Hinweis
Bitte beachten Sie, dass auch dann ein Benutzername
zurückgegeben wird, wenn sich der Benutzer nicht unter Windows anmelden musste, jedoch
ein (allgemeines) Benutzerprofil verwendet wird.
Weitere Informationen |
|
.Beschreibung
Hier wird gezeigt, wie man Windows mittels VBA-Code beenden
kann. Vor dem Beenden wird der Benutzer gewöhnlich gefragt, ob Änderungen in den
Dokumenten der gerade laufenden Anwendungen vor dem Beenden gespeichert werden sollen.
» Codebeispiel #1: Mit der API-Funktion ExitWindowEx kann man Windows beenden, und zwar indem man für das erste Argument der Funktion die Zahl 1 angibt. Dieser Programmcode funktioniert in allen VBA-Programmen (egal ob Microsoft Excel, Word, PowerPoint oder dergleichen) und auch in VB-Programmen.
» Codebeispiel #2: Das Objektmodell von Microsoft Word enthält eine spezielle Methode namens ExitWindows zum Beenden von Windows. Der Programmcode dieses Codebeispiels funktioniert nur in einem VBA-Projekt von Microsoft Word.
» Codebeispiel #3: Man kann auch die ExitWindows-Methode von Microsoft Word-VBA in anderen Anwendungen wie beispielsweise Microsoft Excel benutzen. Dazu muss man Microsoft Word mittels Automation ferngesteuert werden. Diese Lösungsvariante funktioniert zwar grundsätzlich, sollte jedoch möglichst nicht zum Einsatz kommen. Das Problem ist, dass sich die Anwendung, in welcher der VBA-Code ausgeführt wird, nicht selber beenden kann. Fehlermeldungen wie Laufzeitfehler 7 "Nicht genügend Speicher" und Excel-Fehlermeldungen wie "Kann Microsoft Excel nicht beenden" können daher auftreten. Zudem kann die Systemmeldung "Anwendung reagiert nicht auf die Anforderung 'Task beenden'" erscheinen.
.VBA-Code #1
'Deklarationsbereich
Declare Function ExitWindowsEx Lib "user32"
(ByVal Flags As Long, _
ByVal Reserved As Long) As Long
'Codemodul
Sub QuitWindows1()
ExitWindowsEx 1, 0
End Sub
.VBA-Code #2
Sub QuitWindows2()
Application.Tasks.ExitWindows
End Sub
.VBA-Code #3
Sub QuitWindows3()
Dim objWord As Object
Set objWord = CreateObject("Word.Application")
objWord.Tasks.ExitWindows
objWord.Quit
Set objWord = Nothing
End Sub
Verwandte Codebeispiele |
|
.Beschreibung
Mit der API-Funktion ExitWindowEx kann man den
aktuellen Windows-Benutzer abmelden, indem für das erste Funktionsargument Flags
die Zahl 0 angeben. Bei Ausführen des Programmcodes werden nacheinander alle laufenden
Anwendungen beendet und zum Schluss der Benutzer in Windows abgemeldet. Gewöhnlich
erscheint dann das Benutzer-Anmeldefenster von Windows.
Bitte beachten Sie, dass andere Werte als 0 für Flags andere Auswirkungen besitzen, wie beispielsweise die Beendigung von Windows, den Neustart des Rechners oder das Ausschalten des Rechners. Wie das geht, erfahren Sie in den VBA-Codebeispielen unter "Verwandte Codebeispiele".
.VBA-Code
'Deklarationsbereich
Declare Function ExitWindowsEx Lib "user32"
(ByVal Flags As Long, _
ByVal Reserved As Long) As Long
'Codemodul
Sub LogoutWindowsUser()
ExitWindowsEx 0, 0
End Sub
Verwandte Codebeispiele |
|
.Beschreibung
Es gibt mehrere Möglichkeiten zum Ermitteln der eingesetzten
Windows-Version.
» Codebeispiel #1: Mit der Eigenschaft OperatingSystem des Application-Objektes von Microsoft Excel kann die eingesetzte Windows-Version abgefragt werden. Bei zum Beispiel einem Windows NT 4.0-System enthält die Eigenschaft die Zeichenfolge "Windows (32-bit) NT 4.00". Bei dieser Lösungsvariante wird somit der genaue Name der Windows-Version ("Windows (32-bit) NT") sowie die Versionsnummer ("4.00") ausgegeben.
» Codebeispiel #2: Als Alternative kann man auch die System-Umgebungsvariable "OS" abfragen, was allerdings unter Umständen nicht auf jedem Rechner einwandfrei funktionieren könnte, da "OS" nicht zwingend existieren muss, weil es keine Standard-Umgebungsvariable ist. Im Falle von Windows NT 4.0 wird die Zeichenfolge "Windows_NT" zurückgegeben. Bei dieser Variante wird folglich nur der Name des Betriebssystems ohne Versionsnummer ermittelt.
» Codebeispiel #3: Die im Prinzip sicherste und demzufolge beste Lösung verwendet die API-Funktion GetVersionEx. Diese liefert die genausten Informationen. Wenn man nur den Typ des Betriebssystems wissen möchte, genügt die Auswertung des Inhaltes der Variable dwPlatformId (vergl. Programmcode). Enthält diese den Wert 1, handelt es sich um ein Windows vom Typ "Windows 95". Bei 2 handelt es sich um ein Windows vom Typ "Windows NT".
.VBA-Code #1
Sub GetWindowsVersion1()
MsgBox "Windows-Version: " & Application.OperatingSystem
End Sub
.VBA-Code #2
Sub GetWindowsVersion2()
MsgBox "Windows-Version: " & Environ("OS")
End Sub
.VBA-Code #3
'Deklarationsbereich
Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _
(ByRef lpVersionInformation As OSVERSIONINFO) As Long
'Codemodul
Sub GetWindowsVersion3()
Dim myOS As OSVERSIONINFO
Dim lngResult As Long
Dim strVersion As String
myOS.dwOSVersionInfoSize = Len(myOS)
lngResult = GetVersionEx(myOS)
strVersion = myOS.dwMajorVersion & "." & myOS.dwMinorVersion
& "." & myOS.dwBuildNumber
If myOS.dwPlatformId = 0 Then
MsgBox "Windows " & strVersion
ElseIf myOS.dwPlatformId = 1 Then
MsgBox "Windows 95 " & strVersion
ElseIf myOS.dwPlatformId = 2 Then
MsgBox "Windows NT " & strVersion
Else
MsgBox "Windows " & strVersion
End If
End Sub
Verwandte Codebeispiele |
|
|
|
.Beschreibung
Dieses Codebeispiel ermittelt die Buildnummer der eingesetzten
Windowsversion. Bei zum Beispiel Windows NT 4 mit Service Pack 5 lautet sie 1381.
.VBA-Code
'Deklarationsbereich
Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _
(ByRef lpVersionInformation As OSVERSIONINFO) As Long
'Codemodul
Sub GetWindowsBuild()
Dim myOS As OSVERSIONINFO
Dim lngResult As Long
myOS.dwOSVersionInfoSize = Len(myOS)
lngResult = GetVersionEx(myOS)
MsgBox "Windows-Buildnummer: " & myOS.dwBuildNumber
End Sub
Verwandte Codebeispiele |
|
.Beschreibung
Das Windows-Verzeichnis wird am einfachsten mit der Environ-Funktion
von VBA abgefragt. Je nach verwendeter Windows-Version und installierter Software kann es
sein, dass die Umgebungsvariable "systemroot" nicht funktioniert. Die Variable
"windir" dagegen ist laut Microsoft auf jedem Windows-Rechner vorhanden sein.
.VBA-Code #1
'Deklarationsbereich
Declare Function GetWindowsDirectory Lib
"kernel32" Alias "GetWindowsDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long
Const gintMAX_SIZE% = 255
'Codemodul
Function GetWindowsFolder1() As String
Dim strBuffer As String
Dim intZeroPos As Integer
strBuffer = Space$(gintMAX_SIZE)
If GetWindowsDirectory(strBuffer, gintMAX_SIZE) > 0 Then
intZeroPos = InStr(strBuffer, Chr$(0))
If intZeroPos > 0 Then
GetWindowsFolder1 = Left$(strBuffer, intZeroPos - 1)
Else
GetWindowsFolder1 = strBuffer
End If
Else
GetWindowsFolder1 = ""
End If
End Function
'*** Aufruf ***
Sub TestCall()
MsgBox "Windows-Verzeichnis: " & GetWindowsFolder1()
End Sub
.VBA-Code #2
Sub GetWindowsFolder2()
MsgBox "Windows-Verzeichnis: " & Environ("windir")
End Sub
.VBA-Code #3
Sub GetWindowsFolder3()
MsgBox "Windows-Verzeichnis: " & Environ("systemroot")
End Sub
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
Windows-Systemverzeichnis ermitteln
.Beschreibung
Im Gegensatz zum Windows-Verzeichnis kann das
System-Verzeichnis von Windows nicht anhand einer Umgebungsvariable abgefragt werden, da
zu diesem Zweck schlicht keine existiert. Man kann zwar das Windows-Verzeichnis ermitteln
und dann prüfen, ob ein Unterverzeichnis namens "system32" existiert. Der
Ordner "system32" muss jedoch nicht zwingend vorhanden sein, da dieser bei teils
Windows-Versionen mit "system" benannt ist. Die sicherste und zudem kürzeste
Variante stellt auf jeden Fall die Benutzung des FileSystemObject-Objektes dar,
wie es im Codebeispiel 2 gezeigt wird.
.VBA-Code #1
'Deklarationsbereich
Declare Function GetSystemDirectory Lib
"kernel32" Alias "GetSystemDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long
Const gintMAX_SIZE% = 255
'Codemodul
Function GetWindowsSystemFolder1() As String
Dim strBuffer As String
Dim intZeroPos As Integer
strBuffer = Space$(gintMAX_SIZE)
If GetSystemDirectory(strBuffer, gintMAX_SIZE) > 0 Then
intZeroPos = InStr(strBuffer, Chr$(0))
If intZeroPos > 0 Then
GetWindowsSystemFolder1 = Left$(strBuffer, intZeroPos - 1)
Else
GetWindowsSystemFolder1 = strBuffer
End If
Else
GetWindowsSystemFolder1 = ""
End If
End Function
'*** Aufruf ***
Sub TestCall()
MsgBox "Windows-Systemverzeichnis: " & GetWindowsSystemFolder1()
End Sub
.VBA-Code #2
Sub GetWindowsSystemFolder2()
If Dir(Environ("windir") & "\system32", vbDirectory)
<> "" Then
MsgBox "Windows-Systemverzeichnis: " &
Environ("windir") & "\" & _
Dir(Environ("windir") &
"\system32", vbDirectory)
ElseIf Dir(Environ("windir") & "\system", vbDirectory)
<> "" Then
MsgBox "Windows-Systemverzeichnis: " &
Environ("windir") & "\" & _
Dir(Environ("windir") &
"\system", vbDirectory)
Else
MsgBox "Das Windows-Systemverzeichnis konnte nicht ermittelt
werden."
End If
End Sub
.VBA-Code #3
Sub GetWindowsSystemFolder3()
MsgBox "Windows-Systemverzeichnis: " &
CreateObject("Scripting.FileSystemObject").GetSpecialFolder(1)
End Sub
Verwandte Codebeispiele |
|
Weitere Informationen |
|
.Beschreibung
Das Windows-Laufwerk kann mit der VBA-Funktion Environ
ermittelt werden, indem die Umgebungsvariable "systemdrive" abgefragt wird. Da
je nach Windows-Version und installierter Software diese Variable nicht zwingend vorhanden
ist, kann man auch das Windows-Verzeichnis anhand der Variable "windir"
ermitteln ("windir" ist bei allen Windows-Versionen vorhanden) und die beiden
ersten Zeichen des zurückgegebenen Pfades als Laufwerkbuchstaben inklusive Doppelpunkt
(':') verwenden.
.VBA-Code #1
Sub GetWindowsDrive1()
MsgBox Environ("systemdrive")
End Sub
.VBA-Code #2
Sub GetWindowsDrive2()
MsgBox Left$(Environ("windir"), 2)
End Sub
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
Temp-Verzeichnis von Windows ermitteln
.Beschreibung
Die nachfolgenden Codebeispiele zeigen, wie das
Temp-Verzeichnis von Windows auf ganz unterschiedliche Wege herausgefunden werden kann.
» Das ersten Codebeispiel verwendet die Windows API-Funktion GetTempPath und ist verglichen mit den anderen Codebeispielen (insbesondere #2) eher kompliziert und aufwändig. Dafür wird das Temp-Verzeichnis zuverlässig ermittelt, und ausserdem wird keine zusätzliche Objektbibliothek benötigt.
» Das zweite Beispiel zeigt die einfachste und kürzeste Lösungsvariante und ist somit zu bevorzugen.
» Das Codebeispiel #3 benutzt das FileSystemObject-Objekt und dessen GetSpecialFolder-Methode.
» Auch das Codebeispiel #4 verwendet die GetSpecialFolder-Methode, jedoch ohne Objektvariable. Wenn Sie die FileSystemObject-Instanz innerhalb der Prozedur nicht noch für andere Zwecke benötigen, so können Sie diese kurze Variante ohne die Objektvariable benutzen.
» Im Beispiel #5 wird das Shell-Objekt aus der Windows Script Host-Objektbibliothek verwendet. Beachten Sie, dass die Variable strEnv als Datentyp Variant zu deklarieren ist.
» Das Codebeispiel #6 stellt eine vereinfachte Variante von Codebeispiel #5 dar.
.VBA-Code #1
'Deklarationsbereich
Declare Function GetTempPath Lib "kernel32"
Alias "GetTempPathA" (ByVal _
nBufferLength As Long, ByVal lpBuffer As String) As Long
'Codemodul
Function GetTempFolder1() As String
Dim lngPathLength As Long
Dim strTempDir As String
Dim lngBufferLength As Long
lngBufferLength = 260
strTempDir = Space(lngBufferLength)
lngPathLength = GetTempPath(lngBufferLength, strTempDir)
If Not lngPathLength = 0 Then
GetTempDir = Left(strTempDir, lngPathLength)
Else
GetTempDir = CurDir()
End If
End Function
'*** Aufruf *** Sub TestCall() MsgBox GetTempFolder1 End Sub
.VBA-Code #2
Sub GetTempFolder2()
MsgBox Environ("temp")
End Sub
.VBA-Code #3
Sub GetTempFolder3()
Dim fsoObject As Object
Set fsoObject = CreateObject("Scripting.FileSystemObject")
MsgBox fsoObject.GetSpecialFolder(2) '2 =
TemporaryFolder
Set fsoObject = Nothing
End Sub
.VBA-Code #4
Sub GetTempFolder4()
MsgBox
CreateObject("Scripting.FileSystemObject").GetSpecialFolder(2)
'2 = TemporaryFolder
End Sub
.VBA-Code #5
Sub GetTempFolder5()
Dim wshShell As Object
Dim strEnv As Variant
Set wshShell = CreateObject("WScript.Shell")
For Each strEnv In wshShell.Environment("PROCESS")
If UCase(Left$(strEnv, 5)) = "TEMP=" Then
MsgBox Mid$(strEnv, 6)
End If
Next
Set wshShell = Nothing
End Sub
.VBA-Code #6
Sub GetTempFolder6()
MsgBox
CreateObject("WScript.Shell").Environment("PROCESS")("temp")
End Sub
Weitere Informationen |
|
|
Hyperlink-Basis-Verzeichnis einer Arbeitsmappe ermitteln
.Beschreibung
Mit der so genannten Hyperlink-Basis kann man ein Verzeichnis
festlegen, welches als Basis für alle relativen Pfade von Hyperlinks der Arbeitsmappe
verwendet wird. In Microsoft Excel wird die Hyperlink-Basis im Eigenschaften-Dialogfenster
der Arbeitsmappe (Menü Datei/Eigenschaften) eingegeben bzw. abgefragt.
Diese Einstellung gilt pro Arbeitsmappe.
Bitte beachten Sie, dass die Hyperlink-Basis nicht unbedingt einen gültigen Pfad enthalten muss. Sie kann sogar etwas ganz anderes als einen Pfad enthalten, sprich einen beliebigen Begriff oder Text.
.VBA-Code
Sub GetHyperlinkBase()
MsgBox ActiveWorkbook.BuiltInDocumentProperties("Hyperlink base").Value
End Sub
.Hinweis
Anstelle des Bezeichners "Hyperlink base"
können bei BuiltInDocumentProperties auch die Zahl 29 angeben.
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
Prüfen, ob das Hyperlink-Basis-Verzeichnis einer Arbeitsmappe existiert
.Beschreibung
Die Hyperlink-Basis enthält gewöhnlich entweder nichts oder
dann ein Verzeichnis. Weil die Hyperlink-Basis jedoch über ein gewöhnliches Textfeld
eingegeben und ungeprüft als Zeichenfolge abgelegt wird, kann Sie auch einen nicht
existierenden Pfad oder sogar etwas vollig anderes enthalten, wie zum Beispiel irgend ein
Wort, welches gar kein Pfad darstellt. Es ist daher absolut notwendig, den Inhalt der
Hyperlink-Basis zu prüfen.
Übrigens darf die Hyperlink-Basis auch eine Internet-Adresse enthalten, d.h. die URL einer Webseite. Hierbei ist zu beachten, dass man die Adresse immer mit vorangestelltem "http://" angibt, also zum Beispiel "http://www.xlam.info". Anderenfalls erkennt Excel die Adresse nicht als gültige Internet-URL.
.VBA-Code
Sub CheckHyperlinkBase()
End Sub
.Hinweis
Anstelle des Bezeichners "Hyperlink base"
können bei BuiltInDocumentProperties auch die Zahl 29 angeben.
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
.Beschreibung
In diesem Beispiel wird die Version der aktuell verwendeten
Microsoft Excel-Sitzung abgefragt.
8.x für Excel 97, 9.x für Excel 2000, 10.x für Excel 2002/XP, 11.x für Excel 2003.
Die Version wird nicht als Zahl sondern Zeichenfolge zurückgegeben (z.B. "8.0a" bei Microsoft Excel mit original Service Pack 1).
Die Angabe sollte mit der Versionsinformation der Programmdatei Excel.exe übereinstimmen.
.VBA-Code #1
Sub GetExcelVersion1()
MsgBox Application.Version
End Sub
.VBA-Code #2
Sub GetExcelVersion2()
MsgBox Int(Val(Application.Version))
End Sub
Verwandte Codebeispiele |
|
|
|
.Beschreibung
Mit diesem Programmcode wird die Versionsnummer des
VBA-Editors der aktuellen Sitzung des Microsoft Office-Programmes abgefragt.
Funktioniert in allen Microsoft Office-Programmen (Excel, Word, PowerPoint etc.)
Gibt bei Microsoft Office 97 die Versionsnummer 5.00 zurück.
.VBA-Code
Sub GetVBEVersion()
MsgBox Application.VBE.Version
End Sub
Verwandte Codebeispiele |
|
|
|
CD-ROM Laufwerk öffnen und schliessen
.Beschreibung
Anhand der API-Funktion mciExecute aus der Windows
Multimedia-DLL "winmm.dll" kann ein CD-ROM Laufwerk äusserst einfach geöffnet
und geschlossen werden.
"Notwendiger Parameter fehlt"
"Unbekannter Befehlsparameter"
"Unbekannter Befehl"
Wenn beim Öffnen die Schublade bereits geöffnet bzw. beim Schliessen das CD-ROM Laufwerk bereits geschlossen ist, tritt kein Fehler auf.
Bitte beachten Sie, dass das jeweilige Kommando ("set cdaudio door [...]") ganz exakt angegeben werden muss. Bei einem Schreibfehler wird eine Fehlermeldung angezeigt. Die Gross-/Kleinschreibung spielt dagegen keine Rolle.
» Codebeispiel #1: Dieses Beispiel öffnet die Schublade des CD-ROM Laufwerkes.
» Codebeispiel #2: Dieses Beispiel schliesst die Schublade des CD-ROM Laufwerkes.
.Autor
Hans W. Herber, www.herber.de
.VBA-Code #1
'Deklarationsbereich
Declare Function mciExecute Lib "winmm.dll"
(ByVal lpstrCommand As String) As Long
'Codemodul
Sub OpenCDDrive()
mciExecute "set cdaudio door open"
End Sub
.VBA-Code #2
'Deklarationsbereich
Declare Function mciExecute Lib "winmm.dll"
(ByVal lpstrCommand As String) As Long
'Codemodul
Sub CloseCDDrive()
mciExecute "set cdaudio door closed"
End Sub
.Hinweis
Das Öffnen bzw. Schliessen des CD-ROM Laufwerkes
funktioniert mit obigem VBA-Code tadellos. Nicht bekannt ist allerdings, welches Laufwerk
angesprochen wird, falls mehrere CD-ROM Laufwerke vorhanden sind. Der Programmcode wurde
auf einem Computer mit einem einzigen CD-ROM Laufwerk getestet. Es ist jedoch anzunehmen,
dass dasjenige Laufwerk benutzt wird, welches als Musik-CD-Laufwerk in der Windows
Systemsteuerung unter Multimedia-Eigenschaften festgelegt ist.
Verwandte Codebeispiele |
|
Erstes CD-ROM Laufwerk ermitteln
.Beschreibung
Mit dem nachstehenden Programmcode können Sie herausfinden,
wie der Laufwerkbuchstabe des ersten CD-ROM Laufwerkes des Computers lautet.
.Autor
Hans W. Herber, www.herber.de
.VBA-Code
'Deklarationsbereich
Declare Function GetDriveType Lib "kernel32"
Alias "GetDriveTypeA" _
(ByVal nDrive As String) As Long
Declare Function GetLogicalDriveStrings Lib "kernel32" Alias
"GetLogicalDriveStringsA" _
(ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Const DRIVE_CDROM As Long = 5
'Codemodul
Function GetFirstCdRomDriveLetter() As String
Dim lDriveType As Long
Dim strDrive As String
Dim lStart As Long: lStart = 1
Dim strDrives As String
strDrives = Space(150)
Dim lRetVal As Long
lRetVal = GetLogicalDriveStrings(150, strDrives)
If lRetVal = 0 Then
GetFirstCdRomDriveLetter = vbNullString
Exit Function
End If
strDrive = Mid(strDrives, lStart, 3)
Do
lDriveType = GetDriveType(strDrive)
If lDriveType = DRIVE_CDROM Then
GetFirstCdRomDriveLetter = strDrive
Exit Function
End If
lStart = lStart + 4
strDrive = Mid(strDrives, lStart, 3)
Loop While (Mid(strDrives, lStart, 1) <> vbNullChar)
End Function
'*** Aufruf ***
Sub TestCall()
MsgBox GetFirstCdRomDriveLetter()
End Sub
Verwandte Codebeispiele |
|
Ordner mit Schreibschutz versehen
.Beschreibung
Dieses Codebeispiel zeigt, wie das Schreibgeschützt-Attribut
eines Ordners aktiviert wird. Vor der Aktivierung wird geprüft, ob der Ordner existiert
und ob das Schreibgeschützt-Attribut allenfalls bereits gesetzt ist.
.VBA-Code
Sub SetFolderReadOnlyAttribute()
If Dir("C:\Daten", vbDirectory) <> "" Then
If GetAttr("C:\Daten") Mod 2 = 0 Then
SetAttr "C:\Daten", vbReadOnly
End If
End If
End Sub
Verwandte Codebeispiele |
|
Arbeitsmappe öffnen und geschütztes VBA-Projekt entsperren
.Beschreibung
Wenn ein mit Kennwort geschütztes VBA-Projekt automatisch
unmittelbar nach dem Öffnen der Arbeitsmappe entsperrt werden soll, so gibt es nur einen
einzigen, nicht ganz einfachen Weg: Da im Excel- bzw. Excel-VBA-Objektmodell keine Methode
oder Eigenschaft zum Entsperren von VBA-Projekten existiert, muss der VBA-Editor mittels SendKeys
ferngesteuert und das Projektschutzkennwort eingegeben werden.
.VBA-Code
Private Sub Workbook_Open()
Dim bolBerechtigt As Boolean
'bolBerechtigt = [True|False]
If bolBerechtigt = True then
If Application.VBE.ActiveVBProject.Protection = 1 Then
Application.VBE.MainWindow.SetFocus
SendKeys
"passwort{enter}+{tab}{right}%a{enter}%q"
Application.VBE.CommandBars.FindControl(Id:=2578).Execute
End If
End If
End Sub
.Hinweis
Erläuterungen zum Programmcode:
- Mit der Variable bolBerechtigt wird gesteuert, ob ein Benutzer zur
Schutz-Deaktivierung berechtigt ist oder nicht.
- Mit der Abfrage "If [...].Protection = 1" wird verhindert, dass ein nicht
gesperrtes Projekt zu entsperren versucht wird.
- Für die Zeichenfolge "passwort" wird das Projekt-Kennwort eingesetzt.
- Die Id 2578 bei FindControl steht für den Menübefehl
"<Projekt>-Eigenschaften" (Menü "Extras" des VBA-Editors).
Der umgekehrte Weg, d.h. ein nicht gesperrtes Projekt beim
Öffnen der Arbeitsmappe zu schützen, ist nicht realisierbar. Die Aktivierung beim
Öffnen ist aus folgenden Gründen nicht möglich:
- Der Schutz wird erst angewendet, nachdem die Mappe gespeichert, geschlossen und neu
geöffnet wurde. Die Aktivierung des Kennwortschutzes ist somit ohne Wirkung, solange die
Mappe nicht erneut geöffnet wird.
- Die Aktivierung des Schutzes im Workbook_Open-Ereignis oder im Auto_Open-Makro
ist unsicher, da beide Prozeduren durch Drücken der Umschalt-Taste übergangen
werden können, d.h. der Schutz würde gar nicht angewendet.
- Das Objektmodell des VBA-Editors besitzt keine Methoden oder Eigenschaften für
Aktivieren/Deaktivieren des Schutzes oder Kennwort setzen. Lediglich der Status des
Schutzes kann abgefragt werden. Einzige Möglichkeit ist das Senden von Tastenfolgen mit SendKeys.
Wie oben gezeigt, ist es möglich, dass ein Projekt geschützt und der dadurch bereits aktivierte Schutz beim Öffnen deaktiviert wird. Der Vorteil: Wird beim Öffnen die Umschalt-Taste gedrückt, so bleibt der Kennwortschutz aktiviert. Das Übergehen des VBA-Codes im Workbook_Open-Ereignis mittels Umschalt-Taste führt somit nicht zur Offenlegung des Programmcodes. Unschön an dieser Lösung ist, dass das Projektkennwort im VBA-Code offen vorliegen muss, da es zum Entsperren benötigt wird. Dieses offen sichtbare Passwort beeinträchtigt jedoch nicht gross die Sicherheit, da es im VBA-Programm steht; und dieser ist ja geschützt.
Dateiinhalt einlesen und in Variable ablegen
.Beschreibung
Das nachfolgende Codebeispiel zeigt, wie man eine Datei
öffnet und den gesamten Dateiinhalt in eine Variable einfüllt.
.VBA-Code
Sub ReadFileContents()
Dim strFileContents As String
Open "C:\Daten\EineDatei.txt" For Binary Access Read As #1
strFileContents = Input(LOF(1), #1)
Close #1
MsgBox strFileContents
End Sub
Verwandte Codebeispiele |
|
Die ersten x Bytes eines Dateiinhaltes einlesen
.Beschreibung
Hier wird gezeigt, wie man eine beliebige Anzahl Bytes einer
Datei einlesen kann. Das Dateiformat der Datei spielt hierbei keine Rolle.
» Im Beispiel #1 werden die ersten 5 Bytes eingelesen und in der Variable strFileContents abgelegt.
» Das zweite Codebeispiel zeigt die kurze Variante ohne Benutzung einer Variable. Hier werden als Beispiel die ersten 8 Bytes eingelesen und direkt mit MsgBox ausgegeben.
Bitte beachten Sie, dass der Meldungsdialog unter Umständen nicht den gesamten Inhalt der Variable bzw. der Datei anzeigt.
.VBA-Code #1
Sub ReadFileContents1()
Dim strFileContents As String
Open "C:\Daten\EineDatei.txt" For Binary Access Read As #1
strFileContents = Input(5, #1)
Close #1
MsgBox strFileContents
End Sub
.VBA-Code #2
Sub ReadFileContents2()
Open "C:\Daten\EineMappe.xls" For Binary Access Read As #1
MsgBox Input(8, #1)
Close #1
End Sub
.Hinweis
Die meisten Dateitypen von Microsoft Excel (also
Dateien mit den Dateinamenerweiterungen xls, xlt, xla oder xlk) benutzen ein spezielles
Format, welches quasi innerhalb des OLE Structured Storage File-Formates verwendet wird.
Dieses Format wird 'BIFF' genannt. Die Abkürzung BIFF steht für 'Binary Interchange File
Format'.
Verwandte Codebeispiele |
|
Prüfen, ob eine Datei das OLE Structured Storage Format besitzt
.Beschreibung
Microsoft Excel-Arbeitsmappendateien und andere Microsoft
Office-Dokumentdateien (u.a. Word-Dokumente und PowerPoint-Präsentationen), sowie auch
bestimmte Windows-Dateien (u.a. Microsoft Management Console und Microsoft Installer
Package) verwenden das so genannte OLE Structured Storage File Format.
Mit dem hier vorgestellten VBA-Programmcode können Sie feststellen, ob eine Datei das OLE Structured Storage Format besitzt. Dadurch können Sie beispielsweise bereits vor dem Öffnen überprüfen, ob die Datei ein potenziell lesbares Format verwendet. Schlägt die Prüfung fehl, so ist die Datei mit absoluter Sicherheit weder eine Arbeitsmappe (xls), eine Vorlage (xlt), ein Add-In (xla) noch eine Sicherungskopie einer Arbeitsmappe (xlk). Wenn die ersten sechs Bytes einer Datei die Hex-Werte D0, CF, 11, E0, A1 und B1 besitzen, so liegt eindeutig das OLE Structured Storage Dateiformat vor.
Hier die ersten sechs Bytes einer OLE Structured Storage-Datei:
| Byte | Hex Value | Dec Value | Character |
| 1 | D0 | 208 | Ð |
| 2 | CF | 207 | Ï |
| 3 | 11 | 17 | |
| 4 | E0 | 224 | à |
| 5 | A1 | 161 | ¡ |
| 6 | B1 | 177 | ± |
Mit VBA könnte man nun diese ersten sechs Bytes des Dateiinhaltes einlesen und dann jedes einzelne Byte auf seinen Hex-Wert prüfen. Einiges einfacher geht es, wenn die sechs Bytes in einem Arbeitsschritt Text eingelesen und mit einer Zeichenfolge, welche sechs Zeichen enthält, die die erwähnten Hex-Werte darstellen, verglichen werden.
» Die beiden Codebeispiele #1 und #2 verwenden das oben beschriebene Verfahren mit dem Überprüfen der ersten sechs Bytes des Dateiinhalts.
» Das Codebeispiel #3 verwendet einen komplett anderen Ansatz. Hier wird anhand der GetDocumentProperties-Methode aus der OLE Document Properties Object Library (DSOFile.dll) auf die Datei zugegriffen und dabei kontrolliert, ob ein Fehler auftritt.
.VBA-Code #1
Sub CheckOLEStructuredStorageFileFormat1()
Dim strFileContents As String
Open "C:\Daten\EineDatei.xls" For Binary Access Read As #1
strFileContents = Input(6, #1)
Close #1
If strFileContents = "ÐÏࡱ" Then
MsgBox "Die Datei besitzt das OLE Structured Storage Format."
End If
End Sub
.VBA-Code #2
Sub CheckOLEStructuredStorageFileFormat2()
Open "C:\Daten\EineDatei.xls" For Binary Access Read As #1
If Input(6, #1) = "ÐÏࡱ" Then
MsgBox "Die Datei besitzt das OLE Structured Storage
Format."
End If
Close #1
End Sub
.VBA-Code #3
Sub CheckOLEStructuredStorageFileFormat3()
Dim objDSOReader As Object
Dim objDSODocument As Object
Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
On Error Resume Next
Set objDSODocument =
objDSOReader.GetDocumentProperties("C:\Daten\EineDatei.xls")
If Err.Number = 0 Then
MsgBox "Die Datei besitzt das OLE Structured Storage Format."
ElseIf Err.Number = 432 Then
MsgBox "Die Datei ist nicht vorhanden."
ElseIf Err.Number = 2 Then
MsgBox "Die Datei besitzt nicht das OLE Structured Storage
Format."
ElseIf Err.Number = 3 Then
MsgBox "Die Datei wird gerade bearbeitet."
Else
MsgBox "Es ist ein Fehler aufgetreten."
End If
Set objDSODocument = Nothing
Set objDSOReader = Nothing
End Sub
.Hinweis
Die meisten Dateitypen von Microsoft Excel (also
Dateien mit den Dateinamenerweiterungen xls, xlt, xla oder xlk) benutzen ein spezielles
Format, welches quasi innerhalb des OLE Structured Storage File-Formates verwendet wird.
Dieses Format wird 'BIFF' genannt. Die Abkürzung BIFF steht für 'Binary Interchange File
Format'.
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
Prüfen, ob eine Arbeitsmappe noch nicht gespeicherte Änderungen enthält
.Beschreibung
Die Saved-Eigenschaft des Workbook-Objektes
gibt Auskunft darüber, ob die Arbeitsmappe Änderungen enthält, welche noch nicht
gespeichert wurden. Bei jedem Speichern-Vorgang, egal ob über "Speichern" oder
"Speichern unter" ausgelöst, wird die Saved-Eigenschaft automatisch
auf True gesetzt.
.VBA-Code
Sub CheckUnsavedChanges()
If ActiveWorkbook.Saved = False Then
MsgBox "Die Arbeitsmappe enthält noch nicht gespeicherte
Änderungen."
End If
End Sub
.Hinweis
Bitte beachten Sie, dass beim Speichern mittels der SaveCopyAs-Methode
die Saved-Eigenschaft nicht auf True gesetzt wird!
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
Prüfen, ob eine Arbeitsmappe bereits einmal gespeichert wurde
.Beschreibung
Durch Vergleichen der FullName- mit der Name-Eigenschaft
von Workbook kann man herausfinden, ob eine Arbeitsmappe schon einmal gespeichert
wurde. Wenn die beiden Eigenschaften den gleichen Inhalt besitzen, dann wurde die Mappe
noch nie als Datei gespeichert. Im nachstehenden Beispiel wird die aktive Arbeitsmappe
verwendet.
.VBA-Code
Sub CheckFirstSave()
If ActiveWorkbook.FullName = ActiveWorkbook.Name Then
MsgBox "Die Arbeitsmappe wurde noch nie gespeichert."
End If
End Sub
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
Aktuell verwendeter Drucker abfragen
.Beschreibung
Den aktuell von Microsoft Excel verwendeten Drucker erhält
man durch Abfragen der ActivePrinter-Eigenschaft des Application-Objektes.
Die Eigenschaft enthält Name und Port des aktiven Druckers.
Gibt Druckername und Port (nicht Anschlussname!) aus. Bei Microsoft PowerPoint nur Druckername ohne Port.
Bei Microsoft Excel und Microsoft Word gilt der aktive Drucker grundsätzlich für alle geöffneten Arbeitsmappen bzw. Dokumente.
» Codebeispiel #1: Microsoft Excel, Microsoft Word und Microsoft PowerPoint.
» Codebeispiel #2: Microsoft PowerPoint.
.VBA-Code #1
Sub GetActivePrinter()
MsgBox "Aktueller Drucker: " & Application.ActivePrinter
End Sub
.VBA-Code #2
Sub GetActivePrinterPresentation()
MsgBox "Aktueller Drucker: " &
ActivePresentation.PrintOptions.ActivePrinter
End Sub
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
Aktuell verwendeter Drucker wechseln
.Beschreibung
Beschreibung folgt.
Es muss Druckername und Portname (nicht Anschlussname!) angegeben werden. Der tatsächliche (interne) Name des Ports muss allenfalls zuerst ermittelt werden.
Der Laufzeitfehler 1004 "Anwendungs- oder objektdefinierter Fehler" tritt auf, wenn der angegebene Drucker nicht existiert, und/oder der Port ungültig ist und/oder die verwendete Syntax falsch ist (<Druckername> auf <Port>).
Bei Microsoft PowerPoint wird nur der Druckername angegeben.
Laufzeitfehler -2147467259 in Microsoft PowerPoint, wenn der Drucker nicht existiert oder nicht verfügbar ist.
Das Setzen von Application.ActivePrinter funktioniert in PowerPoint nicht. Dort muss ActivePresentation.PrintOptions.ActivePrinter verwendet werden.
Bei Wechseln des Windows Standard-Druckers ändert sich der aktuelle Drucker automatisch (alle Office-Programme).
Wenn ein VBA-Programm nur vorübergehend einen anderen Drucker braucht, sollte am Schluss des VBA-Programmes der ursprünglich verwendete Drucker wiederhergestellt werden.
.VBA-Code #1
Sub SetActivePrinter1()
Application.ActivePrinter = "HP LaserJet 4M Plus auf LPT1:"
End Sub
.VBA-Code #2
Sub SetActivePrinter2()
Dim strPrinter As String
strPrinter = Application.ActivePrinter
Application.ActivePrinter = "HP LaserJet 4M Plus auf LPT1:"
Application.ActivePrinter = strPrinter
End Sub
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
Interner Name des Druckerports eines Druckers ermitteln
.Beschreibung
Dieses Codebeispiel ermittelt den internen Portnamen eines
Anschlusses. Dieser wird unter anderem zum Festlegen des aktiven Druckers in Microsoft
Excel benötigt.
Wenn Sie beispielsweise eine Exceltabelle als PDF-Datei drucken wollen (mit dem Acrobat Distiller), wird im Drucken-Dialogfenster nach dem Auswählen des Druckers "Acrobat Distiller" unter "Ort" nicht der Druckerport sondern der Dateipfad der Zieldatei (*.pdf) angezeigt. Wenn Sie nun mit VBA-Code den aktiven Drucker auf den Acrobat Distiller ändern möchten, so müssen Sie wie üblich Drucker und Port mit der Syntax "<Druckername> auf <Port>" angeben. Im Falle des Acrobat Distillers funktioniert das nicht, weil der Port nicht der oben erwähnte Zieldateipfad ist. Der zu verwendende Port besitzt nämlich einen anderen Namen, den so genannten internen Portnamen. Beim Acrobat Distiller lautet dieser "Ne00:", sofern der erste lokale Port benutzt wird. Der zweite lokale Port heisst "Ne01:", der dritte "Ne02:" und so weiter.
Im Beispiel wird der Drucker "HP LaserJet 4M Plus" verwendet (abgelegt als Konstante strPrinter).
.VBA-Code
Sub GetPrinterPortName()
Const strPrinter As String = "HP LaserJet 4M Plus"
Dim strSetting As String
Dim strPort As String
Dim intChar As Integer
On Error Resume Next
strSetting =
CreateObject("WScript.Shell").RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows
NT\CurrentVersion\Devices\" & strPrinter)
If Err.Number = -2147024894 Then
MsgBox "Es existiert kein Drucker '" & strPrinter &
"'.", vbInformation
Exit Sub
End If
For intChar = Len(strSetting) To 1 Step -1
If Mid$(strSetting, intChar, 1) = "," Then
strPort = Mid$(strSetting, intChar + 1)
Exit For
End If
Next intChar
If strPort = "" Then
MsgBox "Drucker '" & strPrinter & "'" &
vbCrLf & vbCrLf & _
"Der Port-Name wurde nicht
gefunden!", vbExclamation
Else
MsgBox "Drucker '" & strPrinter & "'" &
vbCrLf & vbCrLf & "Name des Ports: " & strPort & vbCrLf & _
"Excel-Druckerbezeichnung: "
& strPrinter & " auf " & strPort, vbInformation
End If
End Sub
Verwandte Codebeispiele |
|
|
Weitere Informationen |
|
Zuletzt aktualisiert
am 09.01.2009 / 08:00 Uhr
© 2002-2009 by Philipp von Wartburg, Schweiz
Alle Rechte vorbehalten