Niquet.nl

Onderwerp van geselecteerde Outlook-mail hernoemen

Bijlagen in Outlook-mail hernoemen

Met onderstaande code kan je één voor één de bijlagen van EEN GESELECTEERDE  outlook mail wijzigen.

Categorieën toekennen o.b.v. handtekeningen

Met onderstaande VBA code worden alle mailtjes in een hard gecodeerde Outlook folder gecontroleerd welke volledige namen (zoals in handtekening) bevatten en op basis daarvan gehangen aan de betreffende categorie.

 

Betalingsherinneringen mailen via Outlook (HTML mail)

Uiteraard is dit op zoveel manieren in te richten, maar hieronder volgt een uitleg hoe ik dit heb gedaan.

Let op: niet alle HTML styling werkt standaard voor alle e-mail clients. Dus sommige HTML ziet er prima uit in je browser, maar absoluut niet in Outlook of ander mail client.

We hebben – afgezien van Access en Outlook – het volgende nodig:

  1. Een tabel/query met alle openstaande facturen per debiteur (detailinfo)
  2. Een tabel/query met de aan te manen debiteuren (afgeleid van tabel / query genoemd bij ‘1’ incl. Emailadres en taalcode
  3. Een VBA procedure 
  4. Een macro die deze procedure start
  5. Een  Access-rapport kan heel goed ‘automatisch’ gestart kan worden vanuit de Windows taakplanner (Scheduler), mits je zeker weet dat alle gegevens zijn bijgewerkt. 
    Voor het sturen van betalingsherinnering – zoals in dit voorbeeld – is dit een stuk lastiger omdat je uiteraard wel wilt dat alle verzonden verkoopfacturen op je herinnering staan EN dat alle bankmutaties (i.c. ontvangsten) zijn ingeboekt.
  6. Mailbody bestaande uit 3 secties:
    1. tekst VOOR tabel (incl CSS styling –> VBA object converteert dit naar inline styling)
    2. Tabel met openstaande posten
    3. Mailbody / tekst NA tabel

Voor het gemak heb ik een tabel aangemaakt waarin ik twee velden heb aangemaakt van het type ‘Grote tekst” of “Memo” genaamd: “TekstVoorTabel” en “TekstNaTabel”.

Tip: Het beste is – zeker als je de teksten wilt wijzigen in deze tabel – om een formulier te maken en in te stellen dat je met de enter toets naar de volgende regel gaat i.p.v. naar het volgende veld.

Hierin type of plak je de HTML code/script/tekst die je later in je VBA code kunt oproepen met de DLOOKUP functie bijvoorbeeld.

Een voorbeeld van een “TekstVoorTabel”:

Lijst bijwerken op basis van knop

Met een knop een listbox (formulier control) vullen met waarden op basis van een SQL query gefilterd op een waarde in een tekstveld elders in het formulier.

Datumveld genaamd “BetaalDatum”
Lijst control genaamd “lstCred”

Lijst moet gevuld worden met alle betaalde crediteuren op de datum ingevuld in veld ‘BetaalDatum’.

Hiervoor heb ik een private sub aangemaakt die ik aanroep zodra datum geselecteerd is met 

‘CALL Lijstupdate(datum)

 

 


Private Sub LijstUpdate(dat As Date)

Dim SQL As String
Dim BetaalDatum As String

Dim aant As Integer
Dim ctl As Control

DoCmd.Echo False

'Betaaldatum converteren naar tekst
BetaalDatum = Format(dat, "yyyy-mm-dd")

'Eerst checken of die dag überhaupt betalingen waren
aant = DCount("*", "_Betaalspecificatie_Betaalbaar", "[BetaalDatum] = #" & BetaalDatum & "#")

If aant > 0 Then

    SQL = "SELECT Betaaldatum, Crediteurnummer, Emailadres,   zoeknaam, naam, Aantal, Betaald " & _
    "FROM _Betaalspecificatie_Betaalbaar " & _
    "WHERE Betaaldatum = #" & BetaalDatum & "# " & _
    "ORDER BY zoeknaam;"

    Else
    
    SQL = "select distinct 'Geen' as CDCREDITEUR, 'Geen' AS ZOEKNAAM,  'Geen' AS 
    NAAM, 'Geen' as Email FROM _Betaalspecificatie_Betaalbaar"


End If


Me.lstCred.RowSource = SQL
Me.lstCred.Requery


DoCmd.Echo True

MsgBox "Lijst bijgewerkt."


De onderliggende query is zo opgebouwd dat als er geen e-mailadres bekend is, dat dan m’n eigen e-mailadres wordt getoond.

Met onderstaande code loop ik door alle crediteuren heen en selecteer alleen de crediteuren waarvan een e-mailadres bekend is.

Het e-mailadres staat in derde kolom van de lijst,en aangezien de lijst zero-based is, is index van het veld 2:

 


Private Sub knpSelecteerJuisteEmail_Click()

Dim lijst As ListBox
Set lijst = Me.lstCred
Dim itm As Object
Dim i As Integer
Dim msg As String

   For i = 0 To lijst.ListCount - 1
       If lijst.Column(2, i) = "eigen@emailadres.com" Then
            lijst.Selected(i) = False
       Else
           lijst.Selected(i) = True
       End If
   Next i

End Sub

Tonen lijst met alle aanwezige drives (Filesystemobject)

Met de volgende code genereer je een berichtenvenster met alle drives:

Sub drives()

    Dim fso As FileSystemObject
    Dim driveColl As drives
    Dim drive As drive
    
    txtDrives = ""
    
    Set fso = New FileSystemObject
    Set driveColl = fso.drives
    
    For Each drive In driveColl
        txtDrives = txtDrives & "Drive Letter: " & drive.DriveLetter '& vbCrLf
        
        If drive.IsReady Then
            txtDrives = txtDrives & " / Ready: " & drive.VolumeName
            
        Else
            txtDrives = txtDrives & " / Not ready" & vbCrLf
        End If
        txtDrives = txtDrives & vbCrLf
    Next

    MsgBox txtDrives

End Sub

Inlezen handtekening in (Outlook)mail

Als je een Outlook-mailitem aanmaakt op een account waar een default handtekening is ingesteld dan kan je door het inrichten van de mailitem deze handtekening opnemen door de olMailItem.HTMLbody te vullen door de evt gegenereerde bodytekst + olMailItem.HTMLbody.

Maar je kunt de handtekening ook inlezen door gebruik te maken van het inlezen van de html – file.

De reeds aangemaakte handtekeningen staan waarschijnlijk in je Roaming directory,  bijv:

“c:\users\<gebruikersnaam>\AppData\Roaming\Microsoft\Signatures\”

Maar je kunt uiteraard een handtekening inlezen die elders staat. 

Allereerst moet je refereren naar “Microsoft Scripting Runtime” om gebruik te kunnen maken van de “Filesystemobject”.

Maak dan de volgende module / code aan:

 


Dim olApp as outlook.Application
Dim olMail as Outlook.Mailitem
Dim olMailTekst as string
Dim FSO as Scripting.FileSystemObject
Dim tsTextIn as Scripting.TextStream
Dim strTextIn as String
Dim strFile as string

'Inlezen handtekening
strFile = "C:\Users\\AppData\Roaming\Microsoft\Signatures\Standaard.htm"
Set FSO= New Scripting.FileSystemObject
Set tsTextIn = FSO.OpenTextFile(strFile)
strTextIn = tsTextIn.ReadAll

'Ingelezen HTML script van Handtekening plakken onder de gewenste bodytekst
olMailTekst = "

Dit is een test

Lekker veel tekst

" olMailTekst = olMailTekst & vbLf & strTextIn 'Initiëren Outlook mail set olApp = new Outlook.Application set olMail = olApp.CreateItem(0) With olMail .to = "test@mail.nl" .Subject = "Testonderwerp" .HTMLBody = olMailTekst .display End With

Relink gelinkte tabellen in Access

Als je een Access database gebruikt op meerdere PC’s en deze wordt gesynchroniseerd met Onedrive, dan kan het zijn dat een gekoppelde bestand op een ander pad staat. 

Dan werkt onderstaande code om te relinken:

 


Public Function reLinkTables() As Boolean
On Error GoTo ErrorRoutine
Dim sMyConnectString        As String
Dim tdf                     As TableDef
Dim db_name                 As String
    ' The Main Answer is by Martin Thompson
    ' Modified by Dr. Mohammad Elnesr
    'We will link all linked tables to an accdb Access file located in the same folder as this file.
    'Replace the DATA file name in the following statement with the name of your DATA file:
    sMyConnectString = ";DATABASE=" & CurrentProject.Path & "\"
    For Each tdf In CurrentDb.TableDefs
        If Len(tdf.Connect) > 0 Then
            'It's a linked table, so re-link:
            'First, get the database name
            db_name = GetFileName(tdf.Connect)
            ' Then link the table to the current path
            If tdf.Name = "Tbl_CorrectieInkoopEindejaar" Then
            
            tdf.Connect = sMyConnectString & db_name
            tdf.RefreshLink
            End If
            
        End If
    Next tdf


ExitRoutine:
 '   MsgBox "All tables were relinked successfully"
    Exit Function
ErrorRoutine:
  '  MsgBox "Error in gbLinkTables: " & Err.Number & ": " & Err.Description
    Resume ExitRoutine
End Function

Aanmaken afspraak/meeting in Outlook vanuit Excel

Stappen:

  1. Maak een Excel bestand aan en sla deze op als een Macro enabled workbook, bijv. “Outlouk-agenda vanuit Excel.xlsm”
  2. Maak in eerste tabblad (hernoem deze naar ‘agenda’) op de eerste regel de volgende kolomkoppen aan:
    • Agenda – account
    • Onderwerp
    • Locatie
    • Body
    • Datum
    • start
    • eind
    • Hele dag
    • Categorie

Het ziet er dan als volgt uit:

 

Sub MakenOutlookAfspraak()
    
    Dim olApp As Outlook.Application
    Dim olNS As Outlook.Namespace
    Dim calFld As Outlook.Folder
    Dim olAppItem As Outlook.AppointmentItem
    Dim r As Long
    
    On Error Resume Next
    Worksheets("agenda").Activate
    Set olApp = New Outlook.Application

    On Error GoTo 0
    'Checken of Outlook is geïnstalleerd / beschikbaar is
    If olApp Is Nothing Then
        On Error Resume Next
        Set olApp = New Outlook.Application
        On Error GoTo 0
        If olApp Is Nothing Then
            MsgBox "Outlook is not available!"
            Exit Sub
        End If
    End If
    
    Set olNS = olApp.GetNamespace("MAPI")
    
    r = 2 ' eerste rij waar een afspraak is vastgelegd / moet vastgelegd zijn
    Dim account, onderwerp, Start, Einde, kalender, locatie, omschrijving
    
    
    While Len(Cells(r, 1).Text) <> 0
        account = Cells(r, 1) 
        Set calFld = olNS.Folders(account).Folders("Agenda")
        Set olAppItem = calFld.Items.Add(olAppointmentItem)
            
        With olAppItem
            .Subject = Cells(r, 2) & ", " & Cells(r, 3)
            Start = DateValue(Cells(r, 5).Value) + Cells(r, 6).Value
            .Start = Start
            
            Einde = DateValue(Cells(r, 5).Value) + Cells(r, 7).Value
            .End = Einde
            .Location = Cells(r, 3)
            .Body = Cells(r, 4)
            .Categories = Cells(r, 9)
            If Cells(r, 8) = "Ja" Then
                .AllDayEvent = True
            Else
                .AllDayEvent = False
            End If
            
            'Evt overige opties:
            '            .ReminderSet = True
            '            .BusyStatus = olFree
            '            '.Attachments.Add ("c:\temp\somefile.msg")
            '            .ReminderSet = True
            '            .BusyStatus = olBusy
            On Error GoTo 0
            .Save ' saves the new appointment to the default folder
        End With
        r = r + 1
    Wend
    Set olAppItem = Nothing
    Set olNS = Nothing
    Set olApp = Nothing
    MsgBox "Done !"
End Sub


 

Maak op de tabblad ‘agenda’ een knop die bovenstaande module/macro activeert en voila …klaar

Aanmaken Outlook e-mailbericht

Reserveren variabelen

Initiëren Outlook

Of:

E-mailbericht vullen