Functie voor mail sturen op basis van gegevens in tabel

Status
Niet open voor verdere reacties.

nieuwenhof

Gebruiker
Lid geworden
7 jul 2015
Berichten
16
Goedemiddag,

Ik heb een tabel met facturen van klanten die niet betaald zijn en wil de klanten hiervoor een mail sturen op basis gegevens in een tabel (zie bijlage).

Het resultaat van de voorbeeld tabel zijn drie mailtjes. Voor de opbouw van de mail heb ik een voorbeeld bijgevoegd.

Wie kan mij helpen om hier een vba script voor te maken? Bij voorkeur een stuk code met uitleg, zodat ik er ook nog iets van leer (ben nieuw op het gebied van VBA/Acces...)

Alvast bedankt voor jullie input!
 

Bijlagen

Jouw vraag staat in het verkeerde forum, want dit is eigenlijk een Word vraag. Je hoeft er dus geen Access voor aan te leren, en ook geen VBA :). Kijk eens in dit draadje, dan zie je de oplossing. Overigens kun je natuurlijk ook in Access een rapport maken (zonder dat je gekke toeters en bellen nodig hebt) die het perfecte document oplevert.
 
Hallo OctaFish,

Bedankt voor je reactie.

De bedoeling is om een mail te sturen op basis van de gegevens in de tabel en niet om een word document of access rapport te maken en deze dan te verzenden als bijlage.

In dat geval zit ik toch goed in dit forum?
 
Je uitleg maakt niet heel veel duidelijker; je voorbeeldje bevat een tabel en een Worddocument. In dat Worddocument heb je pseudovelden gezet. Ik ga er dus vanuit dat je een Word document wilt maken op basis van de gegevens uit de tabel. En dan wil je dat bij voorkeur ook nog met VBA doen :). Het laatste deel van mijn 'oplossing' had overigens wél betrekking op Access (en dan zit je hier wel goed). En dat was: maak een rapport. Daar kun je standaard tekst inzetten, en de tabel uitlezen. Het resultaat kun je dan inderdaad wel mailen. In het draadje van Dinoshop vind je daar een uitwerking van. Dat is dan inderdaad VBA, want daarmee kun je e.e.a. toch wat beter regelen.

De bedoeling is om een mail te sturen op basis van de gegevens in de tabel en niet om een word document of access rapport te maken en deze dan te verzenden als bijlage.
Tja, wat wil je dan wel?
 
Ik heb het bestand niet gelezen maar een voorbeeldje van een mail VBA code die een mailtje genereert als je dubbelklikt op een tekstveld "TxtEmail" met e-mailadres op een formulier "Frm_Familie" gebaseerd op een familie tabel waarbij dat er een en ander wordt opgehaald uit enkele andere tabellen aan de hand van oa het "BNummer" of ID van de instelling om de body en subject netjes op te vullen. Je zou dit ook via een recordset kunnen doen met een loop zodat je meerdere mails na elkaar maakt maar in dit geval was het bedoeld als één persoonlijk mailtje waar je dus nog een en ander bij tikt vooraleer je de mail verzend.

Code:
Private Sub TxtEmail_DblClick(Cancel As Integer)
On Error GoTo Err_TxtEmail_DblClick
     'Uitvoerende VBA code
       Dim strBNaam As String
       Dim strBVoornaam As String
       Dim strInput As String
       Dim strMsg As String
       Dim strOpmerkingen As String
       Dim strEmail As String
       Dim strSubject As String
       Dim strBody As String
       Dim currNr As Integer
       currNr = Me.[BNummer]
       strBNaam = DLookup("BNaam", "Bewoner", "BNummer = " & currNr)
       strBVoornaam = DLookup("BVoornaam", "Bewoner", "BNummer = " & currNr)
 
        If (IsNull(Forms![Frm_Familie]![TxtEmail].Value)) Then
            MsgBox "Geen mailadres ingevuld, gelieve dit eerste doen vooraleer U een mail kunt verzenden"
            Forms![Frm_Familie]![TxtEmail].SetFocus
            Exit Sub
        End If
    
        strEmail = Forms![Frm_Familie]![TxtEmail].Value
        strSubject = "Mail betreffende " & strBNaam & " " & strBVoornaam
        strBody = "Beste " & Forms![Frm_Familie]![TxtNaam].Value & " " & Forms![Frm_Familie]![TxtVoornaam].Value & ", familielid van " & strBNaam & " " & strBVoornaam & ", " & vbCrLf & _
                  "" & vbCrLf & _
                  "graag wil ik U " & vbCrLf & _
                  "" & vbCrLf & _
                  "" & vbCrLf & _
                  "" & vbCrLf & _
                  "__________________________________________________________________________________________________" & vbCrLf & _
                  "WZC " & "" & Nz(DLookup("INaam", "Tbl_Instelling", "IHuidig=True"), "") & "" & ", " & Nz(DLookup("IStraat", "Tbl_Instelling", "IHuidig=True"), "") & "" & ", " & Nz(DLookup("IPostcode", "Tbl_Instelling", "IHuidig=True"), "") & "" & " " & Nz(DLookup("IPlaats", "Tbl_Instelling", "IHuidig=True"), "") & "" & vbCrLf & _
                  "Verantwoordelijke Sociale dienst: " & Nz(DLookup("ISocialeDienst", "Tbl_Instelling", "IHuidig=True"), "") & "" & vbCrLf & _
                  "Email: " & Nz(DLookup("ISocialeDienstMail", "Tbl_Instelling", "IHuidig=True"), "") & "" & ", Tel: " & Nz(DLookup("ITelelefoon1", "Tbl_Instelling", "IHuidig=True"), "") & ""

        DoCmd.SendObject _
        , _
        , _
        , _
        strEmail, _
        , _
        , _
        strSubject, _
        strBody, _
        True

Exit_TxtEmail_DblClick:
     Exit Sub
Err_TxtEmail_DblClick:
     Select Case Err.Number
            Case 9999
                Resume Next
            Case 999
                Resume Exit_TxtEmail_DblClick
            Case Else
            Call LogError(Err.Number, Err.Description, "TxtEmail_DblClick()")
                Resume Exit_TxtEmail_DblClick
     End Select
End Sub
 
Laatst bewerkt:
Nu ik het terug lees snap ik dat het Word bestand verwarrend is. Het Word bestand was eigenlijk bedoeld als voorbeeld hoe het mailtje eruit moet komen te zien.

Ik heb daarom nu een msg bestand toegevoegd ("Openstaande facturen.zip", ter vervanging van het Word document). Dit zou het gewenste resultaat moeten zijn van de functie.

Hopelijk is het nu wel duidelijk. Anders mijn excuses, maar ik weet niet hoe ik het anders kan uitleggen...
 

Bijlagen

Mocht het nog nodig zijn ik heb bv een functie die het volgende doet.
'Unattended een PDF versie maken van het rapport persoonlijke steekkaart
'PDF Rapport benoemen met bewonernaam, voornaam en documentnummer
'Wegschrijven van dit PDF rapport naar de map van de corresponderende bewoner bij de fiches
'Al dan niet opmerking intikken in de body van de mail
'Eigenlijke rapportopdracht uitvoeren en de PDf als bijlage bij die mail plaatsen
'Mail versturen naar sociale dienst van de instelling al dan niet met een BCC van de mail naar de bewoner zelf

Met een beetje aanpassing zou je dus een PDF rapport hebben van je "rappel" die je ergens automatisch bijhoudt op je PC en die rappel(s) worden dan verstuurd als bijlage bij een mail naar al wie U wenst.
 
Kun je CODE tags om de code heenzetten? Dit is lastig lezen.
 
Code:
Private Sub NotifyAll_Click()
On Error GoTo EH
    Dim dbCustomers As Database
    Dim rstCustomers As Recordset
    Dim dbCustomerInfo As Database
    Dim rstCustomerInfo As Recordset
    Dim intCustomerRecords As Integer
    Dim strSQL As String
    Dim strTo As String
    Dim strCC As String
    Dim strSubject As String
    Dim strBody As String
    Set dbCustomers = CurrentDb()
    strSQL = "SELECT * FROM tblCustomers GROUP BY CustomerName;"
    Set rstCustomers = dbCustomers.OpenRecordset(strSQL, dbOpenDynaset)
    If Not rstCustomers.EOF Then
        rstCustomers.MoveFirst
        Do While Not rstCustomers.EOF
            strTo = rstCustomerInfo("CustomerEMail")
            strCC = "Any other recipients"
            strSubject = "E-mail Subject Line"
            strBody = "Dear " & rstCustomers("CustomerName") & vbCrLf & vbCrLf
 
            strSQL = "SELECT * FROM tblCustomers WHERE CustomerName = '" & rstCustomers("CustomerName") & "';"
            Set rstCustomerInfo = dbCustomers.OpenRecordset(strSQL, dbOpenDynaset)
            If Not rstCustomerInfo.EOF Then
                rstCustomerInfo.MoveLast
                intCustomerRecords = rstCustomerInfo.RecordCount
                rstCustomerInfo.MoveFirst
            Else
                intCustomerRecords = 0
            End If
            strBody = strBody & "We found " & intCustomerRecords & _
                " records on file with us." & vbCrLf & vbCrLf
            Do While Not rstCustomerInfo.EOF
                strBody = strBody & rstCustomerInfo("NotificationItem") & _
                    rstCustomerInfo("Notification Date") & vbCrLf
            Loop
            rstCustomerInfo.Close
            strBody = strBody & "We appreciate your quick response to us, blah blah blah."
            'NOTE:  for this type of e-mail, I prefer to use the SendObject Method...
            DoCmd.SendObject acSendNoObject, , , strTo, strCC, , strSubject, strBody, True
        Loop
        dbCustomerInfo.Close
        rstCustomers.Close
        dbCustomers.Close
    End If
    Exit Sub
EH:
    MsgBox Err.Number & " " & Err.Description
    Exit Sub
Exit Sub
 
Yep! Ga gelijk lezen :).
 
Ter voorkoming van muisarmen zou ik dan de vorige code verwijderen :).
 
De code is op verzoek verwijderd. Ik ben benieuwd of iemand mij verder kan helpen?
 
Willen of kunnen is het probleem niet; tijd wel :). Geduld is een schone zaak. Toch? We zijn hier wel allemaal vrijwillig namelijk :D.
 
Leg trouwens eerst eens uit waarom je niet een rapport wilt mailen; wat jij wilt kan in beginsel wel, maar vereist behoorlijk wat programmeerwerk om het goed te krijgen. En de vraag is natuurlijk: is die inspanning het doel wel waard?
 
Sorry voor de late reactie, maar ik ben er even tussenuit geweest :-)

Voor de ontvanger zijn het meer handelingen om het rapport te bekijken, dan de gegevens te bekijken in de body van de email.
Ik wil het voor de ontvanger (klant) zo eenvoudig mogelijk aanbieden. Vandaar dat ik heb gekozen voor deze functionaliteit.

Is het echt zoveel werk/lastig om dit te maken?
 
Ik weet niet of je het gebruikersgemak moet laten prevaleren boven uniformiteit. Probleem met mailtekst is, dat je geen controle hebt over de inrichting van de mailclient. Je weet dus nooit hoe de mail er ij je klant uitziet. Stuur je een PDF mee, dan heb je die controle wél. Daarnaast heeft de klant dan een fysiek bestand dat hij/zij weer kan opslaan voor de eigen administratie. Stuur je alleen een mail, dan heb je dat niet. Bovendien is toch iedereen er wel aan gewend om te dubbelklikken op een bijlage?
Kortom: het kan allemaal wel, en er zijn ook zat voorbeelden te vinden, bijvoorbeeld deze. Maar je moet dus allerlei HTML tags meegeven en dat maakt het er allemaal niet makkelijker op.
 
Het lukt me hier niet om een database te uploaden maar misschien kan je hier iets mee.

ik heb een query gemaakt qryFactuur:
Code:
SELECT TblKlantFacturen.KlantNaam, TblKlantFacturen.FactuurNummer, TblKlantFacturen.FactuurDatum, TblKlantFacturen.FactuurBedrag
FROM TblKlantFacturen;

en een query QryKlant:
Code:
SELECT TblKlantFacturen.KlantNaam, TblKlantFacturen.FactuurNummer, TblKlantFacturen.FactuurDatum, TblKlantFacturen.FactuurBedrag
FROM TblKlantFacturen;

vervolgens deze code onder een knop op een formulier.
hier werkt het.


Code:
Private Sub Knop10_Click()

Dim TekstEmail As String

'open de eerste klant in de query met te zenden klanten
With CurrentDb.OpenRecordset("qryklant")
    .MoveFirst
    Do While Not .EOF
       
    Dim OutApp As Object
    Dim OutMail As Object

    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)

    MailAdresAlgemeen = !EmailAdres
    OnderwerpAlgemeen = "rekening niet betaald"
    
        'vullen mail inhoud met factuur gegevens klant
        Set r = CurrentDb.OpenRecordset("SELECT * FROM qryfactuur where (((TblKlantFacturen.KlantNaam)='" & !KlantNaam & "'))", dbOpenSnapshot)
        TekstEmail = "factuurnummer  datum bedrag"
        With r
            .MoveFirst
            Do While Not .EOF
            TekstEmail = TekstEmail & vbCrLf & r("factuurnummer") & " " & r("factuurdatum") & " " & r("factuurbedrag")
            .MoveNext
            Loop
        End With
    
       
    On Error Resume Next
'mail samenstellen
    With OutMail
        .To = MailAdresAlgemeen
        .CC = ""
        .BCC = ""
        .Subject = OnderwerpAlgemeen
        .Body = TekstEmail
        '.Attachments.Add bestandAlgemeen
        '.Send
        .display
        If Send = True Then
            .Send
        Else
            .display
        End If
    End With
    On Error GoTo 0

    Set OutMail = Nothing
    Set OutApp = Nothing
        .MoveNext
    'herhalen tot einde van de recordset
    Loop
End With
End Sub
 
Beste jwaque, het werkt bij mij ook! Bedankt, hier kan ik zeker iets mee.

Ik ga het topic dan ook sluiten. Iedereen bedankt voor zijn/haar hulp en input!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan