Acces 2016 Save alle bijlagen van een geselecteerde email

Status
Niet open voor verdere reacties.
Je gaat heel slordig met beschermde namen om als je dit doet:
Code:
Dim Selection As Selection
Om te beginnen: je hebt de Outlook bibliotheek geladen, want daarboven heb je deze declaratie staan:
Code:
Dim ObjApp As Outlook.Application
Dat kan je alleen doen als de bibliotheek is geladen. Heel vreemd dus dat je deze variabele vervolgens met Late Binding vult!
Maar om een variabele dezelfde naam te geven als een object is gewoon vrágen om moeilijkheden. Ik zou ‘m dus ook altijd zo doen:
Code:
Dim olSelection As Outlook.Selection
Al was het maar om onderscheid te maken, en de variabele met de Outlook Selection te koppelen.
Ik gebruik nog steeds code waar ik nooit problemen mee heb, dus wellicht wordt het tijd om die in de strijd te gooien.

Ik vond vandaag overigens een uitgebreid artikel waarin werd uitgelegd dat dit:
Code:
 Set oOutlook = GetObject(, "Outlook.Application")
    ' check for error 429, not open, create new instance
    If Err.Number <> 0 Then        ' = 429
        Err.Clear
        oOutlook.Close
        Set oOutlook = Nothing
        Set oOutlook = CreateObject("Outlook.application")
        Shell ("Outlook")                                                    'start Outlook
    End If
Nog wel kan werken voor Word en Excel, maar niet voor Outlook omdat dat anders wordt geladen. De code om Outlook te checken is dus een half metertje langer :).
Maar het idee om variabelen Early Binding te declareren, en vervolgens Late Binding te gebruiken vind ik wel een novelty :). Alsof je Memphis Depay op de bank hebt zitten, en de neef van de voorzitter in de spits zet :D.
 
Super, fijn dat je meedenkt. De Selection kwestie had ik vanmiddag ook gevonden en aangepast (OlSelection), geeft geen beter resultaat. De bibliotheek (Microsoft Outlook 16.0 Object library) is standaard geladen. Mijn Access applicatie werkt zonder problemen veel met Outlook, vandaar de ibrary. Late binding en early binding is voor mij onontgonnen terrein, dus wat je daarmee bedoeld is niet zo duidelijk in verschil in code. De code met GetObject en CreateObject zie je veel worden gebruikt, ook voor Outlook. Heb je nog de beschrijving van MS gevonden (zie Url)? Als je eigen code hebt die je in de strijd wilt gooien, dan hou ik mij aanbevolen. Slaat deze de bijlagen van een geselecteerde email in Outlook op? De "halve meter code" zou dat ook werken? Ik ben benieuwd en alvast bedankt.
 
De code met GetObject en CreateObject zie je veel worden gebruikt, ook voor Outlook.
En dát is dus Late Binding. Met Early Binding maak je 'm zo:

Code:
Dim oOutlook As Outlook.Application

    Set oOutlook = New Outlook.Application

En dan verder. Is dus sneller, en je hebt IntelliSense. Nogmaals: gebruik één variant, zeker als het standaard is uitgerold. Late Binding is prima als je code distribueert naar verschillende personen met verschillende versies. Dan weet je zeker dat het werkt. Maar Early Binding is dus veel handiger.
 
KPTPTT

Je schrijft: Selection is een Variabele en met Ol er voor veranderd alleen de naam van de variabele en niet de functie er van.

Lees of KIJK eens goed naar #19, dat heeft niets te maken of er OL voor Selection staat, er is een ander verschil.
 
Wat TS schrijft, klopt tot de laatste letter: hij had een variabele gedeclareerd met de naam "Selection". Dat is niet handig, want dat is de naam van een object, maar dat doet niets af aan het feit dat het veranderen van een variabelenaam de functie niet verandert. Als een variabele "tmpAdres" heet, werkt die 100% identiek aan een variabele die "tempAdres" heet. Of "tAdres". Maakt echt niets uit.
 
Selection heb ik aangepast in OlSelection mar er veranderd niets. Ik ga uit van Late Binding. Er is sprake van meerdere gebruikers met versies Access. Ik heb een andere code van internet getest waarbij CreateObject en GetObject niet worden gebruikt, maar ook hier dezelfde error 462 ook als ik Outlook handmatig start.. Ik ben wel benieuwd naar een oplossing voor Error 462. Hoe kunnen ontwikkelaars met een dergelijke error de applicatie gebruiken.
 
Laatst bewerkt:
Dan heb ik een wonderbril, die meer ziet!!!

NEW ActiveExplorer.Selection
 
Laatst bewerkt:
Ik ga uit van Late Binding.
Nee, dat doe je NIET.

Code:
Private Sub Knop181_Click()
Dim currentExplorer As Explorer
Dim obj As Object
Dim Ext As String

    Set currentExplorer = ActiveExplorer
    Set Selection = currentExplorer.Selection

Deze code komt rechtstreeks uit de Early Binding met je Outlook bibliotheek, die je, zoals je al aangaf, wel degelijk laad in de db. En bij correct gebruik van je bibliotheek, zou hij er zo uit zien (zie ook #19)
Code:
Private Sub Knop181_Click()
Dim currentExplorer As Outlook.Explorer
Dim obj As Object
Dim Ext As String

    Set currentExplorer = New Outlook.ActiveExplorer
    Set currentExplorer = New ActiveExplorer  ' dit mag ook
    Set Selection = currentExplorer.Selection
 
Het is een beetje verwarrend Late, Early. Ik dacht bij zonder gebruik NEW en de Library in db is het Late Binding en vanwege de zekerheid dat het werkt denk ik aan Late Binding te gebruiken. Ik heb nog steeds last van Error462. Hoe los ik het op.
Graag svp. suggesties en hulp.
 
Ik zal eens kijken of ik je probleem kan reproduceren, want ik heb er bij mijn procedures (die dus prima werken) nooit last van gehad.
 
Het probleem Runtime Error 462 heb ik opgelost. Een andere variabele aan ActiveExplorer toegewezen. Het werkt nu als een speer en kan na twee weken arbeid achterover gaan zitten.
Code:
Private Sub Knop181_Click()                         'In formulier Bijlagen knop Automatisch Bijlagen uit email opslaan
Dim ObjApp As Outlook.Application
Dim oOutlook As Object
Dim currentExplorer As Outlook.Explorer
Dim OlSelection As Outlook.Selection
Dim obj As Object, att As Object
Dim Ext As String

On Error Resume Next
        Set oOutlook = GetObject(, "Outlook.Application")
' check for error 462, not open, create new instance
    If Err.Number <> 0 Then        ' = 462
        Err.Clear
        oOutlook.Close
        Set oOutlook = Nothing
        Set ObjApp = Nothing
        Set obj = Nothing
        Set oOutlook = CreateObject("Outlook.application")
        Shell ("Outlook")                                   'start Outlook
    End If
On Error GoTo 0

On Error Resume Next
        Set oOutlook = GetObject(, "Outlook.Application")   'Controle of Outlook is opgestart
On Error GoTo 0

    If oOutlook Is Nothing Then
        MsgBox "Outlook is niet geopend." & Chr(13) & Chr(10) & Chr(10) & "Start Outlook en voeg opnieuw de email bijlagen toe."

        Set oOutlook = Nothing
        Set ObjApp = Nothing
        Set currentExplorer = Nothing
        Set obj = Nothing
            Exit Sub                                       'Exit forumlier email bijlagen indien Outlook niet is geopend
    End If

    MsgBox "Is de email geselecteerd?"

    Set ObjApp = Outlook.Application
    Set currentExplorer = oOutlook.ActiveExplorer
    Set OlSelection = currentExplorer.Selection

    For Each obj In OlSelection
        With obj
            If .Attachments.Count > 0 Then
                For Each att In .Attachments
                    Ext = Right(att.Filename, 4)
                    Select Case Ext
                        Case ".pdf", ".xls", "xlsx", ".doc", "docx", ".jpg", "jpeg", ".png", ".msg"
                            att.SaveAsFile "D:\Bijlagen_email_db\" & att.Filename
                    End Select
                Next att
            Else
                MsgBox "Er zijn geen bijlagen in de email"
            End If
       End With
    Next obj
    
         Set oOutlook = Nothing
         Set ObjApp = Nothing
         Set currentExplorer = Nothing
         Set obj = Nothing
End Sub

Ten overvloede staat in de code een MsgBox dat Outlook niet is opgestart. Dat is in principe niet nodig omdat Outlook, wanneer deze niet actief is, automatisch wordt geopend {(Shell("Outlook")}. Voor de zekerheid als Outlook om één of andere reden niet wordt geopend de gebruiker wordt gewaarschuwd (het is een escape in geval dat).
 
Toch blijft de combinatie Lat Binding - Early Binding licht bizar, en ik raad lezertjes dus aan om ofwel alles Late Binding te doen, of Early Binding.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan