Office: EMail - Tabelle automatisch abarbeiten

Helfe beim Thema EMail - Tabelle automatisch abarbeiten in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; Hallo zusammen, ich habe eine Liste von Personen - die gewisse Termine haben. Nun läuft da automatisch eine "Reminder" Liste zusammen. Liste:... Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von Schlauchi, 21. Dezember 2009.

  1. Schlauchi Erfahrener User

    EMail - Tabelle automatisch abarbeiten


    Hallo zusammen,

    ich habe eine Liste von Personen - die gewisse Termine haben. Nun läuft da automatisch eine "Reminder" Liste zusammen.
    Liste:
    Name - Vorname - EMail - Reminder Grund - Datum

    Ich habe zwar ein Makro womit ich in jeder Zeile per Klickbox die Email Reminder auslösen kann... aber ich möchte das er quasi oben anfängt - und alle Personen in der Liste automatisch abarbeitet - jeden seine persönliche Email schickt.

    Wie bringe ich ihm bei - zum nächsten Datensatz zu hüpfen - und wenn es der letzte ist - aufzuhören bzw. das Fenster zu schließen?

    Ich möchte das eben wenn das Formular aufgerufen wird - automatisch alle Personen auf der Liste eine Email bekommen - danach das Formular wieder schliesst. Ohne weitere "User" Aktionen.

    Gruß
    Schlauchi
     
    Schlauchi, 21. Dezember 2009
    #1
  2. Exl121150 Erfahrener User
    Hallo,

    ausgehend von folgender Beispieltabelle 'Tab_Reminder':

    1IDFamNameVorNameEMailAdresseReminderGrundReminderDatum
    21ExlTheodortheodor.exl@gmx.atDie unterschiedlichsten Dingen sind zu besprechen. Das Jahr ist bald zuende.23.12.2009
    32HaiderAlfredalfred.haider@ttt.deDas ist nur eine Test-Email.22.12.2009

    kann man folgende VBA-Sub in ein allgem. Codemodul kopieren und zB. über einen Formular-Button aufrufen.

    Dabei habe ich im Folgenden die Variante für 'Late-Binding' verwendet, weil sie die pflegeleichtere ist (kein Verweis auf Outlook-Library nötig).

    Die Variante für 'Early-Binding' funktioniert nur dann, wenn zuvor ein Verweis auf die Microsoft Outlook 12.0 Object Library hergestellt wird (Menü Extras > Verweise...). Sie ist allerdings fürs Programmieren die weitaus komfortablere Variante und auch zur Run-Time die schnellere.


    Code:
    Public Sub EMail_Reminder_Liste()
      Const olMailItem = 0
    ' Dim olApp As Outlook.Application    (für Early-Binding)
    ' Dim olEMailItem As Outlook.MailItem (für Early-Binding)
      Dim olApp As Object                '(für Late-Binding)
      Dim olEmailItem As Object          '(für Late-Binding)
      
      Dim dbs As Database
      Dim Rst As DAO.Recordset
      Dim FamName$, VorName$, EMailAdr$, Grund$, RemDatum As Date
      
    ' Neue Outlook-Instanz erzeugen
    ' Set olApp = New Outlook.Application              '(für Early-Binding)
      Set olApp = CreateObject("Outlook.Application")  '(für Late-Binding)
    ' Verbindung zur ACCESS-Datenbank herstellen
      Set dbs = CurrentDb
    ' Tabelle 'Tab_Reminder' öffnen
      Set Rst = dbs.OpenRecordset(Name:="Tab_Reminder", Type:=dbOpenTable, Options:=dbReadOnly)
      
      With Rst
         'Zum ersten Datensatz gehen
         .MoveFirst
         'Überprüfen, ob letzter Datensatz gelesen wurde
         Do Until .EOF
            'Aktueller Datensatz: Satzfelder in Variablen holen
            FamName$ = !FamName: VorName$ = !VorName
            EMailAdr$ = !EmailAdresse
            Grund$ = !ReminderGrund: RemDatum = !ReminderDatum
            'Erzeugen eines neuen EMail-Elementes
            Set olEmailItem = olApp.CreateItem(olMailItem)
            With olEmailItem
              'Datenfelder des Satzes in das EMail-Element einfügen
              .To = EMailAdr$
              .Subject = "Erinnerung an Termin"
              .Body = "An " & VorName$ & " " & FamName$ & vbCrLf & vbCrLf & _
                      Grund$ & vbCrLf & _
                      "Termin: " & Format$(RemDatum, "DD.MM.YYYY")
              'E-Mail absenden
              .Send
            End With
            'Zum nächsten Datensatz gehen
            .MoveNext
         Loop
         'Tabelle schließen
         .Close
      End With
      'Zur Garbage-Collection freigeben
      Set olApp = Nothing
      Set Rst = Nothing
      
    End Sub
     
    Zuletzt von einem Moderator bearbeitet: 30. November 2020
    Exl121150, 22. Dezember 2009
    #2
  3. Schlauchi Erfahrener User
    Outlook und Access...???

    Hallo zusammen,

    in der Zwischenzeit habe ich auch eine Lösung gefunden - alles automatisch ablaufen zu lassen.

    Als erstes hab ich eine Funktion gebaut Names SendEmailListe (muss anderes als die Funktion heissen!)
    Code:
    Public Function SendEmail()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb()
    Set rs = db.OpenRecordset("AbfrageName", dbOpenSnapshot)
    With rs
    Do While Not .EOF
    DoCmd.SendObject acSendNoObject, , , !ToFeld, , , "Subject", !Nachrichtentext, False
    .MoveNext
    Loop
    End With
    Set rs = Nothing
    End Function
    
    Das ganze rufe ich dann über VBA auf:
    Code:
    ...
    call SendEmail
    End sub
    
    Somit wird die Liste abgearbeitet...

    Was mir nun fehlt - ist die Outlook "Genehmigung". Outlook macht ein Fenster auf - und frägt nach, ob ich diese Email wirklich verwenden möchte.. ist natürlich nicht sinnvoll - da es automatisch ablaufen soll - ohne User.

    Hab etwas gelesen das man nun Access digital Signieren muss - oder per VBA Outlook anweist hier eine Ausnahme zu machen - wie??? weiß ich noch nicht.
     
    Schlauchi, 22. Dezember 2009
    #3
  4. Schlauchi Erfahrener User

    EMail - Tabelle automatisch abarbeiten

    Hallo Exl121150!

    Danke mal wieder für deine ausführliche Antwort. Werde deine Lösung auch noch probieren - scheint mir die etwas "schönere" zu sein.
    Nur das mit den "binding" muss ich mir mal anschauen - war mir bis jetzt noch nicht klar, dass es hier unterschiede gibt.

    Idee wie ich das Outlook Problem umgehen kann - das mit immer nach der Permission frägt?

    Will das Makro/Funktion automatisch aus dem Taskmanager von Windows einmal die Woche starten lassen... dann Outlook öffnen... alles verschicken lassen - und Outlook wieder schliessen.

    Dies alles ohne das hier ein User was tut - soll auch auf dem Server im Hintergrund laufen.

    Danke und Gruß
    Schlauchi
     
    Schlauchi, 22. Dezember 2009
    #4
  5. Schlauchi Erfahrener User
    Schlauchi, 22. Dezember 2009
    #5
  6. Exl121150 Erfahrener User
    Hallo,

    mit meinem Makro hast Du das Permission-Problem nicht (zumindest ich hatte keines).
    Einfach in ein allgem. Codemodul geben und, falls nötig, an Deine Tabellenfelder bzw. Deine Vorstellung der Nachrichtenformatierung anpassen.

    Das Thema "Late/Early Binding" kannst Du Dir hinterher anschauen (Ist ein prinzipielles Problem, wie man externe Module einbindet - wie erwähnt, hat beides seine Vor/Nachteile).
    Ich gehe in der Regel so vor, dass ich
    1) zuerst alles mit Early-Binding programmiere (Großer Vorteil: ich habe damit im Editor direkten Zugriff auf alle Eigenschaften und Methoden und benannten Konstanten, die im eingebundenen Modul enthalten sind).
    2) alle im Modul enthaltenen und verwendeten benannten Konstanten explizit im Modul als Konstante deklariere (nötig, bevor ich den 3. Schritt ausführe !!)
    3) wenn dies alles funktioniert, auch die Instanzieerung der betroffenen Objekte umstelle (Dim xy As Object bzw. Set xy = CreateObject("....") )und den Verweis auf die Library entferne. Hat den großen Vorteil, dass ich niemandem erklären muss, darauf zu achten, diese Bibliotheksverweise einzufügen.
    4) Wenn es ein Programm ist, das nur ich verwende, dann entfällt Schritt 2)+3); das Programm wird dadurch außerdem schneller.
     
    Exl121150, 22. Dezember 2009
    #6
  7. Schlauchi Erfahrener User
    Hallo,

    hab nun deinen Code ausprobiert - bzw. erst mal angepasst... aber ich bekomme immer in Runtime Fehler.

    es bleibt immer in der Zeile
    Code:
      Set Rst = dbs.OpenRecordset(Name:="NotificationMedCheckEXP", Type:=dbOpenTable, Options:=dbReadOnly)
    
    hängen... Laufzeitfehler 3219 - unzulässige Operation.

    Woran hängt das? Ich suche schon überall....
     
    Schlauchi, 22. Dezember 2009
    #7
  8. Exl121150 Erfahrener User

    EMail - Tabelle automatisch abarbeiten

    Hallo,

    falls Dein Recordset keine Tabelle ist, müsste folgender Code funktionieren:

    Code:
    Set Rst = dbs.OpenRecordset(Name:="NotificationMedCheckEXP", Type:=dbOpenDynaset) 
     
    Exl121150, 22. Dezember 2009
    #8
  9. Schlauchi Erfahrener User
    Outlook 2007 - late binding - open thru Access 2007

    DANKE

    Manchmal bin ich schon blind... hab vergessen das dahinter eine Abfrage steckt - und nicht die Tabelle.

    Soweit so gut - nur das kleine Problem - das funktioniert nur - wenn Outlook 2007 schon offen ist.

    nun wollte ich mit
    Code:
      Dim oOutlookApp As Object
      
      On Error Resume Next
      Set oOutlookApp = GetObject(, "Outlook.Application")
      If Err <> 0 Then
      Set oOutlookApp = CreateObject("Outlook.Application")
      End If
    
    eine Instanz von Outlook öffnen... macht er aber nicht. Das ganze habe ich am Anfang von der Funktion gesetzt... auch mal als separates Modul - und dann mit "Call" aufgerufen... geht auch nicht.

    Was mach ich da falsch - hab versucht das ganze mit Late-Binding zu machen...
     
    Schlauchi, 23. Dezember 2009
    #9
  10. Exl121150 Erfahrener User
    Hallo,

    stimmt, dass Outlook gestartet sein muss, sollte meine bisherige Version funktionieren - aber man kann einen kleinen Trick anwenden, der in der folgenden Sub enthalten ist, sodass das Ganze auch ohne gestartetem Outlook funktioniert:

    Code:
    Public Sub EMail_Reminder_Liste()
      Const olMailItem = 0
      Const olFolderOutbox = 4
    ' Dim olApp As Outlook.Application    '(für Early-Binding)
    ' Dim olEMailItem As Outlook.MailItem '(für Early-Binding)
      Dim olApp As Object                '(für Late-Binding)
      Dim olEMailItem As Object          '(für Late-Binding)
      Dim wshShell As Object
    
      
      Dim dbs As Database
      Dim Rst As DAO.Recordset
      Dim FamName$, VorName$, EMailAdr$, Grund$, RemDatum As Date
    ' Neue Outlook-Instanz erzeugen
    ' Set olApp = New Outlook.Application              '(für Early-Binding)
      Set olApp = CreateObject("Outlook.Application")  '(für Late-Binding)
      Set wshShell = CreateObject("WScript.Shell")
      
      Set dbs = CurrentDb
      Set Rst = dbs.OpenRecordset(Name:="Tab_Reminder", Type:=dbOpenDynaset)
      
      With Rst
         .MoveFirst
         Do Until .EOF
            FamName$ = !FamName: VorName$ = !VorName
            EMailAdr$ = !EmailAdresse
            Grund$ = !ReminderGrund: RemDatum = !ReminderDatum
            Set olEMailItem = olApp.CreateItem(olMailItem)
            With olEMailItem
              .To = EMailAdr$
              .Subject = "Erinnerung an Termin"
              .Body = "An " & VorName$ & " " & FamName$ & vbCrLf & vbCrLf & _
                      Grund$ & vbCrLf & _
                      "Termin: " & Format$(RemDatum, "DD.MM.YYYY")
            End With
            wshShell.AppActivate olEMailItem
            wshShell.SendKeys "%s"
            .MoveNext
         Loop
         .Close
      End With
      Set olApp = Nothing
      Set wshShell = Nothing
      Set Rst = Nothing
      
    End Sub
    Du musst eine zusätzliche Variable vom Typ 'Object' deklarieren:
    Dim wshShell As Object
    Dieser wird die Instanz der WScript-Shell zugewiesen:
    Set wshShell = CreateObject("WScript.Shell")
    Und die bisherige olEMailItem.Send Anweisung wird ersetzt durch:
    wshShell.AppActivate olEMailItem
    wshShell.SendKeys "%s"

    Durch die SendKeys-Methode wird an Outlook die Tastenkombination Alt+S gesendet und Outlook glaubt jetzt, der Benutzer selbst habe diese Tasten eingetippt und damit den Versand der E-Mail befohlen und fügt sich in sein Schicksal.
    Zuletzt muss/sollte die Instanz noch für die Garbage-Collection freigegeben werden:
    Set wshShell = Nothing
     
    Exl121150, 24. Dezember 2009
    #10
  11. Schlauchi Erfahrener User
    Hallo,

    hab ich jetzt mal genau so übernommen... bekomme da nur noch ein "Bing" aus den Lautsprecher (irgendeine Warnung/Info) - und das wars. Keinen Fehlercode - keine Email - kein Outlook.
    Selbst wenn ich Outlook offen habe - keine Reaktion. Das Script läuft ab - er markiert nix.
    Am Ende hab ich noch eine Msgbox eingebaut .. kommt brav. Aber die Outlook Anweisung - versickert irgendwo...
     
    Schlauchi, 24. Dezember 2009
    #11
Thema:

EMail - Tabelle automatisch abarbeiten

Die Seite wird geladen...
  1. EMail - Tabelle automatisch abarbeiten - Similar Threads - EMail Tabelle automatisch

  2. Access Tabelle in email body kopieren (nicht anhängen)

    in Microsoft Access Hilfe
    Access Tabelle in email body kopieren (nicht anhängen): Hallo zusammen, ich habe nach langem Suchen diese Funktion gefunden, die mir eine Outlook message erzeugt und die Tabelle in den Body kopiert. Code: Public Function HTMLMail(SendTo As String,...
  3. Aufgaben aus einer Excel-Tabelle an verschiedene E-Mail-Adressen verteilen

    in Microsoft Excel Hilfe
    Aufgaben aus einer Excel-Tabelle an verschiedene E-Mail-Adressen verteilen: Hallo Forum, ich bin noch nicht allzu lange registriert, konnte aber bereits viele Hilfen und interessante Ansätze aus den Beiträgen entnehmen, welche mir sehr geholfen haben. In der Hoffnung...
  4. Zwei Tabellen per Email versenden

    in Microsoft Excel Hilfe
    Zwei Tabellen per Email versenden: Hallo, ich habe zwei Tabellenblätter aus einer Mappe per Schaltfläche an einem Email Empfänger zu versenden. Den Code für den aktiven Sheet habe ich, aber wie kann ich den ändern um eben zwei...
  5. Office 2010: Excel-Tabelle per eMail versenden

    in Microsoft Excel Hilfe
    Office 2010: Excel-Tabelle per eMail versenden: Hallo, ich habe mein Office auf 2010 umgestellt und jetzt ein kleines Problem mit einem Makro. Bisher hat das Makro die Excel-Tabelle an einer neuen eMail in Outlook angefügt. Seit derr...
  6. eMail-Versand / alle Zeilen einer Tabelle

    in Microsoft Excel Hilfe
    eMail-Versand / alle Zeilen einer Tabelle: Hallo, ich benötige Hilfe für ein Excel-/VBA-Problem, da ich kein Programmierer bin. Ich habe eine Aktivitätenliste für verschiedene Personen. Die Spalten sind typisch für eine solche Liste...
  7. Tabelle mit Makro in Outlook bzw. eMail-Programm einfügen...

    in Microsoft Excel Hilfe
    Tabelle mit Makro in Outlook bzw. eMail-Programm einfügen...: Hallo, ich habe folgendes Problem mit einem kleinen Makro. Das Makro soll die Excel-Datei als Anlage zu einer eMail versenden. Dabei wird eine neue eMail geöffnet und die Datei eingefügt....
  8. Excel Tabelle via email

    in Microsoft Excel Hilfe
    Excel Tabelle via email: Hi! ich hab folgendes Problem: 1 Arbeitsmappe mit 2 tabellen 1. Tabelle enthält nur text 2. tabelle enthält verknüpfungen auf die erste tabelle ich versuche nun diese tabellen direkt...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden