VBA code in memo veld

Status
Niet open voor verdere reacties.

Harrie1970

Gebruiker
Lid geworden
30 jul 2014
Berichten
16
Vanuit de formulieren die ik in MS Access 2010 heb gebouwd, worden emails verzonden. Deze emails worden momenteel via docmd.sendobject, <bijlage rapport>, acformatpdf, me.varemailadres,,,"Titel van de mail", "Inhoud van de mail", false verstuurd.
Echter moet de mail flexibeler van opzet worden, zodat de inhoud van de mail ook tijdens het gebruik van de database kunnen worden aangepast.

Dit heb ik inmiddels gedaan door een tabel Tbl_Mail aan te maken met velden Onderwerp en Inhoud.
Het veld Inhoud is van het type Memo.
Als ik deze waarde (van veld Inhoud) in een variabele (VarMsg) opvang in VBA en deze variabele vervolgens neerzet waar de inhoud hoort te staan, dan lukt dat aardig.

Helaas werkt dit alleen met vaste waarden in het veld Inhoud.

Nu wil ik een mail in veld Inhoud plaatsen waarin staat: "Uw naam: " & Me.VarNaam
Deze vang ik op in een variabele (VarMsg) in VBA, maar dat wordt in z'n totaliteit gezien als tekst. Dit is net wat ik niet wil.

Als ik MsgBox "Uw naam: " & Me.VarNaam gebruik, wordt er netjes een messagebox getoond met "Uw naam: Harrie1970".
Als ik MsgBox VarMsg gebruik, wordt er een messagebox getoond met "Uw naam: " & Me.Naam

Ik zou graag willen weten hoe ik MsgBox VarMsg kan omzetten in "Uw naam: Harrie1970".
Kan iemand mij hiermee helpen?

Alvast mijn dank.
 
He belangrijkste laat je niet zien. En dat is hoe de variabele VarMsg wordt gevuld.
 
Sorry voor de nalatigheid:

VarMsg = DLookup("[Inhoud]", "Tbl_Mail", "[MailID]=" & 2)
 
varMsg zou je in ieder geval zo moeten vullen:
Code:
varMsg = "Uw naam: " & Me.VarNaam
Waarschijnlijk heb je dit staan:
Code:
varMsg = "Uw naam: & Me.VarNaam"
 
Nee, ik heb het volgende gedaan in VBA:
VarMsg = DLookup("[Inhoud]", "Tbl_Mail", "[MailID]=" & 2)

Dan wordt de waarde uit het veld 'Inhoud' gehaald, daar waar MailID=2. Dat werkt.
De waarde uit veld 'Inhoud' is: "Uw naam: " & Me.VarNaam

Ik zou verwachten dat VBA dit als code uitvoert, ipv als tekst interpreteert.
Ik zou graag willen dat VBA het inleest als: "Uw naam: Harrie1970", waarbij Me.VarNaam uitgelezen wordt uit het actieve formulier.
 
Eg nie! Een tekstveld bevat tekst en het zal Access niet uitmaken welke tekens jij daar in zet. Een tekst als )(*&Y basljkdf8o7q34y t07asd krijgt dezelfde behandeling als "Uw naam: " & Me.VarNaam. Kortom: je kunt geen variabelen in een tekstveld noemen en hopen dat Access dat als zodanig herkent. Dat kun je alleen met VBA doen. Overigens lijkt mij dat geen enkel probleem...
 
Het is dus niet mogelijk om tekst om te zetten naar een voor VBA duidelijke taal?
Het is geen optie het in VBA te zetten, omdat er veel gebruikers in de database zitten gedurende de hele dag. Wijzigingen kunnen moeizaam worden doorgevoerd, zolang deze gebruikers erin zitten.
 
Ik snap je procedure niet; je werkt overduidelijk op een formulier (Me.varEmailadres) dus je kunt de naam daar ook vanaf halen met Me.VarNaam. Dus waarom kan het volgens jou dan wél met het email adres, maar niet met de naam?
 
Wat moet ik nog meer zeggen dan? De mails omvatten meer tekst dan alleen de variabelen (zoals Me.VarNaam) die ik erin opneem. De tekst van de mail verandert regelmatig en ik wil niet altijd hoeven te wachten totdat iedereen de database heeft verlaten om de VBA code te kunnen aanpassen.
Het liefst zou ik zoiets zien als:
VarSubj = DLookup("[Onderwerp]", "Tbl_Mail", "[MailID]=" & 2)
VarMsg = DLookup("[Inhoud]", "Tbl_Mail", "[MailID]=" & 2)
DoCmd.SendObject acSendNoObject, , , Me.VarEmailadres, Me.VarEmailadres, , VarSubj, VarMsg, False
 
Laatst bewerkt:
Dat werkt toch? Nu snap ik er helemaal niets meer van...
Dit heb ik inmiddels gedaan door een tabel Tbl_Mail aan te maken met velden Onderwerp en Inhoud.
Het veld Inhoud is van het type Memo. Als ik deze waarde (van veld Inhoud) in een variabele (VarMsg) opvang in VBA en deze variabele vervolgens neerzet waar de inhoud hoort te staan, dan lukt dat aardig.
Ik snap niet waarom je zou moeten wachten tot iedereen de db uit is voordat je iets in je VBA kunt wijzigen, want je hoeft helemaal niks te wijzigen. Je variabele tekst staat in de tabel, en de naam staat op het formulier. De verwijzing Me.varNaam wijzigt dus niet.
 
Zoals ik al aangaf, bevatten de mails MEER TEKST dan alleen de variabelen. Dus nee het bovenstaande werkt niet.
Het waarom is nu niet belangrijk.
Ik vraag alleen maar of de inhoud van veld Inhoud in Tbl_Mail als VBA code kan worden geïnterpreteerd.
 
Ik vraag alleen maar of de inhoud van veld Inhoud in Tbl_Mail als VBA code kan worden geïnterpreteerd.
Daar heb ik het antwoord op gegeven in bericht #6.
En verder gebruik je het begrip 'variabele' op een onhandige manier, want wat jij variabel lijkt te noemen (de tekst in je tabel) is in feite het vaste gegeven waarmee je werkt. Dat je dat in de tabel verandert staat los van de procedure. Een variabele is iets als:
Code:
Dim varNaam As String
varNaam = Environ("VBA.Username")
Als je niet goed uitlegt wat nu echt de bedoeling is, valt er weinig te helpen en alleen maar te gokken. Voor jou is het misschien duidelijk wat je bedoelt, maar voor mij dus nog steeds niet. Al begin ik langzaam het idee te krijgen dat je de vaste tekst in de tabel wilt combineren met tekst die je uit het formulier haalt. Maar da's dus weer een gok...
 
Het veld 'Inhoud' bevat de volgende code:
"Beste collega,

U heeft zich ingeschreven voor de workshop Blabla.

Uw naam: " & Me.VarNaam & vbCrLf
"Datum: " & Me.VarDatum & vbCrLf
"Tijd: " & Me.VarTijd & vbCrLf
"Locatie: " & Me.VarLocatie & vbCrLf & vbCrLf

"Wij hopen u op deze dag te verwelkomen.

Met vriendelijke groet,
Blabla"
Deze code die in het Inhoud-veld staat, wil ik op de één of andere manier door VBA uit laten voeren.
 
Kun je vergeten. Je zult de tekst met VBA moeten samenstellen. Wat overigens niet echt moeilijk is, dus waarom zou je het ingewikkeld doen? Het is heel wat makkelijker om de variabele via VBA samen te stellen, dan (via dezelfde programmeertaal) de inhoud van het veld te splitsen en 'om te bouwen' naar VBA elementen.
 
En om je een beetje op weg te helpen:
Code:
Dim varMsg As String
varMsg = "Beste collega," & vbLf & vbLf & "U heeft zich ingeschreven voor de workshop " & Me.workshop & "." & vbLf & vbLf
varMsg = varMsg & "Uw naam: " & Me.VarNaam & vbCrLf
varMsg = varMsg & "Datum: " & Me.VarDatum & vbCrLf
varMsg = varMsg & "Tijd: " & Me.VarTijd & vbCrLf
varMsg = varMsg & "Locatie: " & Me.VarLocatie & vbCrLf & vbCrLf
varMsg = varMsg & "Wij hopen u op deze dag te verwelkomen." & vbCrLf & vbCrLf
varMsg = varMsg & "Met vriendelijke groet," & vbCrLf & vbCrLf
varMsg = varMsg & Environ(VBA.UserName)
 
Ok, ik weet genoeg. Hoe ik het in VBA moet doen, was mij al duidelijk. Maar omdat ook de VBA code niet aangepast kan worden tijdens het gebruik van de database, is dat geen optie.
Bedankt voor het meedenken.
 
Maar omdat ook de VBA code niet aangepast kan worden tijdens het gebruik van de database, is dat geen optie.
Volgens mij snap je het niet helemaal; een VBA procedure maak je eenmaal, daarna rol je de db uit bij de gebruikers en hoef je verder niks meer te doen. Ik snap al een tijdje niet waarom je zo'n punt maakt van het aanpassen van de code terwijl de db wordt gebruikt, want dan doe je het volgens mij toch echt niet goed... De inhoud van een veld kun je echt wel wijzigen tijdens het gebruik. Alleen de programmacode ligt vast. Maar dat moet je ook willen, lijkt mij.
 
In de programmacode staat toch ook de tekst van de mail? Of zie ik dat nu verkeerd? Dat is dus wat er geregeld bij ons wijzigt.
Ga mij niet vertellen hoe ik mijn VBA code moet schrijven want dat doe ik al ruim 10 jaar, dus ja... ik snap heus wel waar ik mee bezig ben.
Wat mij irriteert is dat je het niet bij het beantwoorden van mijn vraag houdt, misschien snap ik het wel maar jij niet. Je doet voorkomen dat ik niet helemaal goed bij mijn hoofd ben ofzo, maar ik vraag een simpele vraag. Het antwoord kan 'Het kan' of 'Het kan niet' zijn, maar vertel me niet dat ik het niet snap!!!
 
Wat je dus wilt doen is VBA code uit een string lezen om die vervolgens uit te voeren. Dat kan, maar dan moet je dan doen in een nieuwe, vanuit VBA aangemaakte module waarin je een Sub maakt die de code uit de strings bevat. Zie dit voorbeeld:

Code:
Sub OpdrachtUitString() 
    Dim LineNum As Long
    x = 10 
    mystring1 = "for i = 1 to " & CStr(x) 
    mystring2 = " msgbox i" 
    mystring3 = " next i" 
     

    'Maak een nieuwe module in het huidige werkboek en voeg de code uit strings erin, in een Sub.
    'Dan kun je die Sub uitvoeren en de module weer verwijderen.
     
    Set VBComp = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule) 
    VBComp.Name = "NewModule" 

    'Voeg de code in
    Set VBCodeMod = ThisWorkbook.VBProject.VBComponents("NewModule").CodeModule 
    With VBCodeMod 
        LineNum = .CountOfLines + 1 
        .InsertLines LineNum, _ 
        "Sub MyNewProcedure()" & Chr(13) & _ 
        mystring1 & Chr(13) & _ 
        mystring2 & Chr(13) & _ 
        mystring3 & Chr(13) & _ 
        "End Sub" 
    End With 
     
    'Voer de Sub uit
    Application.Run "MyNewProcedure" 
    
    'Verwijder de module
    ThisWorkbook.VBProject.VBComponents.Remove VBComp 
End Sub

Om dit te kunnen doen moet je wel een reference in VBA maken naar:
Microsoft Visual Basic For Applications Extensibility library

Ik heb dat in Acces echter nog nooit gedaan.
 
Laatst bewerkt:
In de programmacode staat toch ook de tekst van de mail? Of zie ik dat nu verkeerd?
Ik heb slechts een voorbeeldje laten zien van vaste tekst i.c.m. formuliervelden. Het staat je vrij om de vrije tekst uit een tabel te halen met DLookup, of uit formuliervelden die je dan ook nog eens niet-afhankelijk kunt maken zodat de gebruiker er vrije tekst in kan zetten die niet in je tabel staat. Kortom: je kunt de mail net zo flexibel maken als je wilt. Alleen moet je niet willen dat je de complete code in een memoveld zet, die je dan vervolgens helemaal met VBA uit elkaar moet trekken om er weer fatsoenlijke code van te maken. Nog afgezien van het feit dat als je de code letterlijk in een tabel opslaat in een memoveld, die inhoud door een gebruiker aangepast kan worden op een zodanige manier dat-ie nooit meer werkt. Laat gebruikers de flexibele tekst invullen op een formulier, en genereer met je VBA de complete mailtekst.

Wat mij irriteert is dat je het niet bij het beantwoorden van mijn vraag houdt, misschien snap ik het wel maar jij niet. Je doet voorkomen dat ik niet helemaal goed bij mijn hoofd ben ofzo, maar ik vraag een simpele vraag. Het antwoord kan 'Het kan' of 'Het kan niet' zijn, maar vertel me niet dat ik het niet snap!!!
Het maakt mij niet uit of je 1 dag programmeert of 20 jaar, zolang je je eigen vraag niet zodanig kan uitleggen dat ik 't snap (en de rest van de lezers gezien de antwoorden) ligt het probleem niet bij mij, maar bij jou. Ik probeer je te helpen, maar dan moet ik wel weten wat je nu wilt.
Als een database aangepast moet worden, moet je de gebruikers er uit gooien. Zo simpel is dat. Onderhoud moet nu eenmaal wel eens plaatsvinden in een database. Dus dat er nog gebruikers actief zijn is geen reden om het onderhoud niet op de juiste wijze te doen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan