Access VBA tips & trucs (28-1-2010)

 

Vragen beantwoord ik tegen betaling van een uurtarief van € 60,- met een minimum van 1 uur

 

I N H O U D S O P G A V E

 

Access VBA tips & trucs (28-1-2010)

1 Functie om bedragen in klassen te verdelen

2 Rijen uit een rapport om en om kleuren

3 Voorbeeldcode opslaan veranderingen in aparte historietabel

4 Controle burger servicenummer

5 Gegevens van Access naar Word formuliervelden

6 Functie om Nederlandse weeknummer af te leiden .

7 Functie om de leeftijd te berekenen

 


•  Functie om bedragen in klassen te verdelen

Function klasse(getal As Long) As String

Dim j As Long

j = 100000

klasse = Int((getal - 1) / j) * j + 1 & "-" & Int(getal / j) * j + j

End Function

•  Rijen uit een rapport om en om kleuren

Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)

Dim ctl As Control

For Each ctl In Detail.Controls

ctl.BackStyle = 0

Next

If Detail.BackColor = RGB(200, 255, 255) Then

Detail.BackColor = RGB(255, 200, 255)

Else

Detail.BackColor = RGB(200, 255, 255)

End If

End Sub

 

•  Voorbeeldcode opslaan veranderingen in aparte historietabel

 

Sub logWijziging(frm As Form, recid As String)

Dim bron As String, naam As String, geb As String, ctlText As Control

naam = frm.Name

bron = frm.RecordSource

geb = CurrentUser

For Each ctlText In frm.Controls

'als de inhoud van een control van het type textbox veranderd is

'wordt de procedure historie aangeroepen

If ctlText.ControlType = acTextBox Then

'met acTextbox kijken we alleen naar controls van het type text

If ctlText.Value <> ctlText.OldValue Then

'bovenstaande test of er verschil is tussen de huidige inhoud en de vorige

Call historie(recid, bron, naam, geb, ctlText.Name, ctlText.OldValue, ctlText.Value)

'de waarden tussen haakjes worden meegegeven naar de procedure historie

End If

End If

Next ctlText

End Sub

 

Sub logWijziging(frm As Form, recid As String)

Dim bron As String, naam As String, geb As String, ctlText As Control

naam = frm.Name

bron = frm.RecordSource

geb = CurrentUser

For Each ctlText In frm.Controls

'als de inhoud van een control van het type textbox veranderd is

'wordt de procedure historie aangeroepen

If ctlText.ControlType = acTextBox Then

'met acTextbox kijken we alleen naar controls van het type text

If ctlText.Value <> ctlText.OldValue Then

'bovenstaande test of er verschil is tussen de huidige inhoud en de vorige

Call historie(recid, bron, naam, geb, ctlText.Name, ctlText.OldValue, ctlText.Value)

'de waarden tussen haakjes worden meegegeven naar de procedure historie

End If

End If

Next ctlText

End Sub

 

Sub historie(recid As String, bron As String, naam As String, geb As String, veld As String, oud As String, nieuw As String)

'de waarden tussen haakjes worden ontvangen als de procedure wordt aangeroepen

'deze procedure plaatst een aantal gegevens in een tabel historie als de gebruiker wijzigingen in een formulier

'aanbrengt dat deze procedure aanroept bij de before_update gebeurtenis van het formulier

'ook bij toevoegen

 

'voor het volgende moet de Microsoft DAO 3.6 library gekoppeld zijn (voor Access 97 versie 3.5)

Dim db As dao.Database

Dim rs As dao.Recordset

'Dim conn As DAO.Connection

'conn.Execute(sql)

'db.execute(sql)

 

'bovenstaande roept twee objecten in het leven: een database en een recordset

Set db = CurrentDb

'stelt db gelijk aan de huidig geopende database

'met set db = opendatabase("....") open je een andere database

Set rs = db.OpenRecordset("tblHistorie")

'het volgende stuk voegt een nieuw record toe, vult de waarden in en schrijft het weg naar de tabel

With rs

.AddNew

.Fields("datumwijziging").Value = Date

.Fields("tijdwijziging").Value = Time

.Fields("wijzigingdoor").Value = geb

.Fields("recordbron").Value = bron

.Fields("formnaam").Value = naam

.Fields("recordnummer").Value = recid

.Fields("veld").Value = veld

.Fields("oudeWaarde").Value = oud

.Fields("nieuweWaarde").Value = nieuw

.Update

End With

'hieronder worden de boven gedeclareerde en gevulde objecten gesloten en uit het geheugen gehaald

rs.Close

Set rs = Nothing

db.Close

Set db = Nothing

End Sub

 

•  Controle burger servicenummer

Function Bsn(s)

Dim getal As Integer

getal = 9 * Mid(s, 1, 1)

getal = getal + 8 * Int(Mid(s, 2, 1))

getal = getal + 7 * Int(Mid(s, 3, 1))

getal = getal + 6 * Int(Mid(s, 4, 1))

getal = getal + 5 * Int(Mid(s, 5, 1))

getal = getal + 4 * Int(Mid(s, 6, 1))

getal = getal + 3 * Int(Mid(s, 7, 1))

getal = getal + 2 * Int(Mid(s, 8, 1))

getal = getal + -1 * Int(Mid(s, 9, 1))

'MsgBox getal

If getal Mod 11 = 0 Then

Bsn = True

Else

Bsn = False

End If

End Function

•  Gegevens van Access naar Word formuliervelden

Private Sub cmdWord_Click()

Dim db As Database

Dim rs As Recordset

Set db = CurrentDb

Set rs = db.OpenRecordset("reserveren")

rs.AddNew

rs.Fields("reserveren").Value = Me.Achternaam.Value

rs.Update

 

Dim wrd As Word.Application

Set wrd = CreateObject("Word.Application")

wrd.Visible = True

wrd.Activate

wrd.WindowState = wdWindowStateMaximize

wrd.Documents.Add "c:\data\walmar\cursussen\oefeningen\eigen\access\brief.dot"

wrd.ActiveDocument.FormFields("achternaam").Result = Me.Achternaam.Value

wrd.ActiveDocument.FormFields("voorletter").Result = Me.Voorletter.Value

If Me.Voorvoegsel.Value <> "" Then

wrd.ActiveDocument.FormFields("voorvoegsel").Result = Me.Voorvoegsel.Value

End If

End Sub

•  Functie om Nederlandse weeknummer af te leiden

Function weekNummerNL(datum As Date) As String

'integer als output: geheel getal

'date als input: datum

Dim intWeeknr As Integer

 

intWeeknr = DatePart("ww", datum, 2, 2)

weekNummerNL = "week " & Right("00" & intWeeknr, 2)

End Function

•  Functie om de leeftijd te berekenen

Function leeftijd(datum)

If Month(Date) > Month(datum) Then

leeftijd = Year(Date) - Year(datum)

Else

If Month(Date) < Month(datum) Then

leeftijd = Year(Date) - Year(datum) - 1

Else

If Day(Date) < Day(datum) Then

leeftijd = Year(Date) - Year(datum) - 1

Else

leeftijd = Year(Date) - Year(datum)

End If

End If

End If

End Function