Das Versenden von E-Mails haben wir bereits ausführlich in Access im Unternehmen beschrieben. Dort kam auch gelegentlich das Thema auf, wie Sie Dateien an solche E-Mails anhängen. Allerdings gibt es bei genauerem Hinsehen Anforderungen, die wir noch nicht behandelt haben – zum Beispiel das Anhängen vieler Dateien auf einen Rutsch oder auch das Hinzufügen von Dateien, die nicht aus einem Verzeichnis stammen. Hierzu sind dann mehrere Aufrufe des jeweiligen Dialogs zum Auswählen der Dateien erforderlich. Auf diese Spezialfälle gehen wir im vorliegenden Beitrag ein.
Anforderungen an die Beispiellösung
Dieser Beitrag soll eine Beispiellösung mit folgenden Funktionen beschreiben:
- Versenden einer E-Mail unter Angabe von Empfänger, Betreff und Inhalt
- Hinzufügen von Anlagen über einen Dateiauswahldialog. Dabei sollen mehrere Anlagen aus einem Verzeichnis gleichzeitig selektiert werden können und beim Hinzufügen weiterer Anlagen aus einem weiteren Verzeichnis sollen die bereits hinzugefügten Anlagen erhalten bleiben.
- Bereits hinzugefügte Anlagen sollen markiert und aus der E-Mail gelöscht werden können.
Vorbereitungen
Wir benötigen Verweise auf zwei VBA-Bibliotheken. Diese fügen Sie dem VBA-Projekt über den Verweise-Dialog hinzu, den Sie mit dem Menübefehl Extras|Verweise des VBA-Editors öffnen:
- Microsoft Office x.0 Object LIbrary: Liefert das FileDialog-Objekt, mit dem wir den Dialog zum Auswählen der Anlagen anzeigen.
- Microsoft Outlook x.0 Object Library: Stellt das Mail-Item-Objekt zum Versenden der E-Mail bereit.
Mit den beiden hinzugefügten Verweisen sieht der Verweise-Dialog wie in Bild 1 aus.
Bild 1: Verweise des VBA-Projekts
Formular zum Erstellen der E-Mail mit Anlage
Das Formular, von dem aus wir das Versenden von E-Mails mit Anlagen steuern wollen, heißt frmMailsMitAttachment und sieht in der Entwurfsansicht wie in Bild 2 aus. Das Formular verwendet die folgenden Steuerelemente:
Bild 2: Formular in der Entwurfsansicht
- txtAn: Dient der Erfassung des Empfängers der E-Mail.
- txtBetreff: Nimmt den Betreff der E-Mail auf.
- txtInhalt: Hier können Sie den Inhalt der E-Mail eingeben.
- lstAnlagen: Listenfeld zur Anzeige der bereits hinzugefügten Anlagen. Das Listenfeld soll die Mehrfachauswahl erlauben, damit auch mehrere Anlagen gleichzeitig wieder aus der Liste entfernt werden können. Dazu legen wir für die Eigenschaft Mehrfachauswahl den Wert Erweitert fest. Außerdem stellen wir für dieses Listenfeld die Eigenschaften Horizontaler Anker und Vertikaler Anker auf Beide ein, damit das Listenfeld mit dem Formular vergrößert werden kann. Damit das dazugehörige Bezeichnungsfeld an Ort und Stelle bleibt, erhalten Horizontaler Anker und Vertikaler Anker hier die Werte Links und Oben. Damit wir die ausgewählten Dateien einzeln hinzufügen können, stellen wir außerdem die Eigenschaft Herkunftstyp auf Wertliste ein.
- cmdHinzufuegen: Öffnet einen Dateiauswahldialog zum Auswählen der hinzuzufügenden Anlagen und fügt diese nach der Auswahl zum Listenfeld lstAnlagen hinzu.
- cmdLoeschen: Löscht die aktuell markierten Einträge des Listenfeldes. Die Schaltfläche soll nur markiert sein, wenn im Listenfeld lstAnlagen mindestens ein Eintrag markiert ist.
- cmdSenden: Sendet die E-Mail mit den Angaben der Felder txtAn, txtBetreff und txtInhalt und mit den im Listenfeld lstAnlagen angegebenen Dateien. Für diese Schaltfläche stellen wir die Eigenschaft Vertikaler Anker auf Unten ein, damit es beim Vergrößern des Formulars unten verankert ist.
Die Eigenschaften Datensatzmarkierer, Navigationsschaltflächen, Bildlaufleisten und Trennlinien sollen den Wert Nein und die Eigenschaft Automatisch zentrieren den Wert Ja haben.
Anlagen zur Liste hinzufügen
Die Schaltfläche cmdHinzufuegen soll einen Dateiauswahldialog öffnen, mit dem der Benutzer eine oder mehrere Dateien aus einem Verzeichnis auswählen und zur Liste hinzufügen kann. Die Liste zeigt die Dateien dann mit dem vollständigen Pfad an. Dabei wollen wir das mehrfache Hinzufügen von Dateien unterbinden. Dies wäre möglich, da wir erlauben wollen, dass der Benutzer durch mehrfaches Anklicken der Hinzufügen-Schaltfläche auch mehrfach Dateien aus dem gleichen Verzeichnis hinzufügen könnte.
Also prüfen wir vor dem Hinzufügen einer Datei zum Listenfeld lstAnlagen, ob diese bereits in der Liste enthalten ist.
Die durch die Schaltfläche cmdHinzufuegen ausgelöste Prozedur finden Sie in Listing 1. Hier deklarieren wir zwei Laufvariablen sowie das FileDialog-Objekt und eine Boolean-Variable. Die Variable objFileDialog füllen wir mit einem Objekt der Klasse FileDialog mit dem Typ msoFileDialogPicker – mehr Informationen über diese Klasse finden Sie im Beitrag Dateien und Verzeichnisse auswählen mit FileDialog (www.access-im-unternehmen.de/****).
Private Sub cmdHinzufuegen_Click() Dim objFileDialog As FileDialog Dim l As Long Dim m As Long Dim bolVorhanden As Boolean Set objFileDialog = FileDialog(msoFileDialogFilePicker) With objFileDialog .AllowMultiSelect = True .Title = "Anlagen auswählen" .Filters.Clear .Filters.Add "Alle Dateien", "*.*" .ButtonName = "Hinzufügen" If .Show = True Then For l = 1 To .SelectedItems.Count If Not Len(Me!lstAnlagen.RowSource + .SelectedItems(l)) > 32750 Then bolVorhanden = False For m = 1 To Me!lstAnlagen.ListCount If Me!lstAnlagen.ItemData(m) = .SelectedItems(l) Then bolVorhanden = True Exit For End If Next m If Not bolVorhanden Then Me!lstAnlagen.AddItem .SelectedItems(l) End If Else MsgBox "Es können keine weiteren Dateien zur Liste hinzugefügt werden." Exit Sub End If Next l End If End With End Sub
Listing 1: Prozedur zum Auswählen von Dateien
Wir stellen mit der Eigenschaft AllowMultiSelect ein, dass der Benutzer mehrere Dateien gleichzeitig auswählen kann. Mit Title legen wir den Titel fest, dann leeren wir mit Filters.Clear die vorhandenen Filter und fügen mit Add den Filter für alle Dateitypen hinzu. Die Bezeichnung der Schaltfläche zum Übernehmen der Auswahl stellen wir auf ButtonName ein.
Danach folgt der Aufruf des Dialogs mit der Show-Methode, was wie in Bild 3 aussieht. Nach der Auswahl mit der Schaltfläche Hinzufügen wird der If-Teil der If…Then-Abfrage ausgeführt. Würde der Benutzer auf Abbrechen klicken, liefert die Show-Methode den Wert False und die Prozedur läuft nach der If…Then-Bedingung weiter.
Bild 3: Auswahl der anzuhängenden Dateien
Bevor es richtig losgeht, gehen wir auf eine Beschränkung des Listenfeldes ein: Die Datensatzherkunft kann nämlich maximal 32.750 Zeichen erfassen. Daher prüfen wir vor dem Einlesen der hinzuzufügenden Dateien, ob die aktuelle Länge des Inhalts der Eigenschaft RowSource plus der Länge des hinzuzufügenden Eintrags innerhalb dieses Limits bleibt. Ist das der Fall, fügen die folgenden Anweisungen die Datei zum Listenfeld hinzu, anderenfalls erscheint eine entsprechende Meldung. So viele Dateien werden Sie aber in der Regel auch nicht zu einer E-Mail hinzufügen. Sollte dies dennoch einmal erforderlich sein, können Sie die hinzuzufügenden Dateien zuvor beispielsweise zu einem Zip-Archiv hinzufügen.
Innerhalb der If…Then-Bedingung folgt zunächst eine For…Next-Schleife über alle im Dateiauswahldialog gewählten Dateien. Deren Anzahl ermitteln wir dabei mit der Eigenschaft SelectedItems.Count des Objekts aus objFileDialog. Der Index von SelectedItems ist 1-basiert, daher läuft die Schleife von 1 bis zur Anzahl der selektierten Einträge.
Für jede in dieser Schleife durchlaufene, im Dialog ausgewählte Datei setzt die Prozedur zunächst die Variable bolVorhanden auf den Wert False. Dann durchläuft sie alle bereits im Listenfeld lstAnlagen vorhandenen Einträge in der inneren For…Next-Schleife. Diese läuft ebenfalls von 1 bis zur mit ListCount ermittelten Anzahl der Listeneinträge. Innerhalb der zweiten Schleife vergleicht die Prozedur den Wert des aktuellen Listeneintrags aus Me!lstAnlagen.ItemData(m) und der aktuell untersuchten, hinzuzufügenden Datei aus objFileDialog.Selected-Items(l). Sind beide gleich, ist die Datei bereits in der Liste enthalten. Dann stellt die Prozedur den Wert der Variablen bolVorhanden auf True ein und verlässt die innere For…Next-Schleife.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo