Acces, problemen VBA en mails versturen

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

Anoniem: 1036373

Topicstarter
Ik heb een eigen database gemaakt in Acces. Zelf ben ik hier niet zo een krak in, maar door dingen op te zoeken en vanalles te combineren ben ik tot een database gekomen waar ik zeer tevreden over ben.
Ik verstuur vanuit de database mailtjes met automatische bijlagen (volgens het record). Bij het eerste mailtje dat ik verstuur na het openen van de database heb ik geen probleem, dan wordt de juiste bijlage toegevoegd. Maar bij de volgende mailtjes wordt er eerst de bijlage (of het record) van het vorige mailtje toegevoegd. Wanneer ik het mailtje voor de 2e keer wil versturen, voegt hij wel de juiste bijlage toe.

Dit is de code die ik nu gebruik in VBA:
Private Sub cmdMailALG_Click()


' This allowed me to output the PDF file with a specific name
' (something I don't think you can do with SendReport)
Dim strWhere As String

If Me.Dirty Then 'Save any edits.
Me.Dirty = False
End If

If Me.NewRecord Then 'Check there is a record to print
MsgBox "Select a record to print"
Else
strWhere = "[ReferteKSJ] = " & Me.[ReferteKSJ]
DoCmd.OpenReport "rptMailALG", acViewPreview, "", strWhere, acHidden
DoCmd.OutputTo acOutputReport, "rptMailALG", acFormatPDF, "\\10.0.0.5\07_administratie\07_02_Verzekering\Dossiers\NAT\Access\Briefwisseling dossieropvolging via mail\Dossier " & Me.ReferteKSJ & " - " & Me.Brief & ".pdf", False
End If

Dim appOutlook As Object
Dim MailOutlook As Object

Set appOutlook = CreateObject("outlook.Application")
Set MailOutlook = appOutlook.CreateItem(olMailItem)

With MailOutlook
' This allowed me to use the Assigned to feild on my form to designate which
'Outlook distribution list to send the e-mail to
.Recipients.Add (Forms![frmaangiftes]![Email])
If Me.ReferteKSJ = True Then
.Recipients.Add "Optionalemail@gmail.com"
End If
.Subject = "Brief verzekeringsdossier KSA " & Me.ReferteKSJ
.Body = "Beste " & Me.Voornaam
.Attachments.Add ("\\10.0.0.5\07_administratie\07_02_Verzekering\Dossiers\NAT\Access\Briefwisseling dossieropvolging via mail\Dossier " & Me.ReferteKSJ & " - " & Me.Brief & ".pdf")
.Display
' Display will bring the e-mail up so you can view or add to it. if you want it to just send use .Send
End With

Set appOutlook = Nothing
Set MailOutlook = Nothing

'This deletes the PDF
Kill ("\\10.0.0.5\07_administratie\07_02_Verzekering\Dossiers\NAT\Access\Briefwisseling dossieropvolging via mail\Dossier " & Me.ReferteKSJ & " - " & Me.Brief & ".pdf")

End Sub
Iemand een idee waar het misloopt? Of hoe ik de code kan aanpassen?

Merci!
Jarno

Alle reacties


Acties:
  • 0 Henk 'm!

  • MAX3400
  • Registratie: Mei 2003
  • Laatst online: 16-06 13:21

MAX3400

XBL: OctagonQontrol

Ik zie 0 versie-nummers genoemd maar vanaf Office 2013 is de code voor het aanroepen van Outlook anders geworden.
Dim appOutlook As Object
Dim MailOutlook As Object

Set appOutlook = CreateObject("outlook.Application")
Set MailOutlook = appOutlook.CreateItem(olMailItem)
Volgens mij werkt dit niet (altijd) meer en moet je je VBS-code gaan herzien.

Controleer ook even of & welke versies van "Microsoft Outlook Object Library Reference" aan/uit staan in je VBA-editor.

Mijn advertenties!!! | Mijn antwoorden zijn vaak niet snowflake-proof


Acties:
  • +1 Henk 'm!

  • Joep
  • Registratie: December 2005
  • Laatst online: 15:08
Dit lijkt op een probleem m.b.t. late binding en het object op de verkeerde manier aanspreken. Ik heb een dergelijk probleem laatst ook gehad. Late binding toegepast en op de verkeerde manier het object aangesproken. Dan gaat het goed de eerste keer, maar de 2e keer niet. Dit kun je oplossen door early binding toe te passen of door het Outlook-object juist aan te spreken.

Edit: En pas je post aan door de code tussen code-tags te zetten, met code = vb. Dat maakt het een stuk beter leesbaar.

Edit 2: Of het komt omdat je het MailOutlook op nothing set. Aangezien je niet MailOutlook.Close uitvoert, zou je set MailOutlook = Nothing ook niet moeten uitvoeren. Ik denk nu dat dit niet uitmaakt :P

Edit 3: Ik denk dat ik het gevonden heb :*)

Dit
[code = vb]
Set appOutlook = CreateObject("outlook.Application")[/code]

Moet dit zijn
[code = vb]
Set appOutlook = CreateObject(Outlook.Application)[/code]
Natuurlijk niet Joep |:(

Je hoeft geen referentie naar Microsoft Outlook Object in je referenties te zetten, want je past late binding toe. Mag wel, maar hoeft niet.

Edit 4: Of misschien gaat het kill-commando verkeerd?

[ Voor 58% gewijzigd door Joep op 01-02-2018 18:34 ]


Acties:
  • 0 Henk 'm!

Anoniem: 1036373

Topicstarter
Joep schreef op donderdag 1 februari 2018 @ 17:47:
Dit lijkt op een probleem m.b.t. late binding en het object op de verkeerde manier aanspreken. Ik heb een dergelijk probleem laatst ook gehad. Late binding toegepast en op de verkeerde manier het object aangesproken. Dan gaat het goed de eerste keer, maar de 2e keer niet. Dit kun je oplossen door early binding toe te passen of door het Outlook-object juist aan te spreken.

Edit: En pas je post aan door de code tussen code-tags te zetten, met code = vb. Dat maakt het een stuk beter leesbaar.

Edit 2: Of het komt omdat je het MailOutlook op nothing set. Aangezien je niet MailOutlook.Close uitvoert, zou je set MailOutlook = Nothing ook niet moeten uitvoeren. Ik denk nu dat dit niet uitmaakt :P

Edit 3: Ik denk dat ik het gevonden heb :*)

Dit
[code = vb]
Set appOutlook = CreateObject("outlook.Application")[/code]

Moet dit zijn
[code = vb]
Set appOutlook = CreateObject(Outlook.Application)[/code]
Natuurlijk niet Joep |:(

Je hoeft geen referentie naar Microsoft Outlook Object in je referenties te zetten, want je past late binding toe. Mag wel, maar hoeft niet.

Edit 4: Of misschien gaat het kill-commando verkeerd?
Bedankt alvast om mee te zoeken naar een oplossing! Ik denk niet dat het probleem bij het kill-commando ligt. Als ik in het mapje op de server ga kijken waar deze tijdelijk worden opgeslagen, is dit mapje leeg.
Maar, voor zover ik mee ben in heel het gebeuren, denk ik dat het inderdaad 1 van die 2 fouten is die je beschrijft. Maar, nu nog een oplossing, haha :)

Acties:
  • 0 Henk 'm!

  • Witte
  • Registratie: Februari 2000
  • Laatst online: 01-04 17:01
Sluit je het rapport wel af nadat je een PDF hebt gemaakt?
Wellicht dat het rapport in de achtergrond open blijft staan en dus nogmaals wordt geëxporteerd naar PDF.

Houdoe


Acties:
  • 0 Henk 'm!

Anoniem: 1036373

Topicstarter
Witte schreef op maandag 5 februari 2018 @ 11:35:
Sluit je het rapport wel af nadat je een PDF hebt gemaakt?
Wellicht dat het rapport in de achtergrond open blijft staan en dus nogmaals wordt geëxporteerd naar PDF.
Het rapport zou normaal gezien automatisch moeten worden afgesloten?
Iemand met code-kennis die dit kan nakijken in de code? Indien dit niet zo is, waar voeg ik welk regeltje code toe?

[ Voor 14% gewijzigd door Anoniem: 1036373 op 03-04-2018 15:32 ]


Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Begin eens met debuggen. Worden je records goed ververst? Vervang de hele code tijdelijk door:

Visual Basic:
1
2
3
4
5
6
7
Private Sub cmdMailALG_Click()

msgbox "ReferteKSJ:  " & Me.[ReferteKSJ] & vblf & _
              "Brief:  " & Me.[brief] & vblf & _
              "Naam: "  & Me.Voornaam & vblf & _
              "Mailadres: " & Forms![frmaangiftes]!Email)
End Sub

Kloppen de waarden die je ziet?

offtopic:
Ja, natuurlijk zijn er handiger debug methoden, maar even geen zin om die omstandig uit te leggen. En en passant haal ik ook de typo uit de titel: verturen->versturen

[ Voor 12% gewijzigd door Lustucru op 03-04-2018 21:49 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

Anoniem: 1036373

Topicstarter
Lustucru schreef op dinsdag 3 april 2018 @ 19:47:
Begin eens met debuggen. Worden je records goed ververst? Vervang de hele code tijdelijk door:

Visual Basic:
1
2
3
4
5
6
7
Private Sub cmdMailALG_Click()

msgbox "ReferteKSJ:  " & Me.[ReferteKSJ] & vblf & _
              "Brief:  " & Me.[brief] & vblf & _
              "Naam: "  & Me.Voornaam & vblf & _
              "Mailadres: " & Forms![frmaangiftes]!Email)
End Sub

Kloppen de waarden die je ziet?

offtopic:
Ja, natuurlijk zijn er handiger debug methoden, maar even geen zin om die omstandig uit te leggen. En en passant haal ik ook de typo uit de titel: verturen->versturen
Wanneer ik bovenstaande code ingeef krijg ik volgende foutmelding: "Compileerfout: Syntaxisfout". Waar loopt het mis?

Acties:
  • 0 Henk 'm!

  • Joep
  • Registratie: December 2005
  • Laatst online: 15:08
Moet "Forms![frmaangiftes]!Email" niet "Forms![frmaangiftes].Email" zijn?

Acties:
  • 0 Henk 'm!

Anoniem: 1036373

Topicstarter
Joep schreef op donderdag 19 april 2018 @ 14:56:
Moet "Forms![frmaangiftes]!Email" niet "Forms![frmaangiftes].Email" zijn?
Dit was inderdaad de oplossing! Merci!

Wanneer ik nu in mijn formulier op de knop klik, krijg ik bij elk record de juiste gegevens in de msgbox.

Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Dat is dan bijzonder: e.e. a. Is gekopieerd uit je topicstart. Apart dat die code dan wel zou compileren.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

  • Joep
  • Registratie: December 2005
  • Laatst online: 15:08
Anoniem: 1036373 schreef op donderdag 19 april 2018 @ 15:46:
[...]


Dit was inderdaad de oplossing! Merci!

Wanneer ik nu in mijn formulier op de knop klik, krijg ik bij elk record de juiste gegevens in de msgbox.
Dus het hele probleem uit de topicstart is nu opgelost door een uitroepteken in een punt te veranderen? }:O

Acties:
  • 0 Henk 'm!

Anoniem: 1036373

Topicstarter
Dat jammer genoeg niet. De fout doet zich nog steeds voor.
Het was wel de oplossing voor de test van Lustucru.

Nu we weten dat we via deze test wel steeds de juiste waarde krijgen. Hoe kunnen we dan verder met het debuggen?

Acties:
  • 0 Henk 'm!

Anoniem: 1036373

Topicstarter
Nog iemand een idee hoe ik dit zou kunnen oplossen?

Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Lustucru schreef op donderdag 19 april 2018 @ 18:00:
Dat is dan bijzonder: e.e. a. Is gekopieerd uit je topicstart. Apart dat die code dan wel zou compileren.
Geef hier eens antwoord op.


Wat me verder opvalt:

1:
code:
1
2
3
If Me.ReferteKSJ = True Then
 .Recipients.Add "Optionalemail@gmail.com"
 End If

Dit suggereert dat referteKSJ een boolean is, maar door het gebruik verderop lijkt het een identifier te zijn van het record en de bijlage. Wat is het nou?

2: Je gaat nogal slordig met je serverinstantie en objectvariabelen om. Na display (en vziw gebeurt dat asynchroon, dzw je code loopt meteen door) vernietig je de variabelen app en mailitem. Je laat dus de automationserver maar aan zijn lot over en bij een volgende mailcommando begin je vrolijk opnieuw. Hoeveel outlook instanties heb je na een paar keer opstarten draaien denk je? Je hebt ook geen enkele controle over de uitgaande mails en het outlook object meer.

Eerder zou ik er dan voor kiezen om het mailitem en outlook app op moduleniveau te definieren (with events) en te reageren op het verzenden en/of sluiten van de mail om een en ander op te ruimen. Verder moet je je afvragen of je wilt toestaan dat de gebruiker een volgende mail verstuurt als de eerste nog open staat.

[ Voor 10% gewijzigd door Lustucru op 08-06-2018 21:39 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

Anoniem: 1036373

Topicstarter
Lustucru schreef op vrijdag 8 juni 2018 @ 19:09:
[...]

Geef hier eens antwoord op.


Wat me verder opvalt:

1:
code:
1
2
3
If Me.ReferteKSJ = True Then
 .Recipients.Add "Optionalemail@gmail.com"
 End If

Dit suggereert dat referteKSJ een boolean is, maar door het gebruik verderop lijkt het een identifier te zijn van het record en de bijlage. Wat is het nou?

2: Je gaat nogal slordig met je serverinstantie en objectvariabelen om. Na display (en vziw gebeurt dat asynchroon, dzw je code loopt meteen door) vernietig je de variabelen app en mailitem. Je laat dus de automationserver maar aan zijn lot over en bij een volgende mailcommando begin je vrolijk opnieuw. Hoeveel outlook instanties heb je na een paar keer opstarten draaien denk je? Je hebt ook geen enkele controle over de uitgaande mails en het outlook object meer.

Eerder zou ik er dan voor kiezen om het mailitem en outlook app op moduleniveau te definieren (with events) en te reageren op het verzenden en/of sluiten van de mail om een en ander op te ruimen. Verder moet je je afvragen of je wilt toestaan dat de gebruiker een volgende mail verstuurt als de eerste nog open staat.
1. Wat het nu juist is, weet ik zelf ook niet meteen. Zoals in mijn eerste berichtje reeds zei, ben ik geen krak in codes schrijven en in werken met VBA. Ik kopieerde hier en daar op internet wat ik vond en voegde dit wat samen tot iets wat werkt. Maar er sluipt ergens een foutje in de code, daarom kom ik hier voor hulp.. :)
Wanneer ik op de knop met achterliggen deze code gebuik, wil ik dat er automatisch een mailtje wordt gestuurd met als bijlage een mooie PDF van de record die op dat moment actief is. Maar daar loopt het vanaf de 2e record fout, want dan voegt hij de record van het vorige mailtje toe. Tenzij ik nog een 2e keer op de knop druk, dan is het wel de juiste PDF. Maar om dit elke keer opnieuw te doen bij een nieuw record, is nogal tijdsrovend.

2. Die oplossing is al wat te technisch voor mij. Hoe pak ik dit concreet aan? Welke code voeg ik waar toe?

Acties:
  • +1 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Anoniem: 1036373 schreef op maandag 18 juni 2018 @ 12:02:
[...]


1. Wat het nu juist is, weet ik zelf ook niet [...] Ik kopieerde hier en daar op internet wat ik vond en voegde dit wat samen tot iets wat werkt. [...] Die oplossing is al wat te technisch voor mij. Hoe pak ik dit concreet aan? Welke code voeg ik waar toe?
No offence, maar ik zou je nooit productiecode toevertrouwen. Je wilt uitsluiten dat door een onoplettendheid een mail verkeerd bezorgd wordt. Dat vereist meer dan knippen en plakken: je zult zelf de code moeten begrijpen en beheersen. Ik kan je alleen maar adviseren om iemand te zoeken die een en ander voor je kan neerzetten en onderhouden en je zover kan brengen dat je op dat een zeker moment zelf ook kunt.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

Anoniem: 1036373

Topicstarter
Lustucru schreef op maandag 18 juni 2018 @ 15:57:
[...]


No offence, maar ik zou je nooit productiecode toevertrouwen. Je wilt uitsluiten dat door een onoplettendheid een mail verkeerd bezorgd wordt. Dat vereist meer dan knippen en plakken: je zult zelf de code moeten begrijpen en beheersen. Ik kan je alleen maar adviseren om iemand te zoeken die een en ander voor je kan neerzetten en onderhouden en je zover kan brengen dat je op dat een zeker moment zelf ook kunt.
Juist daarom dat ik hier ten rade kom...
Pagina: 1