Theorievraag over objecten

Status
Niet open voor verdere reacties.

so10070

Gebruiker
Lid geworden
4 feb 2014
Berichten
424
Via ADODB open ik een tabel. In de daaropvolgende query die ik aanmaak kan ik de WHERE-clausule definiëren met rechtstreekse verwijzing naar de ADODB-tabel via "Naam = ![Voorwaarde]. Daarna maak ik een email aan via direct binding en in de "With oEmail >> End with" kan ik deze veldnamen niet meer direct oproepen. Waarom?

Code:
Set oEmail = New Outlook.Application
                
                txtEmailAdres = ![personeel e-mail]
                txtEmailOnderwerp = DLookup("MCorrectiesOnderwerp", "tblMail")
                txtEmailBody = DLookup("MCorrectiesTekst", "tblMail")
                
                With oEmail
                    .To = ![personeel e-mail] [B][U]>> lukt niet[/U][/B]
                    .To = txtEmailAdres [B][U]>> lukt wel[/U][/B]
                    .Subject = txtEmailOnderwerp
                    .Body = txtEmailBody
                    .Attachment.Add txtMapNaam & "\" & ![Organisatie instellingsnummer] & ".xlsx"
                    .Display
                    '.Send
                End With
 
Hallo,

als eerste punt zie ik je wel een outlook application object aanmaken, maar geen mailitem. Normaal verwacht ik iets als

Code:
    Dim appOutlook As New Outlook.Application
    Dim msg As Outlook.MailItem
 
    
    Set msg = appOutlook.CreateItem(olMailItem)
    with msg
                enzovoort....

Om de rest te kunnen valideren mankeert het stuk code waar de recordset mee gedefinieerd en geopend wordt

Vriendelijke groeten
NG
 
Laatst bewerkt door een moderator:
Ik had maar de helft van mijn code meegegeven. Ik heb wel degelijk ook nog het mailitem aangemaakt. De fout blijft opdoemen.
Code:
Private Sub butVerzenden_Click()
    Dim sqlScholen As String
    Dim sqlLeerlingen As String
    Dim txtMapNaam As String
[U][B][COLOR="#0000CD"]    Dim cnn As ADODB.Connection
    Dim rst As New ADODB.Recordset[/COLOR][/B][/U]
    Dim qryVersturen As QueryDef
    Dim txtMapFileNaam As String
[B][U][COLOR="#0000CD"]    Dim oOL As Outlook.Application 'early binding
    Dim oEmail As Outlook.MailItem[/COLOR][/U][/B]
    Dim txtEmailAdres As String
    Dim txtEmailOnderwerp As String
    Dim txtEmailBody As String
    Dim strCodeModule As String
    
    strCodeModule = "frmMailsCorrectie butVerzenden_Click()"
    
    On Error GoTo foutafhandeling
    
    sqlScholen = "SELECT [Organisatie instellingsnummer], [Organisatie gebruikersnaam instelling], " & _
        "[Organisatie naam directeur instelling], [Gebruikte voornaam], [Personeel e-mail] " & _
        "FROM tblDirecties " & _
        "WHERE Aangeduid = True " & _
        "ORDER BY [Organisatie instellingsnummer];"

[COLOR="#0000CD"][U][B]    Set cnn = CurrentProject.Connection
    rst.Open sqlScholen, cnn, adOpenKeyset, adLockReadOnly
    Set oOL = New Outlook.Application ' early binding[/B][/U][/COLOR]
    
    txtMapNaam = DLookup("NaarDirecteur", "tblSysteemSettings")
    
    'Eerst nakijken of er directies aangeduid zijn
    With rst
        If .BOF And .EOF Then
            info 13
            Exit Sub
        Else

            .MoveFirst
                        
            Do While Not .EOF
                'Dan Excels klaarmaken en verzenden gegroepeerd op schoolnummer
                'Hier query van tblLeerlingen met filter op schoolnummer
                sqlLeerlingen = "SELECT [Organisatie instellingsnummer], [Vestigingsplaats naam], [Klas omschrijving], [Leerling naam] " & _
                    "FROM tblLeerlingen " & _
                    "WHERE [Organisatie instellingsnummer] = """ & ![Organisatie instellingsnummer] & """ " & _
                    "ORDER BY tblLeerlingen.[Klas omschrijving], [Leerling naam];"
                
                'Eerst nakijken of het tijdelijk object qryTemp niet bestaat
                For Each qryVersturen In CurrentDb.QueryDefs
                    If qryVersturen.Name = "qryTemp" Then
                        DoCmd.DeleteObject acQuery, "qryTemp"
                        Exit For
                    End If
                Next
                
                'MapFileNaam
                txtMapFileNaam = txtMapNaam & "\" & ![Organisatie instellingsnummer] & ".xlsx"
                
                'Maak hier een QueryDef van als virtuele recordset = een object.  Een hier aangemaakte sql is geen object!
                Set qryVersturen = CurrentDb.CreateQueryDef("qryTemp", sqlLeerlingen)
                    
                DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "qryTemp", txtMapFileNaam, True
                
                'tijdelijk object qryTemp verwijderen en op naar het volgende record
                DoCmd.DeleteObject acQuery, "qryTemp"
                
                'Dan versturen
[U][B][COLOR="#0000CD"]                Set oEmail = oOL.CreateItem(olMailItem)[/COLOR][/B][/U]
                
                txtEmailAdres = ![Personeel e-mail]
                txtEmailOnderwerp = DLookup("MCorrectiesOnderwerp", "tblMail")
                txtEmailBody = DLookup("MCorrectiesTekst", "tblMail")
                
                With oEmail
[U][B][COLOR="#FF0000"]                    .To = txtEmailAdres >> werkt wel
                    .To = ![Personeel e-mail] >> werkt niet[/COLOR][/B][/U]
                    .To = ![Personeel e-mail]
                    .Subject = txtEmailOnderwerp
                    .Body = txtEmailBody
                    .Attachments.Add txtMapFileNaam
                    .Display
                    '.Send
                End With
                
                !Verstuurd = True
                .MoveNext
            Loop
        End If
        .Close
    End With
    
    Set rst = Nothing
    Set cnn = Nothing
    Set oOL = Nothing
    Set oEmail = Nothing

Exit_Sub:
    Exit Sub
    
foutafhandeling:
    Call FoutenRegistratie(Err.Number, Err.Description, strCodeModule, Environ("Username"))
    Resume Exit_Sub
End Sub
 
En je weet zeker dat er een waarde in het email veld staat?
 
Code:
                With oEmail
                    .To = txtEmailAdres ''>> werkt wel
                    .CC = rst![Personeel e-mail] ''>> werkt op deze manier wel
 
Weet je nu ook waarom?
 
De recordset moet aangesproken worden. Zonder "rst" is het voor Access onduidelijk waar hij dat veld moet gaan halen.
 
En dat komt doordat je een geneste With gebruikt. Je zit, op het moment van opvragen, in de collectie van het MailItem, en niet meer in de Recordset. Daarom werkt !Verstuurd in de regel eronder wél, want dan zit je niet meer in het e-mail item. Zodra je een With in een With zet, moet je het bovenliggende object weer volledig aanroepen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan