Office to Outlook agenda" kleine" wijziging in code

Status
Niet open voor verdere reacties.

Fuser149

Gebruiker
Lid geworden
13 feb 2012
Berichten
33
Ik heb een code gekoppeld aan een knop om een access record automatisch in outlook agenda op te slaan. Dit lukt perfect al wil ik bij reminder niet enkel in minuten weergeven maar ook in uren dagen en weken... Kan ik mijn code aanpassen zodat dit lukt?

Code:
Private Sub Outlook_Check()
If Me!AddedToOutlook = True Then
        MsgBox "This appointment already added to Microsoft Outlook"
        Exit Sub
    Else
        Dim olApp As Outlook.Application
        Dim OutAppt As Outlook.AppointmentItem
        If isAppThere("Outlook.Application") = False Then            ' Outlook is not open, create a new instance
        Set outobj = CreateObject("Outlook.Application")
        Else            ' Outlook is already open--use this method
            Set olApp = GetObject(, "Outlook.Application")
        End If
        Set OutAppt = olApp.CreateItem(olAppointmentItem)
End Sub

Private Sub AddAppt_Click()
' Save record first to be sure required fields are filled.
DoCmd.RunCommand acCmdSaveRecord
' Exit the procedure if appointment has been added to Outlook.
If Me!AddedToOutlook = True Then
MsgBox "This appointment already added to Microsoft Outlook"
Exit Sub
' Add a new appointment.
Else
Dim outobj As Outlook.Application
Dim OutAppt As Outlook.AppointmentItem
Set outobj = CreateObject("outlook.application")
Set OutAppt = outobj.CreateItem(olAppointmentItem)
With OutAppt
.Start = Me!ApptDate & " " & Me!ApptTime
.Duration = Me!ApptLength
.Subject = Me!Appt
If Not IsNull(Me!ApptNotes) Then .Body = Me!ApptNotes
If Not IsNull(Me!ApptLocation) Then .Location = _
Me!ApptLocation
If Me!ApptReminder Then
.ReminderMinutesBeforeStart = Me!ReminderMinutes
.ReminderSet = True
End If
.Save
End With
End If
' Release the Outlook object variable.
Set outobj = Nothing
' Set the AddedToOutlook flag, save the record, display a message.
Me!AddedToOutlook = True
DoCmd.RunCommand acCmdSaveRecord
MsgBox "Appointment Added!"
Exit Sub
AddAppt_Err:
MsgBox "Error " & Err.Number & vbCrLf & Err.Description
Exit Sub
End Sub


Alvast bedankt

groeten
 
Laatst bewerkt:
Als je niets van programmeren kent lijkt me dit een onmogelijke opdracht
 
Niemand een idee? Ik wil gwn reminder in minuten, uren, dagen en weken? Welke velden moet ik toevoegen in tabel en hoe zet ik deze in mijn code?

groeten
 
Een reminder opslaan in ReminderMinutesBeforeStart is niks anders als een getal toekennen. Het getal 30 is dus 30 minuten. Wil je er 3 uur van maken, dan moet je die tijd omrekenen naar minuten, dus: 60*3=180. Je vult dus 180 in. En voor 3 dagen moet je de tijd met 24*60 vermenigvuldigen. 2 dagen van tevoren is dus 2*60*24. De truc ligt niet zozeer in de code, als wel op je formulier, waar je de gebruiker zult moeten laten aangeven wat hij wil instellen: minuten, uren, dagen, weken etc. Aan jou om die keuze te vertalen naar getallen. Ik zou dat doen via een Frame met Radiobuttons. De waarde daarvan lees je uit, en op basis daarvan maak je met een Select Case de juiste berekening.
 
@snb
Leuke code. Ik heb echter een vraag over iets wat mij al langer opvalt in jouw posts.
Zoals je weet bestaan er twee soorten variabelen: value type en reference type.
Geheugentechnisch worden Value types aangemaakt op de stack; het geheugen dat daarvoor nodig is wordt automatisch opgeruimd wanneer een variabele out of scope raakt (wanneer je bijv. een routine verlaat).
Ref. type objecten worden echter aangemaakt op de zgn heap. Deze variabelen dienen dus expliciet te worden opgeruimd om geheugenlekken te voorkomen.
Ik zie wel dat je createobject (late binding) en New (early binding) gebruikt om objecten te instantieren. De corresponderende Set [object] = Nothing mis ik echter.
Gok je erop dat het systeem waarop de code draait vaak genoeg gereboot wordt of mis ik iets?
 
Veel dank Octafish ik begrijp ongeveer wat je bedoelt maar wat zijn radiobuttons en wat is een select case? :p

Alvast bedankt

groeten
 
@enijhuis

Door het afzien van het gebruik van objectvariabelen, maar gebruik te maken van With...End With worden voorzover ik weet de geheugenposties bij het beeindigen van de procedure automatisch opgeruimd.
Ik zou niet weten hoe =nothing te koppelen aan een impliciet object via With ... End With.
Herstarten van een systeem lijkt me immer wenselijk te vermijden.
 
@snb
Ik kan nergens iets vinden dat jouw stelling mbt het vrijgeven van geheugen mbt impliciete objecten en '(End) With' bevestigt.
Hier wordt echter wel beweerd dat het meermalen instantieren van objecten zonder het op te ruimen geen dramatische effecten heeft.
 
@enijhuis

je kunt het afleiden uit de bespreking van With ... End With in de hulp van de VBEditor

Note
In general, it's recommended that you don't jump into or out of With blocks. If statements in a With block are executed, but either the With or End With statement is not executed, a temporary variable containing a reference to the object remains in memory until you exit the procedure.
 
@snb
Klopt; de temporary variable wordt automatisch opgeruimd wanneer het uit scope raakt. Reference-variabelen fungeren als een soort 'pointer' naar het geheugen waar het object zich bevindt. COM houdt op de achtergrond bij hoeveel references er naar een object wijzen. Wanneer dit aantal gelijk wordt aan nul wordt het geheugen op de heap opgeruimd. Met Set [object] = Nothing verwijder je expliciet de verwijzing naar een object. Vooral wanneer je te maken hebt met member- of globale scopes van objecten is dit een goed gebruik.
 
Laatst bewerkt:
@snb en enijhuis: Jullie discussie is op zich interessant, maar totaal niet relevant voor de vraag van TS. Start een eigen draadje, zou ik zeggen! Of ga mailen...

@TS:
Als je een Groepsvak maakt, kun je volstaan met 4 opties in dat groepsvak: Minuten, Uren, Dagen, en Weken. Standaard krijgen die een waarde, van 1-4. Dat groepsvak geef je dan het besturingselement Keuzerondjes (Radiobuttons dus). Vervolgens kun je op basis van de gekozen optie de totale duur uitrekenen. Ik heb dat als volgt gedaan:

1. Een groepsvak gemaakt met de naam <fraDuur>
2. Twee tekstvakken gemaakt met de naam <txtReminder> en <txtAppReminderDuration>
3. Een gebeurtenis gemaakt voor het Groepsvak bij de actie <Bij Klikken>

Die code ziet er als volgt uit:

Code:
Private Sub fraDuur_Click()
Dim iFactor As Long
    iFactor = 1
    Select Case fraDuur
        Case 1
            iFactor = 1
        Case 2
            iFactor = 60
        Case 3
            iFactor = 24 * 60
        Case 4
            iFactor = 24 * 7 * 60
        Case Else
    End Select
    Me.txtAppReminderDuration = Nz(Me.txtReminder, 0) * iFactor
    Me.Repaint
End Sub
Ik heb een variabele gedefinieerd die op basis van de gekozen selectie de jusite verlengingsfactor berekent. Voor het overzicht heb ik hier de volledige formule gebruikt, zodat je kunt zien waar hij vandaan komt.
Als laatste wordt op basis van de ingestelde iFactor de duur berekend.
 
Nice het groepsvak is me intussen gelukt. Als ik goed begrijp moet ik van deze twee tekstvakken opnemen in mijn tabel. En moet ik de naam van deze velden ook wijzigen in mijn outlook button code?

Edit: Het tekstvak txtAppReminderDuration komt overeen met mijn veld ReminderMinutes(zie code bovenaaan) als ik het goed heb. Het tekstvak txtReminder kan ik niet plaatsen heb ik al een overeenkomstig veld in mijn code? of moet ik hiervoor een nieuw veld maken in tabel?

Hartelijk dank
 
Laatst bewerkt:
Je hebt een tekstveld nodig waarin de gebruiker 'logische' waarden intypt, in combinatie met een keuzerondje. Dus: 30 minuten, 2 dagen, 1 week. Dat soort combinaties. Op basis van de inhoud van het tekstvak, en de conde onder het frame, reken je dan de uiteindelijke tijd uit die je opslaat in Outlook. Dus: je hebt een veld nodig dat de gebruiker invult (in voorbeeld: txtReminder) en er is een veld dat het resultaat laat zien: txtAppReminderDuration. Dat laatste veld heb je niet eens nodig op je formulier, want de gebruiker hoeft niet te weten dat er 14332 minuten van te voren een reminder wordt afgespeeld. Het resultaat kun je dus net zo goed verbergen. Maar zodra je de afspraak in Outlook gaat zetten, heb je die waarde nodig. Vandaar dat ik, om e.e.a. duidelijker te maken, met twee tekstvakken werk.
Samenvattend: het veld txtReminder is alleen maar bedoeld om de gebruiker een logische waarde te laten invullen. Het veld txtAppReminderDuration is het enige veld dat je opslaat in Outlook, en hoef je op het formulier dus niet eens te zien.
 
Oke bedankt octa alles loopt perfect nu ik ga nu net hetzelfde doen met de duur van het evenement maar met andere namen voor tekstvakken en groepsvak.

Mijn database is voor een groot deel aan u te danken!

groeten

Willem
 
Laatst bewerkt:
Wordt het tekstvak ReminderMinutes wel gevuld als je een waarde hebt in txtReminder? Ik heb 'm getest, en bij mij werkt het. Ik heb een voobeeldje bijgesloten.
 

Bijlagen

Wordt het tekstvak ReminderMinutes wel gevuld als je een waarde hebt in txtReminder? Ik heb 'm getest, en bij mij werkt het. Ik heb een voobeeldje bijgesloten.

Is al in orde nu code werkt perfect! Veel dank voor de hulp ik heb mijn database grotendeels aan u te danken :-)

groeten

Willem
 
Ik mag deze vraag blijkbaar niet in een nieuwe topic zetten dus zet ik hem hier: Beste ik heb een goede code gevonden die access records pslaat in mijn outlook agenda. Deze code werkt uitstekend maar als outlook niet open staat zet hij de afspraak niet in Outlook: er komt onderaan wel een icoontje dat een programma verbinding maakt met outlook maar de afspraak zelf komt niet in de agenda. Iemand die dit probleem kan verhelpen? Hieronder vindt u de code:

Code:
Private Sub Outlook_Check()
If Me!AddedToOutlook = True Then
MsgBox "This appointment already added to Microsoft Outlook"
Exit Sub
Else
Dim olApp As Outlook.Application
Dim OutAppt As Outlook.AppointmentItem
If isAppThere("Outlook.Application") = False Then
Set outobj = CreateObject("Outlook.Application")
Else
Set olApp = GetObject(, "Outlook.Application")
End If
Set OutAppt = olApp.CreateItem(olAppointmentItem)
End Sub
Private Sub AddAppt_Click()
' Save record first to be sure required fields are filled.
DoCmd.RunCommand acCmdSaveRecord
' Exit the procedure if appointment has been added to Outlook.
If Me!AddedToOutlook = True Then
MsgBox "This appointment already added to Microsoft Outlook"
Exit Sub
' Add a new appointment.
Else
Dim outobj As Outlook.Application
Dim OutAppt As Outlook.AppointmentItem
Set outobj = CreateObject("outlook.application")
Set OutAppt = outobj.CreateItem(olAppointmentItem)
With OutAppt
.Start = Me!ApptDate & " " & Me!ApptTime
.Duration = Me!ApptLength
.Subject = Me!Appt
If Not IsNull(Me!ApptNotes) Then .Body = Me!ApptNotes
If Not IsNull(Me!ApptLocation) Then .Location = _
Me!ApptLocation
If Me!ApptReminder Then
.ReminderMinutesBeforeStart = Me!ReminderMinutes
.ReminderSet = True
End If
.Save
End With
End If
' Release the Outlook object variable.
Set outobj = Nothing
' Set the AddedToOutlook flag, save the record, display a message.
Me!AddedToOutlook = True
DoCmd.RunCommand acCmdSaveRecord
MsgBox "Appointment Added!"
Exit Sub
AddAppt_Err:
MsgBox "Error " & Err.Number & vbCrLf & Err.Description
Exit Sub
End Sub
Private Sub fraDuur_Click()
Dim iFactor As Long
    iFactor = 1
    Select Case fraduur
        Case 1
            iFactor = 1
        Case 2
            iFactor = 60
        Case 3
            iFactor = 24 * 60
        Case 4
            iFactor = 24 * 7 * 60
        Case Else
    End Select
    Me.ReminderMinutes = Nz(Me.txtReminder, 0) * iFactor
    Me.Repaint
End Sub
 
Het staat allemaal uitgelegd op de site waarnaar ik je verwees.
 
Het staat allemaal uitgelegd op de site waarnaar ik je verwees.
Kan ik de methode create object en get object door elkaar gebruiken zoals ik in mijn bovenstaande code heb gedaan? Want de methode create object lukt niet bij mij.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan