Opgelost Macro’s in access

Dit topic is als opgelost gemarkeerd
Status
Niet open voor verdere reacties.

Opnieuw uitvogelen

Gebruiker
Lid geworden
14 nov 2023
Berichten
26
Het is alweer een tijdje geleden dat ik access heb gebruikt. Ben nu in nieuwe versie bezig, volgens mij versie 2019. Basis zaken kan ik terugvinden, maar bij de macro’s raak ik deceeg kwijt. Geen enkele functie die ik nodig heb, kan ik vinden. De lijst met beschikbare functies is zo beperkt, dat dit niet alles kan zijn.
Ik wil een macro maken die na creatie nieuw record de primaire sleutelveld vult met een nummer dat is samengesteld uit het huidig jaartal en een volgnummer. Krijg het niet gevonden in dat nieuwe acces. Iemand die de toegang weet naar de functies om waarden in velden in te stellen?
 
Ik weet niet of je dat überhaupt voor elkaar krijgt met een macro. In dit geval zou ik een gebeurtenisprocedure in VBA schrijven. De (formulier) gebeurtenis voor invoegen wordt dan iets in de trant van:
Code:
Private Sub Form_BeforeInsert(Cancel As Integer)
Dim Jaar As String
Dim Hoogste As Variant

Jaar = Year(Date)
Hoogste = Nz(DMax("Sleutelveld", "DeTabel", "Left(Sleutelveld,4)='" & Jaar & "'"), 0)

If Hoogste = 0 Then
  Me.Sleutelveld = Jaar & "0001"
Else
  If Hoogste = Jaar & "9999" Then
     MsgBox "Er zijn geen vrije nummers meer", vbCritical, "Nummers op"
     Cancel = True
  Else
     Me.Sleutelveld = Hoogste + 1
  End If
End If

Me.Refresh
End Sub
 
Ik denk niet dat je veel vrienden gaat maken als je met Macro's wilt gaan werken. Ik haak dan in ieder geval af :).

Het kan ook een stuk simpeler in mijn beleving. Ik gebruik altijd een aparte functie voor volgnummers, die makkelijk is aan te passen aan je behoefte. Deze frunctie gebruik je dan als Standaardwaarde op het gewenste veld, je hoeft dus verder niks te programmeren op je formulier. De functie zet je op een (willekeurige of nieuwe) module:

Code:
Function VolgNummer() As String
Dim strSQL As String, sWaarde As String, iNummer As Integer, iJaar As Integer

    strSQL = "SELECT TOP 1 VolgNummer FROM JouwTabel ORDER BY VolgNummer DESC"
    With CurrentDb.OpenRecordset(strSQL)
        If Not .BOF And Not .EOF Then sWaarde = !VolgNummer.Value
        .Close
    End With
    If sWaarde & "" = "" Then GoTo GeenNummer
    '' Twee varianten in de IF: één met koppelteken, en één zonder koppelteken
    If InStr(1, sWaarde, "-") > 0 Then
        iJaar = Split(sWaarde, "-")(LBound(Split(sWaarde, "-")))
        iNummer = Split(sWaarde, "-")(UBound(Split(sWaarde, "-")))
    Else
        iJaar = Left(sWaarde, 4)
        iNummer = Right(sWaarde, 4) + 1
    End If
    If iJaar = CStr(Year(Date)) Then
        VolgNummer = iJaar & "-" & Right("0000" & iNummer)
    Else
        'Kies kies de tweede variant als je geen koppelteken gebruikt
        VolgNummer = CStr(Year(Date) & "-0001")
        ''VolgNummer = CStr(Year(Date) & "0001")
    End If
    Exit Function
   
GeenNummer:
        VolgNummer = CStr(Year(Date) & "-0001")

End Function

Die standaardwaarde op het formulierveld krijgt dus deze formule: =FactuurNummer()
Ik heb twee varianten: één voor volgnummers met als opmaak 2023-0123 en één met als resultaat 20230123. Kijk maar welke variant je nodig hebt.
 
Hmmm. Tja, interessante formules, zeker bruikbaar. Maar waar zet ik die neer? En waar vind ik de gebeurtenis om aan te koppelen?
De versie die ik gebruikte was er een van 10 jaar geleden denk. Misschien ben ik nog te veel aan het vertalen uit de oude versie.
 
Ook in de Access-versie van 10 jaar geleden kon je al de gebeurtenis "Voor invoegen" (BeforeInsert) maken op een formulier. Heden ten dage werkt dat nog op dezelfde manier:
  • Open de formuliereigenschappen (van het formulier waarmee je gegevens invoert);
  • Ga naar het tabblad "Gebeurtenis";
  • Klik bij de gebeurtenis "Voor invoegen" op het dopdrown-symbool en kies "Gebeurtenisprocedure";
  • Klik op de drie puntjes en plak of schrijf de VBA code voor de gebeurtenis (zie in dit geval post #2). Uiteraard moet je die nog wel aanpassen voor je eigen situatie (tabel- en veldnaam, aantal posities volgnummer).
 
Niet gebruiken die gebeurtenis, is mijn advies. Ga naar het VBA scherm (<Alt>+<F11>), maak een nieuwe module aan via <Invoegen>, plak daar mijn functie (pas uiteraard wel de veldnaam en de tabelnaam aan) en gebruik op het juiste veld de functie zoals ik 'm het neergezet bij de eigenschap <Standaardwaarde> van dat veld. Dan komt alles goed.
Enm ja, die functionaliteit zit er al minstens 30 jaar in :).
 
Onderbouwen is nergens voor nodig. Het lijkt mij voldoende om een goed werkende oplossing aan te dragen die stabiel is. En simpel.
 
Ook in de Access-versie van 10 jaar geleden kon je al de gebeurtenis "Voor invoegen" (BeforeInsert) maken op een formulier. Heden ten dage werkt dat nog op dezelfde manier:
  • Open de formuliereigenschappen (van het formulier waarmee je gegevens invoert);
  • Ga naar het tabblad "Gebeurtenis";
  • Klik bij de gebeurtenis "Voor invoegen" op het dopdrown-symbool en kies "Gebeurtenisprocedure";
  • Klik op de drie puntjes en plak of schrijf de VBA code voor de gebeurtenis (zie in dit geval post #2). Uiteraard moet je die nog wel aanpassen voor je eigen situatie (tabel- en veldnaam, aantal posities volgnummer).
ik heb deze geprobeerd. zie bijlage. Maar ik krijg een foutmelding als ik een nieuw record invoeg. Ik heb mogelijk de gebeurtenis niet goed bewerkt. Ik wil het jaar zonder koppelteken gebruiken. Het eerste is de foutmelding die ik krijg. Het tweede hoe de gebeurtenis is opgebouwd

het formulier heet NAW gegevens en de primaire sleutel is lidnummer
1700401117828.png

1700399585442.png
 
Laatst bewerkt:
Niet gebruiken die gebeurtenis, is mijn advies. Ga naar het VBA scherm (<Alt>+<F11>), maak een nieuwe module aan via <Invoegen>, plak daar mijn functie (pas uiteraard wel de veldnaam en de tabelnaam aan) en gebruik op het juiste veld de functie zoals ik 'm het neergezet bij de eigenschap <Standaardwaarde> van dat veld. Dan komt alles goed.
Enm ja, die functionaliteit zit er al minstens 30 jaar in :).
als ik op alt+F11 klik gebeurt er niets. Dus ik weet niet hoe ik in dat formulier moet komen.
 
ik heb deze geprobeerd. zie bijlage. Maar ik krijg een foutmelding als ik een nieuw record invoeg
Het lijkt erop dat je de twee aangeboden oplossingen een beetje door elkaar gooit.
Je maakt OF een gebeurtenisprocedure (voor invoegen) op het formulier OF je maakt een functie die je aanroept vanuit je tabeldefinitie.
Nu begin je met het eerste en zet daar vervolgens de definitie van een functie neer.
 
Je maakt OF een gebeurtenisprocedure (voor invoegen) op het formulier OF je maakt een functie die je aanroept vanuit je tabeldefinitie.
Huh? Ik zie jouw oplossing (gebeurtenis Invoegen) en mijn oplossing (functie aanroep op veld). Waar (en van wie) is de oplossing met de tabel definitie?
 
Misschien hebben we de verkeerde procedure op de verkeerde plek gekopieerd? Maar ik weet niet wat je met tabel definitie bedoeld
 
Ik weet niet of je dat überhaupt voor elkaar krijgt met een macro. In dit geval zou ik een gebeurtenisprocedure in VBA schrijven. De (formulier) gebeurtenis voor invoegen wordt dan iets in de trant van:
Code:
Private Sub Form_BeforeInsert(Cancel As Integer)
Dim Jaar As String
Dim Hoogste As Variant

Jaar = Year(Date)
Hoogste = Nz(DMax("Sleutelveld", "DeTabel", "Left(Sleutelveld,4)='" & Jaar & "'"), 0)

If Hoogste = 0 Then
  Me.Sleutelveld = Jaar & "0001"
Else
  If Hoogste = Jaar & "9999" Then
     MsgBox "Er zijn geen vrije nummers meer", vbCritical, "Nummers op"
     Cancel = True
  Else
     Me.Sleutelveld = Hoogste + 1
  End If
End If

Me.Refresh
End Sub
Ik kan niet vinden waar ik dit in moet voeren
 
Je hebt inderdaad de code van de oplossing uit post #3 toegepast op de oplossing uit post #2.

De tabeldefinitie is wat je ziet als je de tabel in ontwerpweergave opent.
 
Ik kan niet vinden waar ik dit in moet voeren
Staat toch echt in post #5. Nog maar een keer dan, en iets uitgebreider.
  • Open het formulier waarmee je de gegevens invoert in ontwerp weergave;
  • Klik in het lint op Extra/Eigenschappenvenster;
  • Ga naar het tabblad "Gebeurtenis";
  • Klik bij de gebeurtenis "Voor invoegen" op het dopdrown-symbool en kies "Gebeurtenisprocedure";
  • Klik op de drie puntjes en plak of schrijf de VBA code voor de gebeurtenis (zie in dit geval post #2). Uiteraard moet je die nog wel aanpassen voor je eigen situatie (tabel- en veldnaam, aantal posities volgnummer).
 
Als de database geopend is, kom je met <Alt>+<F11> rechtstreeks in het VBA scherm. Tenzij je aan de sneltoetsen hebt gerommeld in de instellingen. Maar dan zie je in het Navigatie paneel nog steeds een groep staan voor de Modules. Onder de groep Macro’s. Dus dan kom je er ook.

Mijn functie kun je in beginsel gewoon kopiëren naar een nieuwe module, mocht er nog geen module zijn. Dat heb ik al aangegeven hoe je dat doet. Die functie moet je, net als die van Peter, dus nog aanpassen naar jouw situatie. Kijk ook even hoe je het nummer opgebouwd wil hebben, met of zonder koppelstreepje.
Vervolgens kijk je in het formulier naar het veld waar je de nieuwe nummering wilt toepassen, en daar zet je dan de functie aanroep in de eigenschap ,Standaard waarde>.

Kom je er nog steeds niet uit, post dan asjeblieft een voorbeeldje van je db, want het probleem is zó makkelijk op te lossen. In de tijd dat ik dit schreef, had ik het al in drie databases kunnen inbouwen.
 
Als de database geopend is, kom je met <Alt>+<F11> rechtstreeks in het VBA scherm. Tenzij je aan de sneltoetsen hebt gerommeld in de instellingen. Maar dan zie je in het Navigatie paneel nog steeds een groep staan voor de Modules. Onder de groep Macro’s. Dus dan kom je er ook.

Mijn functie kun je in beginsel gewoon kopiëren naar een nieuwe module, mocht er nog geen module zijn. Dat heb ik al aangegeven hoe je dat doet. Die functie moet je, net als die van Peter, dus nog aanpassen naar jouw situatie. Kijk ook even hoe je het nummer opgebouwd wil hebben, met of zonder koppelstreepje.
Vervolgens kijk je in het formulier naar het veld waar je de nieuwe nummering wilt toepassen, en daar zet je dan de functie aanroep in de eigenschap ,Standaard waarde>.

Kom je er nog steeds niet uit, post dan asjeblieft een voorbeeldje van je db, want het probleem is zó makkelijk op te lossen. In de tijd dat ik dit schreef, had ik het al in drie databases kunnen inbouwen.
hoe wil je dit voorbeeld hebben? want ik kan geen db hier uploaden?
 
Dat kan als je de db eerst zipt want je kunt geen accdb bestanden uploaden, dat klopt. Bij voorkeur dan ook eerst Comprimeren en Herstellen zodat hij verkleind is voordat je 'm zipt. Scheelt vaak enorm in de grootte.
 
ik heb de persoonsgegevens hieruit verwijderd. dus dit is de lege db.
Wat ik dus wil, is als ik een nieuw lid invoer, dat dat lidnummer dan ook direct in de subformulieren komt. En het lidnummer wordt zonder streepje. Dus bv 202301, dan 202302, als dit automatisch erin kan komen te staan als ik een nieuw lid invoer is dat erg fijn.
 

Bijlagen

Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan