Emailen van bestanden met steeds wisselende namen vanuit Access

Status
Niet open voor verdere reacties.

Henneke50

Gebruiker
Lid geworden
17 aug 2021
Berichten
27
Kan iemand mij even verder helpen bij het emailen van meerdere bijlagen vanuit Access.

De situatie is als volgt:
• Vanuit Access worden voor een client een aantal rapporten aangemaakt (maximaal 4 per client).
• De rapporten (op clientniveau) worden via een druk op een button automatisch opgeslagen als pdf-bestand in de map e:\documenten\submap\submp\Digitaal verstuurde bestanden
• De pdf-bestanden krijgen steeds een unieke naam afhankelijk van de overeenkomst, de klant, het soort rapport (o.a. het rapport Overeenkomst, Factuur ect) bijv:
o 9878 Puk, P (Stadje) Overeenkomst dd 20210108.pdf
o 9878 Puk, P (stadje) Factuur 2021-125.pdf
o Etc.

Het emailen van meerdere rapporten met een vaste naam op basis van onderstaande lukt prima

Private Sub Selectievakje_1522_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

Dim OutApp As Object
Dim OutMail As Object

Set OutApp = CreateObject("Outlook.Application")
OutApp.Session.Logon

Set OutMail = OutApp.CreateItem(0)
With OutMail
.To = "" ' "PietjePuk@gmail.com" 'Het werkt niet als er punten in het emailadres staan
.Subject = "Bestanden"
.Body = "Hi! This is a test message"
.Attachments.Add "E:\Documenten\Submap\Submap\Digitaal verstuurde estanden\test.pdf"
.Attachments.Add "E:\Documenten\ Submap\Submap\Digitaal verstuurde bestanden \test2.pdf"

'.Send 'Meteen verzenden
.display 'Eerst tonen zodat je nog kunt aanpassen
End With

Set OutMail = Nothing
Set OutApp = Nothing

End Sub

Ik zou echter willen dat er geen vaste namen maar steeds de bestanden met de unieke bestandsnamen per client worden verstuurd.

Op dit forum en ook andere Engelstalige forums heb ik gezocht hoe dit te doen, maar kom er nog niet goed uit.

De map wordt steeds nadat de bestanden verstuurd zijn leeggemaakt met kill.

In feite komt het er dus op neer dat ik vanuit Access een email wil versturen met alle pdf-bestanden met steeds wisselende namen die in een vaste map staan. Er staan dus alleen de bestanden in die moeten worden verstuurd en daarna wordt de map leeggemaakt.
Wie kan me op weg helpen?
 
Dan kan je voordat je gaat mailen de namen van de bestanden bepalen.
Die zet je dan in een variabele die je weer voor Attachments.Add gebruikt.
 
Dank je voor de snelle reactie.
Ik ben echter niet zo'n ervaren gebruiker om dit zelf te doen. :rolleyes: Is er ergens een voorbeeld van te vinden??
 
In je voorbeeld code:
Code:
Private Sub Selectievakje_1522_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim OutApp As Object
    Dim OutMail As Object
    
[COLOR="#FF0000"]    Dim PDF1 As String
    Dim PDF2 As String[/COLOR]
    
[COLOR="#FF0000"]    PDF1 = "E:\Documenten\Submap\Submap\Digitaal verstuurde estanden\test.pdf"
    PDF2 = "E:\Documenten\ Submap\Submap\Digitaal verstuurde bestanden \test2.pdf"[/COLOR]
    
    Set OutApp = CreateObject("Outlook.Application")
    OutApp.Session.Logon
    
    Set OutMail = OutApp.CreateItem(0)
    With OutMail
        .To = "" ' "PietjePuk@gmail.com" 'Het werkt niet als er punten in het emailadres staan
        .Subject = "Bestanden"
        .Body = "Hi! This is a test message"
        .Attachments.Add [COLOR="#FF0000"]PDF1[/COLOR]
        .Attachments.Add [COLOR="#FF0000"]PDF2[/COLOR]
        
        '.Send 'Meteen verzenden
        .Display 'Eerst tonen zodat je nog kunt aanpassen
    End With
    
    Set OutMail = Nothing
    Set OutApp = Nothing
End Sub

Als je die variabelen Public decareert kan je die bestandsnamen ook in andere Subs bepalen.
 
Laatst bewerkt:
Ik mis de code waarmee je de pdf maakt op basis van je rapport. Die kun je uiteraard prima uitbreiden met de mail functie.
 
Laten we zeggen dat je het slim wilt oplossen, omdat je zo te zien meerdere rapporten tegelijk wilt versturen. Dan zou ik daarvoor een functie gebruiken die je aanroept vanuit een knop op je formulier (jij gebruikt een hele bijzondere trigger overigens, maar dat terzijde) die de gegevens verzamelt en naar de functie stuurt. Die functie kan er dan zo uitzien:
Code:
Function exportPDF(Klant As String, Soort As String, Rapport As String, eMail As String)
'Input:
'- Klant = Klantnaam (9878 Puk, P)
'- Soort = Soort document (Overeenkomst, Factuur)
'- Rapport = Rapportnamen gescheiden door een speciaal teken (|, ; etc)
'- Email = Email adres


Dim fldrPath As String, FilePath As String, Answer As Integer
Dim OutApp As Object, OutMail As Object, rpt As Variant
Const sep As String = "|"


    'set export path
    fldrPath = "E:\Documenten\" & Klant & "\" & Soort & "\Digitaal verstuurde bestanden"
    
    'Export report
    If Dir(FilePath) <> "" Then
        Answer = MsgBox(prompt:="PDF file already exists: " & vbNewLine & FilePath & vbNewLine & vbNewLine & _
            "Would you like to replace existing file?", buttons:=vbYesNo, Title:="Existing PDF File")
        If Answer = vbNo Then Exit Function
    End If
    DoCmd.OutputTo acOutputReport, "Rapportnaam", acFormatPDF, FilePath


    'Mail reports as attachment
    rpt = Split(Rapport, sep)
    Set OutApp = CreateObject("Outlook.Application")
    With OutApp
        .Session.Logon
        Set OutMail = .CreateItem(0)
        With OutMail
            .to = eMail
            .Subject = "Bestanden" & Format(Date, "dd-mm-yyyy")
            .Body = "Hi! This is a test message"
            For i = LBound(rpt) To UBound(rpt)
                FilePath = fldrPath & "\" & rpt(i) & Format(Date, "_yyyymmdd") & ".pdf"
                .Attachments.Add FilePath
            Next i
            '.Send              'Meteen verzenden
            .display            'Eerst tonen zodat je nog kunt aanpassen
        End With
    End With
    Exit Function
 
invalidFolderPath:
    MsgBox prompt:="Error: Invalid folder path. Please update code.", buttons:=vbCritical
 
End Function

Voor nóg betere hulp, willen we uiteraard de database zien :). Al was het maar vanwege die bijzondere trigger :d.
 
Edmoor en AccessGuru,

Dank voor jullie reacties. Vanavond hoop ik dat ik dat ik jullie info verder kan bekijken en uittesten, daarna laat ik altijd iets weten.
 
In mijn voorbeeld functie ga ik er vanuit dat de noodzakelijke mappen al bestaan. Anders werkt de functie uiteraard niet. Heb je nog geen mappen, of wil je ze geautomatiseerd aanmaken, dan is de functie redelijk simpel uit te breiden zodat je dat óók automatisch regelt. Zelf doe ik dat bijvoorbeeld wel, want wat is het nut van zelf mappen aanmaken als dat óók automatisch kan?
 
Zoals beloofd even een update.

De variabelen in de code zoals Edmoor had aangeraden heb u ik uitgeprobeerd maar kreeg ik jammer genoeg niet aan de praat.

De code die AccessGuru postte heb ik zo goed als mogelijk bestudeerd.
Als ik het goed begrijp raadt hij per cliënt en map aan, met daaronder per soort document en submap. Zoals door mij aangegeven zijn er maximaal 4 rapporten op cliëntniveau die gelijktijdig verstuurd moeten worden.
Met het aantal cliënten per jaar lijkt mij (als klopt dat er zoveel mappen per cliënt moeten komen) dit geen wenselijke zaak. Het is mogelijk om mappen automatisch aan te maken en ongetwijfeld zal het dan ook mogelijk zijn (om nadat de bestanden uit de mappen zijn verstuurd), de mappen automatisch te verwijderen.

Ik ben daarom toch maar weer verder op zoek gegaan op internet. Op de site van
Stackoverflow.com kwam ik op het excelforum de volgende vraag tegen: Attach multiple files or entire directory to email waar een code op stond.

In eerste instantie werkte deze code niet, maar na een aantal aanpassingen lukt het mij nu ook alle bestanden uit de map 'Digitaal verstuurde bestanden' in één email te versturen.

Hieronder de code die voor mij werkt.

Code:
Private Sub Selectievakje_1522_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    
Dim mess_body As String, StrFile As String, StrPath As String
    Dim OutApp As Object
    Dim Outmail As Object

    Set OutApp = CreateObject("Outlook.Application")
    OutApp.Session.LogOn
    
    Set Outmail = OutApp.CreateItem(0)

    '~~> Wijzig hier het pad
    StrPath = "E:\Documenten\submap\submap\Digitaal verstuurde contracten\"

    With Outmail
         .To = ""       '"test@test.org"
        .Subject = "test"
        .Body = "test"

        '~~> *.* Alle bestanden in de geselecteerde map worden als bijlage bij de email gevoegd
        StrFile = Dir(StrPath & "*.*")

        Do While Len(StrFile) > 0
            .Attachments.Add StrPath & StrFile
            StrFile = Dir
        Loop
        
        MsgBox "Er is een email aangemaakt en alle bijlagen uit de map "E:\Documenten\submap\submap\Digitaal verstuurde bestanden\" zijn bijgevoegd. ", vbOKOnly
       '.DeleteAfterSubmit = True
        .Display
    End With
     
    Set Outmail = Nothing
    Set OutApp = Nothing

End Sub

Edmoor en AccessGuru bedankt voor jullie hulp, het heeft me ertoe gebracht om andere zoektermen te gebruiken met uiteindelijk het gewenste resultaat!!

Henneke
 
Als ik het goed begrijp raadt hij per cliënt en map aan, met daaronder per soort document en submap.
Omdat we geen database hebben, en alleen jouw code, moeten we maar een beetje gokken wat je precies wilt. Daarom gaf ik een ideetje (klant map + submap) waar je wellicht wat aan zou kunnen hebben. Daar hoef je uiteraard geen gebruik van te maken. De technisce oplossing zat ook in mijn code. Daarvoor had je dus geen 'uitstapje' hoeven maken. Alles had je, kortom, uit mijn voorbeeldje zelf kunnen plukken :). Ik ben nog steeds benieuwd naar jouw beweegreden om MouseDown te gebruiken op een selectievakjo. Daar zou ik dus never nooit niet naar grijpen. Al was het maar omdat je daarmee de toetsenbordbediening voorbijgaat. Gebruik simpele oplossingen die voor iedere gebruiker bruikbaar zijn.
 
Bij mij hebben de selectievakjes 8 opties waar je een gebeurtenis kunt vastleggen.
- Bij focus (2)
- Bij muis (3)
- Bij toets (3)
Mijn voorkeur zou uitgegaan zijn naar Bij klikken of Bij dubbelklikken, echter die opties worden niet aangeboden.

Ervan uitgaande dat de gebruiker bij het invullen / aanvullen van het formulier en bij het selecteren van een van de opties met een vinkvakje toch de muis al veel gebruikt heb ik voor een van de opties Bij muis, in dit geval Bij muis omlaag gekozen.
De gebruiker klikt op het keuzevakje en de achterliggende gebeurtenis wordt gestart.
Alle keuzevakjes (in een ladder) staan op er en apart tabblad in een formulier dus je kunt niet zomaar een gebeurtenis starten als je bij het vinkvakje in de buurt bent.

Als je een betere optie hebt hoor ik me aanbevolen
 
Ik zit nog even te kijken, en je vertelt volgens mij nu iets anders: je gebruikt namelijk m.i. geen selectievakjes, maar een Groepsvak. En dat werkt inderdaad anders:

Eigenschappen Keuzerondjes.jpg

En dat werkt inderdaad anders. Dan nog gebruik je de keuzerondjes verkeerd, want je vangt de verkeerde optie af. Een Groepsvak heeft namelijk zelf óók eigenschappen die je kan gebruiken. Om te beginnen: standaard krijgt elk keuzerondje een eigen waarde. Meestal een getal, beginnend bij 1. Dus Keuzerondje1 krijgt de Optiewaarde 1, Keuzerondje2 krijgt de Optiewaarde 2 en zo verder. Het Groepsvak heeft wél een gebeurtenis <Bij Klikken> en dát zou je dus moeten gebruiken om de gekozen waarde te verwerken. Zelf doe ik dat, zeker als het 8 opties zijn, een Select Case waarbij je de keuze afvangt. Dat ziet er dan ongeveer zo uit:

Code:
Private Sub Kader18_Click()
    Select Case Me.Kader18.Value
        Case 1
            MsgBox "Dit is de eerste keuze", vbOKOnly
        Case 2
            MsgBox "Dit is de tweede keuze", vbOKOnly
        Case 3
            MsgBox "Dit is de derde keuze", vbOKOnly
        Case 4
            MsgBox "Dit is de vierde keuze", vbOKOnly
    End Select
End Sub
 
Ja ik gebruik een groepsvak en dan kun je - als je dat aanmaakt - kiezen voor keuzerondjes of vinkvakjes.
Ik heb voor vinkvakjes gekozen.
Bij een aantal vinkvakjes roep ik een macro aan, bij andere een gebeurtenisprocedure. Zodra ik tijd heb ga ik kijken hoe dit (per optie)in de code van het van het groepsvak kan verwerken.

