24. april 2015 - 09:42Der er
10 kommentarer og 1 løsning
Datamakro sendEmail fra flere tabeller
Jeg har brug for at kunne sende en email direkte fra min Access database (2013 / 365).
Jeg har to tabeller: tblKlientData og tblForløb. I tblKlientData skal der hentes navn og emailadresse, og fra tblForløb skal der hentes dato for aftale.
Datamakroen skal aktiveres via en knap i en formular. Formularen viser indholdet af en forespørgsel fspAftaler, som henter data fra både tblKlientData og tblForløb. Hver side i formularen viser kun én aftale med én klient.
Svaret må meget gerne være ret udførligt, da jeg er ny i Access 2013 (har tidligere brugt 2003). Jeg har læst manualer og kan også finde ud af at lave en datamakro, der henter emailadressen fra en tabel - men det går helt galt, når jeg prøver at kombinere to tabeller :-P
Du skal oprette en forespørgsel, som kombinerer de to tabeller via et nøglefelt (formodentlig et kundenr). Brug så denne forespørgsel som udgangspunkt for din kørsel i stedet for bare at køre direkte på kundetabellen.
Forespørgslen hedder fspAftaler, og nøglefeltet er kundenummeret, netop som du gætter på. Så langt var jeg kommet, men jeg kan ikke få datamakroen til at fungere sammen med forespørgslen.
Du skriver: "Jeg har læst manualer og kan også finde ud af at lave en datamakro, der henter emailadressen fra en tabel". Det er jo præcis samme fremgangsmåde, når du bruger en forespørgsel. I stedet for at referere til tblKlientData skal du bare bruge fspAftaler.
Helt præcist går jeg i stå på, at jeg ikke kan lave opslag igennem fspAftaler.
Min datamakro (som jeg gerne ville have den til at se ud):
Slå en post op i fspAftaler WHERE
SendEmail Til =[fspAftaler].[KlientEmail] Cc Bcc Emne "Et emne" Meddelelse ="Kære " & [fpsAftaler].[Klientnavn] & ". Vi ses " & [fspAftaler].[AftaleDato]
Problemet er, at jeg ikke kan vælge [fspAftaler] under SendEmail - dér kan jeg kun vælge [tblKlientData].
Ahaaa. Nu forstår jeg. Du mener virkelig Data Makro. Tit kalder e's brugere VBA kode for makroer, så jeg misforstod. Sorry.
Hvorfor går du via en datamakro? De anvendes jo som regel ifm. indsættelse og sletning i tabeller.
Hvis du bare vil sende en email, kan du jo fint bruge en lille funktion, som f.eks. dette klip fra Microsoft Access 2010 Programmer's Reference:
Public Function CreateEmailWithOutlook( _ MessageTo As String, _ Subject As String, _ MessageBody As String)
' Define app variable and get Outlook using the "New" keyword Dim olApp As New Outlook.Application Dim olMailItem As Outlook.MailItem ' An Outlook Mail item
' Create a new email object Set olMailItem = olApp.CreateItem(olMailItem)
' Add the To/Subject/Body to the message and display the message With olMailItem .To = MessageTo .Subject = Subject .Body = MessageBody .Display ' To show the email message to the user ' .Send ' Send the message immediately
End With
' Release all object variables Set olMailItem = Nothing Set olApp = Nothing End Function
Læg koden i et tilfældigt modul og kald funktionen med de fundne værdier i fpsAftaler:
CreateEmailWithOutlook(KlientEmail,"Et emne", "Kære " & Klientnavn & ". Vi ses " & AftaleDato)
Alt forladt :) Ja, jeg mente virkelig datamakro, og årsagen var, at den automatisk anvender ID på den post / klient, der bliver vist i min formular. Som sagt: ved simpelt opslag i kun én tabel er det meget lettere end VBA - så jeg tænkte, at der også måtte være en lige så nem løsning via en forespørgsel, men at jeg bare ikke kunne gennemskue den.
Jeg prøver lige koden af i aften - det springende punkt er, om den nøjes med at sende til kun den ene klient, der bliver vist i formularen... :)
Jeg bliver da sindssyg af dette her (og føler mig temmelig dum)!
Hvordan får jeg overhovedet kørt en VBA-kode fra en knap i en formular?
Jeg er helt nede på det niveau, hvor jeg i min formular laver en knap, højreklikker på den og vælger Generér Hændelsesprocedure - Kodegenerator. Dette åbner VBA-editoren, som allerede har skrevet
Private Sub Kommandoknap130_Click()
End Sub
I mellem disse linjer tilføjer jeg blot MsgBox ("Test"). Når jeg så trykker på knappen, får jeg fejlmeddelelsen, at "Udtrykket VedKlik, du indtastede som indstilling af hændelsesegenskaben, gav en fejl: Der opstod et problem, mens Microsoft Access kommunikerede med OLE-serveren eller Active-X objektet."
Mht. koden: Du har helt ret. Du burde bare kunne kalde funktionen, f.eks.:
Private Sub Kommandoknap130_Click() Call CreateEmailWithOutlook(Me.KlientEmail,"Et emne", "Kære " & Me.Klientnavn & ". Vi ses " & Me.AftaleDato) End Sub
Mht. fejlen: Det er jo helt sort! Der er jo ingen OLE-server indblandet i en MsgBox.
Det virker som om, du måske har noget andet kode et eller andet sted, der fejler. (Access bliver af og til lidt forvirret)
Gå til VBA editoren (Alt-F11) og vælg Debug/Compile. Så findes Access måske fejlen for dig. Hvis ikke, må du manuelt gennemgå din base for at finde den komponent (og det er et Active-X objekt), der fremkalder fejlen.
Jeg kunne ingen fejl finde, heller ikke selv om jeg stykke for stykke slettede næsten alting udover tabellerne (efter at have taget backup, selvfølgelig).
Så eksporterede jeg tabeller, forespørgsler og formularer en for en for at se, om fejlen også ville være i den nye database, og i givet fald hvor. Til sidst havde jeg en eksakt kopi af den originale database - men helt uden fejlmeddelse...
Så nu må jeg i gang med at få det til at virke. Tak for hjælpen so far - jeg venter lige med at lukke, til jeg ser, om jeg stadig har brug for hjælp med det egentlige problem :)
Altså, hvor var det nemt, når Access besluttede sig for at lege med :)
I tilfælde af at andre arbejder i Access 2013 og får lyst til at lege med, så vil jeg lige gøre opmærksom på en lille ændring i VBA-koden (Outlookobjektet skal dannes):
Public Function CreateEmailWithOutlook( _ MessageTo As String, _ Subject As String, _ MessageBody As String)
' Define app variable and get Outlook Dim olApp As Outlook.Application Dim olMailItem As Outlook.MailItem ' An Outlook Mail item
'Create an Outlook object Set olApp = CreateObject("Outlook.Application")
' Create a new email object Set olMailItem = olApp.CreateItem(olMailItem)
' Add the To/Subject/Body to the message and display the message With olMailItem .To = MessageTo .Subject = Subject .Body = MessageBody .Display ' To show the email message to the user ' .Send ' Send the message immediately
End With
' Release all object variables Set olMailItem = Nothing Set olApp = Nothing End Function
I hvert fald virkede ovenstående for mig, mens 2010-versionen gav fejlmeddelelse.
Jeg vil også nævne, at at jeg i stedet for .Body brugte .HTMLBody, hvorved jeg kunne bruge html-tags og gøre meddelelsen noget kønnere at se på.
Velbekomme. Fint at du poster den endelige løsning!
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.