FAQ amvExplorer
amvExplorer Grundlagen
Der amvExplorer ist ein Satz von Access-Objekten, die Du in eine Anwendung einfügen kannst und mit denen Du in einem Formular ein Explorer-Verzeichnis anzeigen kannst.
Anwendungszwecke für amvExplorer
Der amvExplorer kann überall sinnvoll eingesetzt werden, wo Dateien in Zusammenhang mit Daten anfallen:
  • Bei Kundendaten können Rechnungen, E-Mails, PDFs und sonstiger Schriftverkehr in einem eigenen Verzeichnis je Kunde gespeichert werden.
  • Bei Projektdaten können Pläne, Dokumentationen, Fotos et cetera in einem eigenen Verzeichnis je Projekt gespeichert werden.
  • In einer Produktverwaltung könnte man Produktbilder, Exposés oder Marketingmaterial in einem Verzeichnis je Produkt hinterlegen.
  • Dies sind nur einige wenige Anwendungsfälle. Es gibt sicher noch viele weitere!
Du kannst damit …
  • Dateien und Ordner aus dem Windows Explorer hineinziehen
  • E-Mails aus Outlook hineinziehen
  • Anlagen aus E-Mails hineinziehen
  • Datei-Elemente aus der Zwischenablage einfügen
Und Du kannst tracken, wann und welche Dateien eingefügt, geändert oder gelöscht wurden.
Du kannst also beim Hinzufügen von Dateien auch eine Verknüpfung zu dieser Datei in einem Feld einer Tabelle speichern.
Hinweis
Achtung: Die für diese Anleitung nötige Beispieldatenbank erhältst Du nach dem Kauf des amvExplorers:
Hast Du den amvExplorer bereits gekauft, findest Du diesen nach der Anmeldung im Shop unter Mein Konto|Sofortdownloads.
Einbau von amvExplorer in eigene Anwendungen
Um den amvExplorer in eigenen Anwendungen einzusetzen, müssen die folgenden Elemente importiert werden:
  • CLASS_AMV_EXPLORER
  • CLASS_AMV_WATCH
  • MOD_AMV_FUNCTION
  • MOD_AMV_WATCH
Außerdem musst Du ein Webbrowser-Steuerelement im Formular anlegen und dort einige Zeilen Code hinzufügen. Wie das gelingt, liest Du in weiteren Artikeln.
Hinweis
Achtung: Die für diese Anleitung nötige Beispieldatenbank erhältst Du nach dem Kauf des amvExplorers:
Hast Du den amvExplorer bereits gekauft, findest Du diesen nach der Anmeldung im Shop unter Mein Konto|Sofortdownloads.
Einfachen amvExplorer in einem Formular anzeigen
Im einfachsten Fall soll das Formular nur das Verzeichnis der aktuellen Datenbankdatei anzeigen.
Dazu sind die folgenden Schritte nötig:
  • Formular namens frmNurExplorer anlegen
  • Webbrowser-Steuerelement hinzufügen (die alte Version, nicht Edge) und in ctlExplorer umbenennen
  • Prüfe nach dem Hinzufügen, ob in den Verweisen der Verweis Microsoft Internet Explorer vorliegt, sonst füge ihn manuell hinzu:
  • Schaltfläche cmdOK zum Schließen hinzufügen
  • Variable für die Klasse mit der Funktionalität im Klassenmodul des Formulars deklarieren:
Dim WithEvents objExplorer As CLASS_AMV_EXPLORER
  • Code für die Ereignisprozedur Beim Öffnen des Formulars hinterlegen:
Private Sub Form_Open(Cancel As Integer)
Set objExplorer = New CLASS_AMV_EXPLORER
With objExplorer
'Für Version 1.0.0.0:
.Initialize Me.ctlExplorer, CurrentProject.Path
'Für Version 1.0.0.1:
.Initialize Me.Form, Me.ctlExplorer, CurrentProject.Path
End With
End Sub
Die Prozedur Form_Open erzeugt ein Objekt auf Basis der Klasse CLASS_AMV_EXPLORER und referenziert es mit der Variablen objExplorer.
Achtung: Die Verwendung des Form_Open-Ereignisses ist zwingend erforderlich, damit die Aktualisierung des Webbrowser-Steuerelements abgeschlossen ist.
Die Methode Initialize initialisiert diese und übergibt den Verweis auf das Webbrowser-Steuerelement, das den Explorer anzeigen soll, sowie den anzuzeigenden Pfad – hier der aktuelle Datenbankpfad. Der Entwurf sieht so aus:
In Aktion sieht das Formular so aus:
Hinweis
Achtung: Die für diese Anleitung nötige Beispieldatenbank erhältst Du nach dem Kauf des amvExplorers:
Hast Du den amvExplorer bereits gekauft, findest Du diesen nach der Anmeldung im Shop unter Mein Konto|Sofortdownloads.
amvExplorer mit Pfad und Schaltflächen
Im zweiten Beispiel erstellen wir das Formular frmExplorerMitLabelUndButtons auf Basis des ersten Formulars. Wir fügen noch drei Steuerelement hinzu:
  • cmdPrevious
  • cmdNext
  • lblPath
Diese ordnen wir wie folgt über dem Webbrowser-Steuerelement an:
Der Code des Formulars sieht nun wie folgt aus:
Dim WithEvents objExplorer As CLASS_AMV_EXPLORER
Private Sub cmdOK_Click()
DoCmd.Close acForm, Me.Name
End Sub
Private Sub Form_Open(Cancel As Integer)
Set objExplorer = New CLASS_AMV_EXPLORER
With objExplorer
'Version 1.0.0.0
.Initialize Me.ctlExplorer, CurrentProject.Path, Me.cmdBack, _
Me.cmdForward, Me.lblPath
'Version 1.0.0.1
.Initialize Me.Form, Me.ctlExplorer, CurrentProject.Path, Me.cmdBack, _
Me.cmdForward, Me.lblPath
End With
End Sub
Die Verweise auf die neuen Steuerelemente übergeben wir ebenfalls der Initialize-Methode.
Wir können nun beispielsweise per Kontextmenübefehl ein neues Verzeichnis anlegen und zu diesem wechseln. Mit der Schaltfläche cmdBack kommen wir wieder zum vorherigen Verzeichnis zurück.
Hinweis
Achtung: Die für diese Anleitung nötige Beispieldatenbank erhältst Du nach dem Kauf des amvExplorers:
Hast Du den amvExplorer bereits gekauft, findest Du diesen nach der Anmeldung im Shop unter Mein Konto|Sofortdownloads.
amvExplorer mit verschiedenen Ordnern je Datensatz
Wir wollen nun, dass für jeden Datensatz ein Ordner angelegt und angezeigt wird. Dazu binden wir ein Formular an die Tabelle tblKunden und fügen die Felder dieser Tabelle hinzu. Außerdem legen wir wieder die Elemente aus dem vorherigen Beispiel an.
Damit können wir nun zu jedem Kunden einen eigenen Ordner anzeigen. Diese wird nach der Kunden-ID benannt und jeweils mit dem Kunden angezeigt:
Dazu ist ein wenig mehr Code nötig.
Wir verwenden als Basis den Code des vorherigen Beispiels:
Dim WithEvents objExplorer As CLASS_AMV_EXPLORER
Private Sub Form_Open(Cancel As Integer)
Set objExplorer = New CLASS_AMV_EXPLORER
With objExplorer
'Version 1.0.0.0
.Initialize Me.ctlExplorer, CurrentProject.Path, Me.cmdBack, _
Me.cmdForward, Me.lblPath
'Version 1.0.0.1
.Initialize Me.Form, Me.ctlExplorer, CurrentProject.Path, Me.cmdBack, _
Me.cmdForward, Me.lblPath
End With
End Sub
Private Sub cmdOK_Click()
DoCmd.Close acForm, Me.Name
End Sub
Dann müssen wir berücksichtigen, ob gerade ein neuer Datensatz oder ein bestehender Datensatz angezeigt wird. Das machen wir in Beim Anzeigen:

Private Sub Form_Current()
If Me.NewRecord Then
Call TempPath
Else
Call SetPath
End If
End Sub
Bei einem neuen Datensatz soll ein Verzeichnis namens Temp angezeigt werden. Wir prüfen, ob dieses vorhanden ist, legen es gegebenenfalls an und zeigen es dann an:
Private Sub TempPath()
If Not CBool(PathFileExists(CurrentProject.Path & "\FOLDER\Temp")) Then
MkDir CurrentProject.Path & "\FOLDER\Temp"
End If
If objExplorer.Path <> CurrentProject.Path & "\FOLDER\Temp" Then
objExplorer.Path = CurrentProject.Path & "\FOLDER\Temp"
End If
End Sub
Wenn hingegen ein vorhandener Datensatz angezeigt wird, prüfen wir, ob schon ein Verzeichnis mit dem Namen des Feldwertes aus KundeID vorhanden ist und legen es gegebenenfalls an, danach blenden wir es ein:
Private Sub SetPath()
If Not CBool(PathFileExists(CurrentProject.Path & "\FOLDER\" & Me.KundeID)) Then
MkDir CurrentProject.Path & "\FOLDER\" & Me.KundeID
End If
If objExplorer.Path <> CurrentProject.Path & "\FOLDER\" & Me.KundeID Then
objExplorer.Path = CurrentProject.Path & "\FOLDER\" & Me.KundeID
End If
End Sub
Schließlich fehlt noch eine Aktion für das Anlegen eines neuen Datensatzes. Sobald dieser gespeichert wird, feuert das Ereignis Nach Aktualisierung, das wir wie folgt nutzen, um den Ordner anzulegen und anzuzeigen:
Private Sub Form_AfterUpdate()
Call SetPath
End Sub
Wichtiger Hinweis
Man kann nicht von der Formularansicht zum Entwurf wechseln, wenn die hier vorgestellte Technik implementiert ist. Man muss dann das Formular schließen und dieses dann im Entwurf öffnen.
Hinweis
Achtung: Die für diese Anleitung nötige Beispieldatenbank erhältst Du nach dem Kauf des amvExplorers:
Hast Du den amvExplorer bereits gekauft, findest Du diesen nach der Anmeldung im Shop unter Mein Konto|Sofortdownloads.
amvExplorer mit Behandlung der Ereignisse durch Dateiänderungen
Gegebenenfalls möchtest Du nicht nur einfach ein Verzeichnis anzeigen, sondern auch die darin enthaltenen Dateien in irgendeiner Form in der Datenbank erfassen – beispielsweise durch Verknüpfung auf die jeweiligen Pfade, die Du in einer Tabelle speicherst.
amvExplorer kann alle Änderungen am aktuellen Verzeichnis erfassen:
  • Hinzufügen von Dateien
  • Umbenennen von Dateien
  • Verschieben/Löschen von Dateien
  • Hinzufügen von Ordnern
  • Umbenennen von Ordnern
  • Verschieben/Löschen von Ordnern
Wie das gelingt, zeigen wir im letzten Beispiel. Dieses sieht in der Entwurfsansicht wie folgt aus:
Es enthält neben den bisher bekannten Elementen noch zwei Schaltflächen und ein Unterformular:
  • Die erste Schaltfläche startet den Watcher, also die Funktion, die Änderungen am aktuell angezeigten Verzeichnis erfasst.
  • Die zweite Schaltfläche beendet den Watcher.
  • Das Unterformular zeigt die Daten der Tabelle TBL_AMV_FILE an.
Wir deklarieren wieder objExplorer und eine Variable für den aktuellen Pfad:
Private WithEvents objExplorer As CLASS_AMV_EXPLORER
Private sInitializePath As String
In Form_Open fügen wir eine Anweisung hinzu, die den Timer aktiviert:
Private Sub Form_Open(Cancel As Integer)On Error Resume Next sInitializePath = CurrentProject.Path & "\FOLDER" Set objExplorer = New CLASS_AMV_EXPLORER With objExplorer .Initialize Me.ctlExplorer, sInitializePath, Me.CMD01, Me.CMD02, Me.LBPATH End With Me.TimerInterval = 100 ' objExplorer.WatchStart --> must be activated via the timer interval so that the web control is readyEnd Sub
Die Timer-Prozedur startet den Watch-Mechanismus:
Private Sub Form_Timer()On Error Resume Next Me.TimerInterval = 0 objExplorer.WatchStart ' Must be set to start the triggerEnd Sub
Mit der ersten Schaltfläche starten wir den Watcher:
Private Sub CMD03_Click() Me.ctlExplorer.SetFocus objExplorer.WatchStartEnd Sub
Mit der zweiten beenden wir diesen:
Private Sub CMD04_Click() Me.ctlExplorer.SetFocus objExplorer.WatchStopEnd Sub
objExplorer bietet ein Ereignis, das bei jeder Änderung an einer Datei ausgelöst wird und das wir wie folgt implementiert haben. Hier werden die Änderungen in die Tabelle TBL_AMV_FILE geschrieben.
Der Parameter sFolderPath liefert den aktuellen Ordner, sFileName die geänderte Datei oder den geänderten Ordner und stcEventAction die Aktion, die durchgeführt werden soll. Diese werden entsprechend ausgewertet:
Private Sub objExplorer_WatchEvent(ByVal sFolderPath As String, ByVal sFileName As String, _
stcEventAction As Long)
Dim sArea As String
Dim sPath As String
Dim sFileAction As String
Static sTmpName As String
On Error Resume Next
Select Case stcEventAction
Case FILE_ACTION_MODIFIED
sFileAction = "MODIFIED"
Case FILE_ACTION_ADDED
sFileAction = "ADDED"
Case FILE_ACTION_REMOVED
sFileAction = "REMOVED"
Case FILE_ACTION_RENAMED_NEW_NAME
sFileAction = "RENAME NEW"
Case FILE_ACTION_RENAMED_OLD_NAME
sFileAction = "RENAME OLD"
End Select

sPath = sFolderPath
If Right(sPath, 1) <> "\" Then sPath = sPath & "\"
If Len(sFileName) > 0 Then
If sFileAction = "REMOVED" Then
sArea = "..."
Else
If IsFolder(sPath & sFileName) = True Then
sArea = "DIR"
Else
sArea = "FILE"
End If
End If
If stcEventAction = FILE_ACTION_RENAMED_OLD_NAME Then
sTmpName = Replace(sFileName, "'", "''")
ElseIf stcEventAction = FILE_ACTION_RENAMED_NEW_NAME Then
sFileName = Replace(sFileName, "'", "''")
sFileAction = "RENAME OLD"
CurrentDb.Execute "INSERT INTO TBL_AMV_FILE (FEVENT, FAREA, FPATH, FDATETIME) VALUES('" & sFileAction & "', '" & sArea & "', '" & sTmpName & "', #" & Format(Now(), "dd\/mm\/yyyy hh:mm:ss") & "#)"
sFileAction = "RENAME NEW"
CurrentDb.Execute "INSERT INTO TBL_AMV_FILE (FEVENT, FAREA, FPATH, FDATETIME) VALUES('" & sFileAction & "', '" & sArea & "', '" & sFileName & "', #" & Format(Now(), "dd\/mm\/yyyy hh:mm:ss") & "#)"
Forms("FRM_AMV_EXPLORER")("LIST01").Form.Requery
Else
sFileName = Replace(sFileName, "'", "''")
CurrentDb.Execute "INSERT INTO TBL_AMV_FILE (FEVENT, FAREA, FPATH, FDATETIME) VALUES('" & sFileAction & "', '" & sArea & "', '" & sFileName & "', #" & Format(Now(), "dd\/mm\/yyyy hh:mm:ss") & "#)"
Forms("FRM_AMV_EXPLORER")("LIST01").Form.Requery
End If
End If

End Sub
Außerdem gibt es noch zwei Ereignisse, die beim Starten und Beenden des Watchers ausgelöst werden und die wir wie folgt implementieren:
Private Sub objExplorer_WatchTriggerStart()
Me.ctlExplorer.SetFocus
CMD03.Enabled = False
CMD04.Enabled = True
End Sub

Private Sub objExplorer_WatchTriggerStop()
Me.ctlExplorer.SetFocus
CMD03.Enabled = True
CMD04.Enabled = False
End Sub
Hinweis
Achtung: Die für diese Anleitung nötige Beispieldatenbank erhältst Du nach dem Kauf des amvExplorers:
Hast Du den amvExplorer bereits gekauft, findest Du diesen nach der Anmeldung im Shop unter Mein Konto|Sofortdownloads.
Dateien bei Drag and Drop umbenennen
Im Beispielformular frmExplorerUmbenennen findest Du ein Beispiel, wie Du die Ereignisse des amvExplorers nutzen kannst. Wenn Du diesem Explorer eine PDF-Datei hinzufügst, wird diese direkt nach einem bestimmten Schema umbenannt, in diesem Fall mit Datum, Uhrzeit, KundeID und Kundenname.
Du kannst so PDF-Dokumente aus verschiedenen Quellen hinzufügen, beispielsweise aus anderen Ordnern oder auch aus E-Mail-Anlagen.
Um dies zu realisieren, implementieren wir das Ereignis objExplorer_WatchEvent. Das erledigen wir, indem wir oben im Codefenster im linken Auswahlfeld den Eintrag objExplorer auswählen und im rechten den Eintrag WatchEvent.
Diese Ereignisprozedur liefert uns den Pfad, in den die Datei eingefügt wurde, sowie den alten Dateinamen und mit dem Parameter stcEventAction die Aktion, die durchgeführt wurde. Wir prüfen, ob die Aktion FILE_ACTION_ADDED lautet. In diesem Fall und wenn die Dateiendung .pdf lautet, soll die Datei umbenannt werden. Dazu warten wir noch ab, bis der Einfügen-Vorgang abgeschlossen ist, und zwar in einer Do While-Schleife. Anschließend nutzen wir die API-Funktion ShellOperationFileRename, um die Datei umzubenennen:
Private Sub objExplorer_WatchEvent(ByVal sFolderPath As String, _
ByVal sFileName As String, stcEventAction As Long

Dim sFileNameNew As String
sFileNameNew = GetLongDateTime(Now) & "-" & Me.KundeID & "-" & Me.Firma & ".pdf"

If stcEventAction = FILE_ACTION_ADDED Then
If InStr(sFileName, ".pdf") > 0 Then
Do While IsFileInWork(sFolderPath & "\" & sFileName) = True
DoEvents
Loop
ShellOperationFileRename sFolderPath & "\" & sFileName, _
sFolderPath & "\" & sFileNameNew
End If
End If

End Sub
Hinweis
Achtung: Die für diese Anleitung nötige Beispieldatenbank erhältst Du nach dem Kauf des amvExplorers:
Hast Du den amvExplorer bereits gekauft, findest Du diesen nach der Anmeldung im Shop unter Mein Konto|Sofortdownloads.
Bekannte Probleme beim Einsatz des amvExplorers
Es kann sein, dass bei Verwendung spezieller Verzeichnisse beispielsweise aus NAS-Laufwerken die folgende Fehlermeldung auftaucht:
Diese kannst Du wie folgt unterbinden:
  • Öffne die Systemsteuerung.
  • Wähle den Eintrag Internetoptionen aus.
  • Klicke hier:
  • Aktiviere diese Option:
Hinweis
Achtung: Die für diese Anleitung nötige Beispieldatenbank erhältst Du nach dem Kauf des amvExplorers:
Hast Du den amvExplorer bereits gekauft, findest Du diesen nach der Anmeldung im Shop unter Mein Konto|Sofortdownloads.
amvExplorer Version 1.0.0.1
Es gibt eine neue Version mit kleinen Verbesserungen:
  • Der Aufruf der Methode Initialize der Klasse CLASS_AMV_EXPLORER wurde um den Parameter frm erweitert.
  • CLASS_AMV_WATCH wurde dahingehend geändert, dass bei langsameren Rechnern keine Probleme auftreten.
Neuer Parameter in Initialize-Methode
Die Methode Initialize hat als ersten Parameter nun den Parameter frm. Hiermit wird ein Verweis auf das Formular übergeben, in dem sich die mit cmdBack, cmdForward und lbl bezeichneten Elemente befinden:
Public Function Initialize(frm As Form, _
ctlWebbrowserControl As WebBrowserControl, _
Optional strInitialPath As String, _
Optional cmdBack As CommandButton, _
Optional cmdForward As CommandButton, _
Optional lbl As Label)
Damit ist sichergestellt, dass das richtige Formular referenziert wird, auch wenn sich das Webbrowser-Steuerelement für dem amvExplorer in einem Registersteuerelement befindet.
Empfehlung, wenn Du die Neuerungen nutzen möchtest:
  • Ersetze die vier Module MOD_AMV_FUNCTION, MOD_AMV_WATCH, CLASS_AMV_EXPLORER und CLASS_AMV_WATCH durch die in der neuen Demo.
  • Passe die Aufrufe der Methode Initialize um den neuen Parameter an.
  • Beachte die Änderungen der Ereignisprozedur Form_Current im Formular frmExplorerMitDatensaetzen.
Die neue Version findest Du im Download im Shop in Deinem Kundenkonto.
amvExplorer und die Entwurfsansicht bei aktiviertem Watcher
Wenn der amvExplorer angezeigt wird und der Watcher aktiviert ist, kann nicht mehr direkt in die Entwurfsansicht gewechselt werden.
Dieses Problem wird mit Version 1.0.0.3 behoben.
amvExplorer Version 1.0.0.3
Diese Version bringt Änderungen, die für folgenden Fall hilfreich sind:
  • Du möchtest beim Entwickeln in die Entwurfsansicht wechseln, während der Watcher läuft, also auf Dateioperationen gelauscht wird.
Willst Du diese Version in eine vorhandene Lösung integrieren, sind folgende Schritte nötig:
  • Ersetze die Module CLASS_AMV_EXPLORER und CLASS_AMV_WATCH aus der Datei amvExplorer_AKTUELLEDEMO_1.0.0.3.accdb.
  • Füge die Ereignisprozedur Form_Error wie folgt hinzu oder ergänze die vorhandene Form_Error-Prozedur:
Private Sub Form_Error(DataErr As Integer, Response As Integer)
Dim sName As String
On Error Resume Next
Select Case DataErr
Case 2174 ' Current View can not change to acDesign, stop the Watcher to change the View
Response = acDataErrContinue
objExplorer.RegisterTerminate ' Must be... to terminate all events
Set objExplorer = Nothing
DoEvents
sName = Me.Name
DoCmd.Close acForm, sName
DoCmd.OpenForm sName, acDesign
Case Else
Response = acDataErrContinue
End Select
End Sub
Füge außerdem in Form_Unload Folgendes ein:
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
objExplorer.RegisterTerminate
End Sub
Wenn Du das Verhalten für den amvExplorer im Unterformular erhalten möchtest, schaue Dir die Beispielformulare FRM_MAIN und FRM_SUB an.
© 2025 Minhorst and Minhorst GbR. All rights reserved