Dank je wel voor jouw reactie
 
Ik heb voor vinkvakjes gekozen.
Slechte keuze. Niet vanwege de werking, maar vanwege de onderliggende systematiek. Elke willekeurige computergebruiker weet: als ik 8 selectievakjes zie, dan kan ik 8 keuzes aanvinken. Want dát is de functie van een selectievakje: meerdere opties selecteren. Daarentegen weet diezelfde gebruiker ook: als ik 8 Optierondjes zie, dan mag ik uit de lijst maar één waarde selecteren. Want dát is het doel van Keuzerondjes. En nou ga jij je gebruikers dus in verwarring brengen door ze de werking van keuzerondjes te geven met het aanzien van een meerkeuze selectie. Handig....

Bovendien maakt het voor het Groepsvak niet uit wat je gebruikt: de werking is (volgens mij; ik zou niet weten hoe ik dat moest aanpassen) namelijk die van de Keuzerondjes. Dus maar één keuze die je mag maken. Je kan ook wisselknoppen gebruiken: zelfde resultaat.

Kortom: gebruik het Groepsvak op de juiste manier. En vang de gekozen waarde af met de Groepsvak eigenschap. Jouw werkwijze met al die losse macro's en procedures, zijn vele malen overzichtelijker en dus makkelijker in die ene code op te vangen.
 
AccessGuru, ik waardeer erg dat u op mijn vragen op Helpmij reageert. Ik heb niet de kennis die u heeft en daarom heb ik me aangemeld op het forum.

Dingen waarvan u aangeeft dat ze beter / anders kunnen zal ik dan ook zeker ter harte nemen en daar waar mogelijk verbeteren, zeker als het daardoor overzichtelijker wordt.
Maar c’est l ton que fait la musique. Uw toon in uw reacties geeft me het gevoel dat ik een nitwit ben en daar ben ik minder blij mee.

Als ik werk met de groepswizard dan krijg ik de mogelijkheid te kiezen uit Keuzerondje, Selectievakjes en Wisselknoppen. Een toelichting wanneer wat is op de website van Microsoft aanwezig. Zover ik nu kan zien worden de acties die ik aanroep via het aanklikken van meerdere selectievakjes na elkaar ook na elkaar gestart, maar ik zal me daar in de toekomst eens verder in verdiepen en ben me bewust dat dit ook te maken kan hebben met de macro’s en/of gebeurtenisprocedures die ik aan een selectievakje heb gekoppeld. Ik open er rapporten mee.
Dank voor uw feedback en een hele prettige avond!
 
Instrumenten kunnen ontstemd raken, dat is nou eenmaal eigen aan die dingen :). Het was uiteraard niet de bedoeling om je als nitwit te kwalificeren. Neemt niet weg dat de inhoud van mijn betoog recht overeind blijft staan wat mij betreft. Ik neem het jou ook niet zozeer kwalijk dat je voor de selectievakjes kiest, maar Microsoft. Die bouwen allerlei onzin in Access die de nietsvermoedende gebruiker zaken laat gebruiken die eigenlijk nergens op slaan, zoals selectievakjes gebruiken waar er geen sprake is van meervoudige keuzes. Dan moet je die optie er ook niet in zetten, wat mij betreft. Zo zijn er heel wat meer zaken in Access geslopen die er wat mij betreft niet in thuis horen.

Zover ik nu kan zien worden de acties die ik aanroep via het aanklikken van meerdere selectievakjes na elkaar ook na elkaar gestart,
En dát komt nou doordat je de acties aan de selectievakjes hebt gehangen, en niet aan het Groepsvak. Als je de gebruiker meerdere rapporten tegelijk/na elkaar wil laten openen, dan kun je daar ook aparte knoppen voor maken. Dan is een groepsvak dus in essentie niet zo geschikt en maak je het jezelf alleen maar nodeloos moeilijker. Maar wil je dat de gebruiker één rapport opent, dan kan dat wel via een groepsvak. Zelf zou ik overigens nog steeds kiezen voor losse knoppen, omdat de rapporten die je wilt laten afdrukken in essentie niets met elkaar te maken hebben. Eén keuzelijst met daarin de 8 rapporten en één actie die de rapporten opent werkt dan vermoedelijk nog beter en sneller.

Voor het openen van 8 rapporten zou je in beginsel ook maar één procedure nodig hoeven te hebben. Maakt niet uit of je dat kiest via een groepsvak of een keuzelijst. De namen van die rapporten haal je dan uit de keuzelijst of het groepsvak.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan