E-mail verzenden van een Excel object vanuit Access

Status
Niet open voor verdere reacties.

StudentDennis

Gebruiker
Lid geworden
13 nov 2013
Berichten
34
Goededag,

Ik wou graag vragen hoe ik het volgende probleem het best aanpak.

Ik heb een code die een grafiek opent in Excel vanuit access met access data. Verder heb ik de code om e-mails te verzenden met SendObject aangepast om het excel object mee te zenden als bijlage. Echter lukt dit nog niet. De mail wordt verzonden zonder bijlage. Ik was in de veronderstelling dat dit kon met SendObject, kan iemand bevestigen of dit kan? Of vraagt dit om een andere aanpak?

Het doel is om grafieken rond te mailen vanuit Access data (ik heb Outlook, Excel en Access 2007).

De Excel grafiek wordt niet opgeslagen, maar alleen geopend via deze code.

PS: op dit moment opent hij het object ook nog in Excel. Ik weet niet of dat de reden is dat hij hem niet mee kan zenden?

Code:
'OPEN CHART IN EXCEL
    Dim oXL As Object        ' Excel application
    Dim oBook As Object      ' Excel workbook
    Dim oSheet As Object     ' Excel Worksheet
    Dim oChart As Object     ' Excel Chart


    Const cNumCols = 100      ' Number of points in each Series
    Const cNumRows = 26       ' Number of Series

    ReDim aTemp(1 To cNumRows, 1 To cNumCols)

    Set oXL = CreateObject("Excel.application")
    Set oBook = oXL.Workbooks.Add
    Set oSheet = oBook.Worksheets.Item(1)

Dim rs01 As DAO.Recordset
Set rs01 = CurrentDb.OpenRecordset("SELECT * FROM qryWOperweekCombined")

Dim Teller As Integer
Teller = 0
Dim iRow As Integer
iRow = 1
Dim iCol As Integer
iCol = 5

With rs01
If .RecordCount > 0 Then
    .MoveLast
    TotRecords = .RecordCount
    .MoveFirst
           For Teller = 1 To TotRecords
                 aTemp(iRow, 1) = !Week
                 aTemp(iRow, 2) = !Total
                 aTemp(iRow, 3) = !bedrijfK
                 aTemp(iRow, 4) = !bedrijfV
                .MoveNext
                iRow = iRow + 1
            Next Teller
    oSheet.Range("A1").Resize(cNumRows, cNumCols).Value = aTemp
End If
End With

    Set oChart = oSheet.ChartObjects.Add(200, 1, 745, 380).Chart

oChart.SetSourceData Source:=oSheet.Range("A1:D26")

    oXL.Visible = True

oChart.HasLegend = True
oChart.HasTitle = True

oChart.SeriesCollection(4).ApplyDataLabels
oChart.SeriesCollection(4).DataLabels.Format.TextFrame2.TextRange.Font.Size = 7
oChart.SeriesCollection(2).ApplyDataLabels
oChart.SeriesCollection(2).DataLabels.Format.TextFrame2.TextRange.Font.Size = 7
oChart.SeriesCollection(3).ApplyDataLabels
oChart.SeriesCollection(3).DataLabels.Format.TextFrame2.TextRange.Font.Size = 7

oSheet.Columns("A:A").ColumnWidth = 18.71

    oChart.SeriesCollection(1).Name = "=""Dates"""
    oChart.SeriesCollection(1).XValues = "=Sheet1!$A:$A"
    oChart.SeriesCollection(2).Name = "=""Total"""
    oChart.SeriesCollection(2).XValues = "=Sheet1!$B:$B"
    oChart.SeriesCollection(3).Name = "=""companyk"""
    oChart.SeriesCollection(3).XValues = "=Sheet1!$C:$C"
    oChart.SeriesCollection(4).Name = "=""companyv"""
    oChart.SeriesCollection(4).XValues = "=Sheet1!$D:$D"
    oChart.SeriesCollection(1).Delete
    oChart.SeriesCollection(1).Name = "=""Total"""
    oChart.SeriesCollection(1).XValues = "=Sheet1!$A:$A"

oChart.SeriesCollection(1).Interior.Color = vbBlue
oChart.SeriesCollection(2).Interior.Color = vbGreen
oChart.SeriesCollection(3).Interior.Color = vbRed

oChart.SeriesCollection(1).Trendlines.Add
oChart.SeriesCollection(2).Trendlines.Add
oChart.SeriesCollection(3).Trendlines.Add

    oChart.SeriesCollection(1).Trendlines.Add(Type:=xlMovingAvg, Period:= _
        2, Forward:=1, Backward:=0, DisplayEquation:=False, DisplayRSquared:= _
        False, Name:="Average").Select
    oChart.SeriesCollection(2).Trendlines.Add(Type:=xlMovingAvg, Period:= _
        2, Forward:=1, Backward:=0, DisplayEquation:=False, DisplayRSquared:= _
        False, Name:="Average").Select
    oChart.SeriesCollection(3).Trendlines.Add(Type:=xlMovingAvg, Period:= _
        2, Forward:=1, Backward:=0, DisplayEquation:=False, DisplayRSquared:= _
        False, Name:="Average").Select

With oChart.SeriesCollection(1).Trendlines(1).Border
 .ColorIndex = 5
 .Weight = xlThick
 .LineStyle = xlContinuous
 End With

 With oChart.SeriesCollection(1).Trendlines(2).Border
 .ColorIndex = 5
 .Weight = xlMedium
 .LineStyle = xlContinuous
 End With

With oChart.SeriesCollection(2).Trendlines(1).Border
 .ColorIndex = 4
 .Weight = xlThick
 .LineStyle = xlContinuous
 End With

 With oChart.SeriesCollection(2).Trendlines(2).Border
 .ColorIndex = 4
 .Weight = xlMedium
 .LineStyle = xlContinuous
 End With

With oChart.SeriesCollection(3).Trendlines(1).Border
 .ColorIndex = 3
 .Weight = xlThick
 .LineStyle = xlContinuous
 End With

 With oChart.SeriesCollection(3).Trendlines(2).Border
 .ColorIndex = 3
 .Weight = xlMedium
 .LineStyle = xlContinuous
 End With

 oChart.Legend.Position = xlBottom

 oChart.SetElement (msoElementChartTitleCenteredOverlay)

 oChart.HasTitle = True
 oChart.ChartTitle.Text = "Workorders per week - last 26 weeks"

   oSheet.Visible = True
   oXL.UserControl = True

'SEND E-MAIL 

Dim varName As Variant
Dim varCC As Variant
Dim varSubject As Variant
Dim varBody As Variant

varName = "name@server.com"
varCC = "name2@server2.com"

varSubject = "Hello"

varBody = "Text bla bla bla"

DoCmd.SendObject , oXL, acFormatXLS, varName, varCC, , varSubject, varBody, False, False
 
Laatst bewerkt:
En waarom maak je de grafiek niet in Access?
 
De opdrachtgever wil het zo. En het heeft meer opties. Verder heb ik de kennis niet, Ik heb er tijd in gestopt, maar Access grafieken werken heel onlogisch voor mij. Ik krijg niet op beeld wat ik wil.

Maar dat zou dus jouw aanpak zijn. OK bedankt :)

Maar kun je bevestigen/ontkrachtigen of het uberhaupt mogelijk is om met SendObject een nog niet opgeslagen Excel Object te verzenden kan als bijlagen?
 
Volgens mij is dat ook helemaal niet mogelijk. Ik zou het ook versturen vanuit Excel, niet vanuit Access. In het Excel forum (of VBA forum, daar komt ook heel veel Excel voobij) heb ik een vergelijkbaar probleem voorbij zien komen. snb had daarbij een oplossing waarbij de grafiek werd opgeslagen als afbeelding. SendObject heeft namelijk (clue zit in de naam) een object nodig. En dat moet dan uiteraard wel bestaan.
Overigens weet een opdrachtgever maar al te vaak niet wat goed voor 'm is. Als ik alles zou uitvoeren zoals de opdrachtgever dat had gewild, dan had ik nu geen werk meer gehad :)
 
Laatst bewerkt:
Daar heb je wel gelijk in. Ik had dit beter moeten plannen. Ja die naam is wat mij verwarde. Omdat ik boven aan de code Objecten aanmaak voor de Excel applicatie, workbook en sheet. Mijn logica vertelde mij dat ik zulke objecten dan kon versturen. Maar je kunt schijnbaar alleen Access objecten zoals queries en rapporten verzenden.

De microsoft website is een beetje onduidelijk op dit put. Of mijn interpretatie :)

Ik ga een andere manier zoeken. Bedankt, dit scheelt me een hoop tijd. Ik zal de code wel posten als het niet te veel werk is en het is gelukt.

Ik heb wel al uitgevonden hoe ik de excel bestanden opsla als xls bestand met unieke naam (gebaseerd op datum en tijd), nu ff puzzelen hoe ik een mail met attachment verzend.

Grz
 
Ik zou, als je toch met objecten (Excel is an sich natuurlijk ook een object, alleen geen fysiek object) werkt, een Outlook sessie openen en op die manier de mail samenstellen. Kun je ook heel makkelijk de attachment erbij hangen.
 
Ik probeer het nu via ShellExecute, maar ik krijg een Outlook error als ik een attachment gebruik. "The commandline argument is not valid. Verify the switch you are using"

Ik dacht dat dit aan het gebrek aan een reference lag dus na enig Googlen heb ik "Redemption Outlook and MAPI COM Library" aangezet, maar ik kreeg nogsteeds de error.

Toen heb ik verder gegoogled en las een artikel waar men sprak over dat de speciale tekens niet mogen in een string dat heb ik opgelost, maar dat is het ook niet.

Ik houd jullie op de hoogte :)

Code tot nu toe:

Code:
Dim txtMainAddresses As String
Dim txtCC As String
Dim txtBCC As String
Dim txtSubject As String
Dim txtBody As String
Dim txtAttachment As String

txtMainAddresses = "emailadress@abc.com"
txtCC = "emailadress@abc.com"
txtBCC = "emailadress@abc.com"
txtSubject = "subject"
txtBody = "body"
txtAttachment = "C" & Chr(58) & Chr(92) & "Users" & Chr(92) & "username" & Chr(92) & "Documents" & Chr(92) & "test.xls"
MsgBox (txtAttachment)

    On Error GoTo Err_Command0_Click

    Dim stext As String
    Dim sAddedtext As String
    If Len(txtMainAddresses) Then
        stext = txtMainAddresses
    End If
    If Len(txtCC) Then
        sAddedtext = sAddedtext & "&CC=" & txtCC
    End If
    If Len(txtBCC) Then
        sAddedtext = sAddedtext & "&BCC=" & txtBCC
    End If
    If Len(txtSubject) Then
        sAddedtext = sAddedtext & "&Subject=" & txtSubject
    End If
    If Len(txtBody) Then
        sAddedtext = sAddedtext & "&Body=" & txtBody
    End If
    If Len(txtAttachment) Then
        sAddedtext = sAddedtext & "Attach=" & Chr$(34) & txtAttachment & Chr$(34)
    End If

    stext = "mailto:" & stext

    If Len(sAddedtext) <> 0 Then
        Mid$(sAddedtext, 1, 1) = "?"
    End If

    stext = stext & sAddedtext

    ' launch default e-mail program
    If Len(stext) Then
        Call ShellExecute(hwnd, "open", stext, vbNullString, vbNullString, SW_SHOWNORMAL)
    End If
Exit_Command0_Click:
    Exit Sub

Err_Command0_Click:
    MsgBox Err.Description
    Resume Exit_Command0_Click
 
Fijn natuurlijk dat je je eigen weg probeert te vinden, maar de aangewezen methode is toch echt een Outlook sessie starten :)
 
Sorry :) Bedoel je een VBA script schijven voor Outlook? Zo ja hoe stuur ik dan aan vanaf Access?
 
Ik heb een 'stukje' code geplakt dat ik zelf gebruik; deze maakt een HTML mail aan met opmaak dus. Dat kan sowieso al niet met SendObject.
Code:
                With CurrentDb.OpenRecordset(strSQL3)
                    z = 0
                    .MoveLast
                    .MoveFirst
                    If .RecordCount > 0 Then
                        ReDim sObj(.RecordCount - 1, 5)
                        Do While Not .EOF
                            If Nz(.Fields(0), "") <> "" Then
                                For i = 0 To 5
                                    sObj(z, i) = .Fields(i)
                                Next
                                z = z + 1
                            End If
                            .MoveNext
                        Loop
                    End If
                
                '-----------------------------------------------------------------------------------------------------------------------
                ' En dan de spulletjes ophalen. Uiteraard op basis van de Medewerker...
                '-----------------------------------------------------------------------------------------------------------------------
                    If z = 0 Then
                        Mess_Obj = Mess_Obj & "<P><FONT size=2 face=Verdana>Volgens de informatie in TOPdesk&nbsp;heeft " & sMed(y, 0) & " "
                        Mess_Obj = Mess_Obj & "geen objecten in beheer.</FONT></P>"
                    Else
                        Mess_Obj = Mess_Obj & "<P><FONT size=2 face=Verdana>Volgens de informatie in TOPdesk&nbsp;heeft " & sMed(y, 0) & " "
                        Mess_Obj = Mess_Obj & "de volgende objecten in beheer, die voor het vertrek moeten worden ingeleverd:</FONT></P>"
                        Mess_Obj = Mess_Obj & "<UL>"
                        For i = LBound(sObj) To UBound(sObj)
                            If i > LBound(sObj) Then msg2 = msg2 & cr
                            If i > LBound(sObj) Then Mess_Obj = Mess_Obj & "<P>"
                            Mess_Obj = Mess_Obj & " <LI><FONT size=2 face=Verdana>Object " & i + 1 & ": <BR>"
                            Mess_Obj = Mess_Obj & "Categorie: " & sObj(i, 0) & cr
                            If Not Nz(sObj(i, 1), "") = "" Then Mess_Obj = Mess_Obj & "Objectsoort: " & sObj(i, 1) & "<BR>"
                            If Not Nz(sObj(i, 2), "") = "" Then Mess_Obj = Mess_Obj & "Naam/Nummer: " & sObj(i, 2) & "<BR>"
                            If Not Nz(sObj(i, 3), "") = "" Then Mess_Obj = Mess_Obj & "Merk: " & sObj(i, 3) & "<BR>"
                            If Not Nz(sObj(i, 4), "") = "" Then Mess_Obj = Mess_Obj & "Model: " & sObj(i, 4) & "<BR>"
                            If Not Nz(sObj(i, 5), "") = "" Then
                                If sObj(i, 1) = "Inventaris" Then
                                    Mess_Obj = Mess_Obj & "Sleutel: "
                                Else
                                    Mess_Obj = Mess_Obj & "Specificatie: "
                                End If
                                Mess_Obj = Mess_Obj & sObj(i, 5) & "</FONT></LI>"
                            End If
                        Next
                        Mess_Obj = Mess_Obj & " </UL>"
                    End If
                End With
                
                '---------------------------------------------------------------------------------------------------
                ' Als laatste de mail versturen naar de teamleider.  Uiteraard op basis van de Medewerker...
                '---------------------------------------------------------------------------------------------------
                Set appOutLook = CreateObject("Outlook.Application")
                Set MailOutLook = appOutLook.CreateItem(olMailItem)
            
                Mess_Body = "<HTML>" & cr
                Mess_Body = Mess_Body & "<HEAD>" & cr
                Mess_Body = Mess_Body & "<META content=" & Chr(34) & "text/html; charset=unicode" & Chr(34) & "  http-equiv=Content-Type>"
                Mess_Body = Mess_Body & "</HEAD>"
                Mess_Body = Mess_Body & "<BODY>"
                Mess_Body = Mess_Body & "<P><FONT size=4 face=Verdana>Overzicht Objecten van Vertrekkende Medewerker.</FONT></P>"
                Mess_Body = Mess_Body & "<P><FONT size=2 face=Verdana>Beste " & sTeam(x, 1) & ",</FONT></P>"
                Mess_Body = Mess_Body & "<P><FONT size=2 face=Verdana></FONT>&nbsp;</P>"
                Mess_Body = Mess_Body & "<P><FONT size=2 face=Verdana>Op " & Format(sMed(y, 3), "d-mm-yyyy") _
                    & " loopt het contract van &lt;" & sMed(y, 0) & "&gt; af.</FONT></P>"
                Mess_Body = Mess_Body & "<P><FONT size=2 face=Verdana>Via de SelfServiceDesk kun je, als je dat nog niet gedaan hebt,<BR>"
                Mess_Body = Mess_Body & "het formulier &lt;Innemen Standaardfaciliteiten&gt; invullen om de medewerker uit dienst te melden,<BR>"
                Mess_Body = Mess_Body & "of kun je het formulier &lt;Wijzigen Standaardfaciliteiten&gt; invullen "
                Mess_Body = Mess_Body & "als het contract moet worden gewijzigd.</FONT></P>"
                Mess_Body = Mess_Body & "<P></P>"
                Mess_Body = Mess_Body & Mess_Obj
                Mess_Body = Mess_Body & "<P></P>"
                Mess_Body = Mess_Body & "<P><FONT size=2 face=Verdana>Met vriendelijke groet,</FONT></P>"
                Mess_Body = Mess_Body & "<P><FONT size=2 face=Verdana>Servicedesk</FONT></P>"
                Mess_Body = Mess_Body & "</BODY>"
                Mess_Body = Mess_Body & "</HTML>"
            
                With MailOutLook
                    .BodyFormat = olFormatHTML      'olFormatRichText
                    .To = sTeam(x, 2)
                    Ext = "mail.me@dumbo.nl"
                    .CC = Ext
                    .Subject = " Uit dienst aanvraag voor " & sMed(y, 0)
                    .HTMLBody = Mess_Body
    ''                .Display
                    .Send
                End With
                .MoveNext

D'r zit nogal wat extra code in die vanuit matrixen waarden ophalen, maar daar moet je maar even doorheen kijken :)
 
Bedankt maar weer, heel fijn dat je de mensen hier, dag in dag uit, wilt helpen en altijd razend snel :)

De uiteindelijk werkende (test) code is geworden:

Code:
    Dim olApp As Outlook.Application
    Dim objMail As Outlook.MailItem
    Set olApp = Outlook.Application
    'Create e-mail item'
    Set objMail = olApp.CreateItem(olMailItem)
    Set objAttachments = objMail.Attachments

    With objMail
        .Subject = "Weekly Rapport"
        .Body = "Hi xyz, here is your Weekly Rapport"
        .Recipients.Add "xyz@abc.com"
        .Recipients.ResolveAll
        .Display
    End With
    
    objAttachments.Add "C:\Users\USERNAME\Documents\graphs\Test123.xls", olByValue, 1, "Test123"
    'objMail.Display
    objMail.Send
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan