Noob vraagt hulp: Waar plaats ik een OnLoad code

Status
Niet open voor verdere reacties.

Visara

Gebruiker
Lid geworden
10 mrt 2019
Berichten
217
Goededag,

Wens 1: bij het openen van enkele van mijn Forms wil ik automatisch naar de laatste record gaan.
Wens 2: Bij het openen van het complete Access bestand wil ik dat een specifieke querry wordt geopend.

Ik ben een prille beginner in Access (2016, Engelstalige versie).
Ik krijg mijn twee wensen niet voor elkaar, omdat antwoorden die ik via zoekmachines vindt uitgaan van voorkennis die ik niet heb.

Via google vind ik:
Code:
Private Sub Form_Load()
 DoCmd.RunCommand acCmdRecordsGoToLast
End Sub
Moet het woord "Form" in de code worden vervangen voor de werkelijke Formnaam? Moet er iets als Private Sub Form("WerkelijkeFormNaam")_Load() komen te staan zoals in excel met Sheets("Blad1")?
Is "acCmdRecordsGoToLast" een term die Access uit zichzelf begrijpt? Of verwijst het naar een code die ik zelf zou moeten maken en ergens in moet plakken?
Ik weet deze dingen in vba voor excel te vinden. Bij Acces lukt me dat niet. Als ik deze code tussen de codes voor comboboxen voor deze form plaats laadt de Form flink langzamer bij het openen, maar gaat niet naar de laatste record.

Ik probeerde het op een andere manier:
Ik heb op de form een knop gemaakt die de gebruiker in kan klikken om naar het laatste record te gaan.
Deze knop heb ik de naam "CommandGaNaarLaatste" gegeven (Properties>Name)
Bij Form Properties>Event>On Load>'Klik op de drie puntjes' heb ik
Code:
Private Sub Form_Load()
CommandGaNaarLaatste_Click
End Sub
geplaatst. Als ik de Form opnieuw open geeft hij de foutmelding dat de naam niet is gedefinieerd.
Ook Command65_Click (zoals de knop/functie eigenlijk/oorspronkelijk heet werkt niet.

Als ik op 'View code' klik zie ik mappen waar codes in terecht kunnen komen. Ik zie een map met 'Micosoft Class Objects'. Trouwens, om een voor mij onduidelijke reden staan niet al mijn forms daar.
Ik zie nergens een mapje waar ik codes kan plaatsen voor wanneer Access als geheel opent, of ik herken het niet als zodanig.
Waar plaats ik een code die gerund wordt bij het opstarten van Access? Ik wil een specifieke querry openen wanneer Access wordt geladen door de gebruiker. Bij 'Options for the current database' kan je instellen welke Form moet worden geopend bij het opstarten. Maar daar kan ik geen querry kiezen... hoe kan dat wel?

Met vriendelijke groet
 
Laatst bewerkt:
Vraag 1: ik vraag me eerlijk gezegd af waarom je dat zou willen; het is een rare vraag voor een database. Maar het kan natuurlijk wel met dat commando. Je kunt je beter eerst verdiepen in programmeren voordat je gelijk allerlei moeilijke dingen wilt doen overigens :). Als je een formulier opent in Ontwerpweergave, en je klikt gelijk op de knop <Eigenschappen>, dan zie je daar een tabblad "Gebeurtenissen" staan (derde tabje). Als je dat aanklikt, zie je voor alle objecten (dus ook het formulier zelf) momenten waarop je acties (gebeurtenissen) kunt laten uitvoeren. Elk soort object kent andere, specifieke gebeurtenissen. Eén van de gebeurtenissen van een Formulier is dus: <Bij Laden>. En dát is de plek waar je de code moet neerzetten.
Als je op het afrolknopje klikt achteraan (zie plaatje) Bekijk bijlage 349705 en je kiest Gebeurtenis (niet Macro dus), dan kom je in de VBA Editor. Access heeft dan twee regels neergezet: Private Sub Form_Load() en End Sub. Je hoeft dan alleen de tweede regel (DoCmd.RunCommand acCmdRecordsGoToLast) er tussen te plakken en terug te keren naar je Formulier door de editor af te sluiten. Alternatief: druk op <Alt>+<F11> en je komt gelijk in de editor. Daar plak je dan alle drie de regels. Uiteraard ook weer opslaan en afsluiten.
Access gebruikt, net als Excel, IntelliSense dus zodra je een commando typt en een punt typt, krijg je een keuzelijst met de methodes voor de opdracht.

Je tweede 'oplossing' is niet echt een oplossing. Je kunt voor het bladeren prima knoppen maken met de wizard (doe ik zelf ook meestal gelijk als ik een formulier maak). Die zet je dan bijvoorbeeld in de voettekst van het formulier. Knoppen voor Eerste, Volgende, Vorige, Laatste en Nieuw bijvoorbeeld. (vandaar ook mijn eerste opmerking. Het is zó makkelijk om vanuit een formulier te navigeren met die knoppen, dat het in mijn ogen zinloos is om altijd naar het laatste record te gaan).

Wat betreft je tweede vraag: Als je iets automatisch wilt laten starten bij het openen van een database, dan kun je twee dingen doen: 1) een startformulier maken waarmee je alle handelingen laat uitvoeren (vandaar dat Access je dat aangeeft bij de opties) of een macro maken die AutoExec heet, en die alle acties uitvoert. Ik kies dan meestal voor een formulier, dat je eventueel kan verbergen. Of gebruiken als start/introductieformulier. Dat je in je VBA venster niet alle formulieren ziet in het overzicht, is óók weer logisch; je ziet alleen de formulieren waar je een gebeurtenis voor hebt gemaakt. Op die manier werkt het overzichtelijker. De eerste code maak je dus altijd vanuit een formulier, daarna is het formulier zichtbaar in het overzicht.
 
Beste OctaFish,
Hartstikke bedankt voor uw moeite :)

Vraag 1: ik vraag me eerlijk gezegd af waarom je dat zou willen;
Er is een (voor de gebruiker) verborgen tabel waarin alle gegevens van een Intake komen te staan.
Die Intake bestaat uit 3 delen. Paste niet allemaal op 1 Form, een Form blijkt een maximale grootte te hebben. Ik zou kunnen proppen, maar dat visueel niet prettig.
Omdat de werkelijke intake toch al uit 3 delen bestaat, heb ik er ook 3 Forms van gemaakt (die allen dezelfde tabel vullen)
Als de gebruiker deel 2 in wil vullen is het handig de gebruiker gelijk naar het laatste record te sturen. Dat is bij deel2 en deel3 namelijk waar hij zijn moet.
(heb bovenin het scherm van deel 2 en 3 natuurlijk geblokkeerde velden gemaakt met de naam van de persoon die je in deel1 hebt ingevuld, zodat je weet dat je in het goede record zit)
Een andere Form is een presentielijst. Als de gebruiker deze opent en ik maak geen OnLoad event om naar 'Laatste' of 'Nieuwe' record te gaan, dan zullen de gebruikers dus altijd de eerste record zien van een les die steeds langer geleden is.
Ik kies dan voorlopig voor 'Laatste', zodat de gebruikers leren begrijpen dat ze iets toevoegen aan een al bestaande lijst (de tabel). Dat inzicht lijkt me niet vanzelfsprekend.

Je kunt je beter eerst verdiepen in programmeren voordat je gelijk allerlei moeilijke dingen wilt doen overigens
Eens. Het is altijd een balans vinden tussen geen dingen doen waar je niet van snapt hoe het gebeurd en een fatsoenlijk eindproduct afleveren.
Voorbeeld: Een deel van het bestand laat een docent per leerling per les invullen of hij/zij aanwezig was, welke type les er is gegeven, of de leerling aanwezig was, te laat etc.
Als er bijv 8 leerlingen in een les zijn moet de docent 8 record maken. Het werkt voor de gebruiker prettiger als de docent alle records die hij/zij maakt op dat moment tegelijk in het scherm ziet. Dan zou de docent dus eigenlijk direct in de tabel moeten werken, maar dat heeft ook weer zo z'n nadelen.
In een multirecordform lijkt er wel wat mee mogelijk te zijn, maar niet goed genoeg wat mij betreft. Echt creëren wat ik zou willen zag er uit als complex gedoe waar ik mijn vingers beter niet aan kan branden :)
Docent heeft pech, elke record wordt een nieuw blad in de InvulForm :)

Het plaatsen van de OnLoad code is gelukt zoals u beschreef, dankjewel!
Ik zie in de VBA-editor ook een balkje met 'Load' staan. Het is me een stuk duidelijker nu.
Je afbeelding in je uitleg wordt niet geaccepteerd door de website, maar het is gelukt.

Ik ga aan de gang met het opstart formulier. Ik laat weten of het is gelukt.
 
Paste niet allemaal op 1 Form, een Form blijkt een maximale grootte te hebben. Ik zou kunnen proppen, maar dat visueel niet prettig. Omdat de werkelijke intake toch al uit 3 delen bestaat, heb ik er ook 3 Forms van gemaakt (die allen dezelfde tabel vullen)
Erg onhandige opzet. Op een formulier kun je tabbladen maken, en daar zet je dan de groepen gegevens op die je bij elkaar wilt laten invoeren. Veel overzichtelijker dan 3 aparte formulieren. En veel veiliger, omdat je dan in één keer een record aanmaakt, en dus ook de volledigheid en afhankelijkheden veel beter kan controleren.

Als de gebruiker deze opent en ik maak geen OnLoad event om naar 'Laatste' of 'Nieuwe' record te gaan, dan zullen de gebruikers dus altijd de eerste record zien van een les die steeds langer geleden is.
Een formulier kun je standaard laten sorteren. Als de laatste record(s) relevant zijn, en de eerste niet, dan sorteer je aflopend op dat veld en ben je helemaal klaar.

Dit:
Het werkt voor de gebruiker prettiger als de docent alle records die hij/zij maakt op dat moment tegelijk in het scherm ziet. Dan zou de docent dus eigenlijk direct in de tabel moeten werken, maar dat heeft ook weer zo z'n nadelen.
Absoluut onjuist; met een goed gemaakte database (met de juiste formulieren) is dat absoluut niet nodig. Tabellen verbergen lijkt mij trouwens ook een noodgreep; in de databases die ik maak zien de gebruikers namelijk nooit tabellen en queries; daar mogen ze gewoonweg niet bijkomen. Ik wil namelijk niet dat gewone gebruikers rechtstreeks in tabellen gaan werken. Dat mogen alleen de beheerders.

In een multirecordform lijkt er wel wat mee mogelijk te zijn, maar niet goed genoeg wat mij betreft.
Zullen we dat maar houden op het ontbreken van de noodzakelijke kennis? Formulieren zijn namelijk veruit het krachtigste onderdeel van Access. Als je dus met formulieren niet uitkomt, dan zit je in het verkeerde pakket :).
 
Bedankt voor uw prettige feedback. Heeft me verder geholpen.

-Tabbladen binnen een Form = gefixt. Veel prettiger zo :)
-Ik heb ontdekt dat (en hoe) forms schermvullende popups kunnen zijn. Properties>Popup 'Ja' oid & DoCmd.Maximize.
-Ik heb een startform gemaakt met daarop knoppen om andere forms te openen. Op de startform een knop die access afsluit.
Op de andere forms een sluit knop die de form saved en sluit.
-Ik heb ook knoppen gemaakt die een query als excel opslaat. (is zinvol in de context waar ik dit voor maak)
-Ik verberg de navigation Pane.

Mijn dank voor mij de goede kant op sturen bij mijn eerste Access avontuur ;)
 
Graag gedaan :). Zelf ben ik geen voorstander van DoCmd.Maximize, ik heb het nog nooit gebruikt of hoeven gebruiken. De reden is simpel: je hebt veelte weinig controle over de lay-out van je formulier. (Je gebruikt trouwens een rare mix van talen :)) Formulieren wil je op een vaste manier tonen, ongeacht de cliënt waar ze op draaien. In mijn ogen verragt Maximize die zorgvuldig uitgedachte lay-out.
 
Over die .Maximize:
Voor nu laat ik het zo omdat het doet wat ik in gedachte heb. Maar ik heb in mijn oren geknoopt dat het niet optimaal is, dank!
Het is mijn eerste access creatie he. Eerst moet het alle functies bevatten, correct en redelijk gebruiksvriendelijk zijn. Fancy aanpassingen kunnen later komen.
 
Eerst moet het alle functies bevatten, correct en redelijk gebruiksvriendelijk zijn. Fancy aanpassingen kunnen later komen.
Eérst moet de structuur in orde zijn :). De tabellen dus. Gebaseerd op wat je uit het systeem wilt kunnen halen, zodat je weet wat er in moet worden gezet. Daarna ga je de GUI kant doen, die je dan gaat automatiseren. Ik hoop dat je de tabellenstructuur goed uitgedacht hebt, voordat je aan je formulieren bent begonnen. Het is een typische beginnersfout (lees de vragen op HelpMij er maar op na) dat mensen gelijk beginnen met tabellen en formulieren maken, en niet eerst helemaal uitwerken wat de database eigenlijk moet doen. En dan dus later terug mogen/moeten naar de tekentafel :).
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan