Access → Excel: Daten exportieren

Variante 1: DoCmd.TransferSpreadsheet

DoCmd.TransferSpreadsheet _
    TransferType:=acExport, _
    SpreadsheetType:=acSpreadsheetTypeExcel12Xml, _
    TableName:="qryUmsatz", _
    FileName:="C:\Export\Umsatz.xlsx", _
    HasFieldNames:=True

Schnell. Einfach. Funktioniert für Abfragen und Tabellen.

Variante 2: Direkte Excel-Automation

Dim xlApp As Object, xlWb As Object
Set xlApp = CreateObject("Excel.Application")
Set xlWb = xlApp.Workbooks.Add

xlApp.Visible = True
xlWb.Sheets(1).Cells(1, 1).Value = "Hallo Excel"

xlWb.SaveAs "C:\Export\Direkt.xlsx"
xlWb.Close
xlApp.Quit
Set xlApp = Nothing

Für mehr Kontrolle über Layout und Format.

Access → Excel: Daten zeilenweise schreiben

Dim xlApp As Object, xlSheet As Object
Dim rs As DAO.Recordset, i As Long

Set rs = CurrentDb.OpenRecordset("SELECT * FROM tblKunden")
Set xlApp = CreateObject("Excel.Application")
Set xlSheet = xlApp.Workbooks.Add.Sheets(1)

For i = 0 To rs.Fields.Count - 1
    xlSheet.Cells(1, i + 1).Value = rs.Fields(i).Name
Next

i = 2
Do Until rs.EOF
    For j = 0 To rs.Fields.Count - 1
        xlSheet.Cells(i, j + 1).Value = rs.Fields(j).Value
    Next
    i = i + 1
    rs.MoveNext
Loop

xlApp.Visible = True

Ideal für eigene Exportlogik.

Access → Outlook: E-Mail senden

Dim olApp As Object, olMail As Object
Set olApp = CreateObject("Outlook.Application")
Set olMail = olApp.CreateItem(0)

With olMail
    .To = "kunde@example.com"
    .Subject = "Ihre Rechnung"
    .Body = "Sehr geehrter Kunde," & vbCrLf & "anbei Ihre Rechnung."
    .Attachments.Add "C:\Export\Rechnung.pdf"
    .Display ' oder .Send
End With

Funktioniert nur, wenn Outlook lokal installiert ist. Kein M365-Web.

Outlook → Access: Mails einlesen

Dim olApp As Object, olNs As Object, olFolder As Object, olMail As Object
Set olApp = CreateObject("Outlook.Application")
Set olNs = olApp.GetNamespace("MAPI")
Set olFolder = olNs.GetDefaultFolder(6) ' Posteingang

For Each olMail In olFolder.Items
    If TypeName(olMail) = "MailItem" Then
        Debug.Print olMail.Subject & " - " & olMail.ReceivedTime
    End If
Next

Zum Beispiel für automatische Verarbeitung von Bestellungen oder Supportanfragen.

Access → Outlook-Kalender

Dim olApp As Object, olAppt As Object
Set olApp = CreateObject("Outlook.Application")
Set olAppt = olApp.CreateItem(1)

With olAppt
    .Start = #5/15/2025 14:00#
    .Duration = 60
    .Subject = "Besprechung"
    .Location = "Konferenzraum"
    .ReminderMinutesBeforeStart = 15
    .Save
End With

So kannst Du aus Access heraus Termine eintragen.

Daten aus Excel importieren

DoCmd.TransferSpreadsheet _
    TransferType:=acImport, _
    SpreadsheetType:=acSpreadsheetTypeExcel12Xml, _
    TableName:="tmpImport", _
    FileName:="C:\Import\Preise.xlsx", _
    HasFieldNames:=True

Für kontrollierten Import: erst in temporäre Tabelle, dann prüfen und übernehmen.

Integrationstipps

  • Office 32-Bit und 64-Bit prüfen – bei Automatisierung relevant
  • Fehlerbehandlung immer mit einbauen
  • Outlook-Referenzen nicht fest einbinden → Late Binding nutzen
  • Hintergrundprozesse (z. B. Massenversand) mit DoEvents entlasten
  • Exporte sinnvoll benennen (Bericht_20250501.xlsx)

Beispiel: Serienmail mit Anhang aus Access

Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT Email, PDFPfad FROM tblRechnungen WHERE Monat=4")

Do While Not rs.EOF
    Set olMail = CreateObject("Outlook.Application").CreateItem(0)
    With olMail
        .To = rs!Email
        .Subject = "Ihre April-Rechnung"
        .Body = "Anbei Ihre Rechnung für April."
        .Attachments.Add rs!PDFPfad
        .Send
    End With
    rs.MoveNext
Loop

Funktioniert zuverlässig – aber nicht ohne Outlook-Trust-Center-Warnung, je nach Einstellung:

Die nervige Outlook-Warnung beim automatisierten Senden („Ein Programm versucht, E-Mail in Ihrem Namen zu senden…“) ist in KMU-Projekten mit Access und VBA immer wieder ein Thema.

Hier sind die Top 5 Möglichkeiten, um die Outlook-Trust-Center-Warnung zu vermeiden oder zu umgehen – inklusive technischer Hinweise:

1. Redemption Library (sicher und etabliert)

Redemption ist der Klassiker.
Ersetzt Outlook-Objekte durch sichere Wrapper und umgeht das Sicherheitsmodell.

Dim redApp As Object
Set redApp = CreateObject("Redemption.SafeOutlookApplication")
Dim redMail As Object
Set redMail = redApp.CreateItem(0)

With redMail
    .Recipients.Add "test@example.com"
    .Subject = "Ohne Warnung"
    .Body = "Kein Trust Center Popup."
    .Send
End With

Vorteile:

  • Kein Popup
  • Produktiv einsetzbar
  • Auch für Anhänge, Kalender usw.

Nachteil:

  • Extra DLL (muss registriert werden)
  • Lizenzpflichtig (kommerziell)

2. Outlook im „Programmatic Access“ auf „Nie warnen“ setzen

Nur sinnvoll im Einzelplatzbetrieb, wenn der Rechner durchgehend Virenschutz hat.

Pfad:
Outlook → Datei → Optionen → Trust Center → Einstellungen für das Trust Center → Programmgesteuerter Zugriff

Option:
„Nie warnen (empfohlen, wenn ein Antivirenprogramm ausgeführt wird)“

Nachteil:

  • Gilt nur lokal
  • Keine Gruppenrichtlinie = kein zentrales Management
  • Nicht verfügbar, wenn kein Antivirus erkannt wird

3. Signierte VBA-Makros und vertrauenswürdige Speicherorte

Wenn Du Deinen Code digital signierst und Access/Outlook entsprechend einstellst, werden Makros nicht mehr als unsicher eingestuft.

Schritte:

  • Digitale Signatur erstellen (z. B. mit SelfCert.exe)
  • Projekt signieren (VBA-Editor → Extras → Digitale Signatur)
  • Pfad der Access-Datei als „vertrauenswürdiger Speicherort“ definieren

Effekt:
Outlook traut Deinem Code. Aber: nicht 100 % zuverlässig beim Mailversand.

4. Zwischenlösung: Mail per CDO oder SMTP

Ganz ohne Outlook. Du umgehst Outlook komplett, indem Du die Mail per SMTP verschickst – z. B. über den lokalen Mailserver oder Microsoft 365.

Dim cdoMsg As Object
Set cdoMsg = CreateObject("CDO.Message")

With cdoMsg
    .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.office365.com"
    .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 587
    .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
    .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "user@example.com"
    .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "passwort123"
    .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    .Configuration.Fields.Update

    .To = "kunde@example.com"
    .From = "user@example.com"
    .Subject = "CDO-Mail"
    .TextBody = "Ohne Outlook, ohne Warnung."
    .Send
End With

Vorteile:

  • Kein Outlook nötig
  • Kein Popup

Nachteil:

  • Etwas fummelig
  • Zugangsdaten im Klartext

5. Gruppenrichtlinie (GPO) für Unternehmen

In größeren Umgebungen mit Active Directory kannst Du Outlooks Verhalten zentral steuern:

  • Outlook Admin Templates (ADMX) einspielen
  • „Programmatic Access Security“ über GPO konfigurieren

Pfad in der GPO:

Benutzerkonfiguration → Administrative Vorlagen → Microsoft Outlook [Version] → Sicherheitscenter → Einstellungen für programmgesteuerten Zugriff

Effekt:

  • Kein Popup mehr, wenn eine vertrauenswürdige Anwendung Mails versendet

Nachteil:

  • Nur mit Gruppenrichtlinien
  • Gilt für alle Benutzer auf dem System

Categories:

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert