Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Introductie tot UserForms | Gebruikersinteractie
Excel VBA voor Bedrijfsautomatisering

Introductie tot UserForms

Veeg om het menu te tonen

Note
Opmerking

UserForms hebben beperkte of geen functionaliteit in Excel voor Mac — de VBA IDE op Mac biedt in veel versies geen volledige ondersteuning voor het ontwerpen van UserForms, wat precies dit soort onverklaarbaar gedrag kan veroorzaken.

MsgBox en InputBox zijn geschikt voor eenvoudige ja/nee-vragen en éénregelige antwoorden, maar het toevoegen van een klant vereist vaak meerdere velden tegelijk — een bedrijfsnaam, een contactpersoon, een stad, een status. Daarvoor dient een UserForm: een klein aangepast venster met eigen labels, tekstvakken, keuzelijsten en knoppen, gebouwd binnen de VBE en volledig aangestuurd door je eigen code.

Een formulier maken

Klik in de VBE met de rechtermuisknop op je project in de Projectverkenner en kies Invoegen → UserForm. Er verschijnt een leeg ontwerpoppervlak, samen met een zwevende Toolbox met besturingselementen die je erop kunt slepen.

Figuur 5.3

Labels, TextBoxes, ComboBoxes en Buttons

Elke besturingselement die je op het formulier sleept, krijgt een standaardnaam zoals TextBox1 of CommandButton1 — functioneel, maar betekenisloos zodra een formulier zes of zeven besturingselementen bevat. De belangrijkste gewoonte in deze sectie is zichtbaar in het Eigenschappenvenster: hernoem elk besturingselement direct na het toevoegen, met een korte prefix die het type aangeeft (txt voor TextBox, cbo voor ComboBox, cmd voor CommandButton, opt voor OptionButton, chk voor CheckBox, lst voor ListBox) gevolgd door een beschrijvende naam. txtCompanyName is over drie weken in de code direct duidelijk; TextBox1 niet.

Labels zijn de eenvoudige, niet-interactieve tekstbijschriften ("Company Name:") — een gebruiker kan ze zien, maar er nooit in typen of op klikken. TextBoxes zijn bedoeld voor het invoeren van vrije tekst. ComboBoxes tonen een keuzelijst, precies waarvoor cboCity en cboStatus worden gebruikt — het beperken van City en Status tot een bekende lijst in plaats van een gebruiker vrij te laten typen zoals "chicago", "Chicago,IL" en "CHI" voor hetzelfde in verschillende records.

Formulier aanmaakproces

Code schrijven achter het formulier

Dubbelklik op een besturingselement op het ontwerpoppervlak om direct naar de bijbehorende code te gaan — VBA maakt automatisch een gebeurtenisprocedure aan met de naam ControlName_EventName, en code typen binnen deze procedure betekent dat deze code wordt uitgevoerd wanneer die specifieke gebeurtenis voor dat specifieke besturingselement plaatsvindt. De standaardgebeurtenis van een knop is Click:

Private Sub UserForm_Initialize()
    ' runs once, automatically, when the form is first shown
    cboCity.AddItem "Chicago"
    cboCity.AddItem "Boston"
    cboCity.AddItem "Austin"
    cboCity.AddItem "Seattle"
    cboCity.AddItem "Denver"
 
    cboStatus.AddItem "Active"
    cboStatus.AddItem "Inactive"
    cboStatus.AddItem "Prospect"
End Sub
 
Private Sub cmdCancel_Click()
    Unload Me
End Sub

UserForm_Initialize is een speciale gebeurtenisprocedure die automatisch wordt uitgevoerd op het moment dat het formulier wordt geladen — voordat de gebruiker iets ziet — waardoor dit de juiste plek is om ComboBoxes te vullen met .AddItem in plaats van keuzes handmatig in het eigenschappenvenster te typen, vooral wanneer deze keuzes kunnen veranderen of uit een werkblad komen. Unload Me in cmdCancel_Click sluit het formulier volledig; Me verwijst altijd naar het formulier waarin de code momenteel wordt uitgevoerd, zodat deze regel ongewijzigd werkt, ongeacht hoe je het formulier uiteindelijk hernoemt.

Voorbeeld: Een nieuwe klant opslaan

Dit is de procedure achter de knop Opslaan — deze schrijft daadwerkelijk een nieuwe rij in tblCustomers:

Private Sub cmdSave_Click()
    Dim tbl As ListObject
    Dim newRow As ListRow
 
    Set tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")
    Set newRow = tbl.ListRows.Add
 
    newRow.Range(1, 1).Value = "C" & Format(tbl.ListRows.Count + 1, "000")
    newRow.Range(1, 2).Value = txtCompanyName.Value
    newRow.Range(1, 3).Value = txtContact.Value
    newRow.Range(1, 4).Value = txtEmail.Value
    newRow.Range(1, 5).Value = cboCity.Value
    newRow.Range(1, 6).Value = cboStatus.Value
 
    MsgBox txtCompanyName.Value & " was added successfully."
    Unload Me
End Sub
Regel voor regel doorlopen
expand arrow
  • Met tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers") wordt er vanuit het formulier direct teruggegrepen naar de werkmap — een UserForm is gewoon een stuk code, dus alles wat geldt voor ListObjects blijft ongewijzigd van toepassing;
  • tbl.ListRows.Add voegt daadwerkelijk een nieuwe rij toe binnen de grenzen van de Tabel, in plaats van handmatig voorbij de laatst gebruikte cel te schrijven;
  • txtCompanyName.Value, cboCity.Value en de rest lezen uit wat de gebruiker op dat moment heeft getypt of geselecteerd in dat specifieke besturingselement — .Value is gebruikelijk voor bijna elk type besturingselement, waardoor hetzelfde patroon werkt voor zowel TextBoxes als ComboBoxes;
  • De gegenereerde Customer ID-regel is een vereenvoudigde tijdelijke oplossing voor deze oefening — echte ID-generatie zou moeten controleren op hiaten of hergebruikte ID's, wat deze regel niet doet;
  • Unload Me aan het einde sluit het formulier pas nadat de rij is weggeschreven — het formulier eerder sluiten zou betekenen dat txtCompanyName.Value en de andere waarden van besturingselementen niet meer uit te lezen zijn, omdat de besturingselementen niet meer bestaan zodra het formulier is gesloten.
Note
Opmerking

Het label "Bedrijfsnaam" op het formulier is slechts een gebruiksvriendelijker bijschrift voor de kolom Customer in de tabel — de code schrijft txtCompanyName.Value in die kolom ongeacht de tekst van het label, omdat alleen de naam van de TextBox van belang is voor VBA, niet het bijschrift op het scherm.

Note
Opmerking

Customer ID staat niet op het formulier omdat deze automatisch door de code wordt gegenereerd ("C0" & (tbl.ListRows.Count + 100)) in plaats van door de gebruiker te worden ingevoerd — dit weerspiegelt hoe echte systemen nieuwe records automatisch nummeren in plaats van een persoon een uniek ID te laten kiezen.

Taak

  1. Voeg een nieuw UserForm toe, noem deze frmAddCustomer, en voeg drie TextBoxes toe (txtCompanyName, txtContact, txtEmail) en twee ComboBoxes (cboCity, cboStatus), elk met een bijbehorend label.
  2. Voeg twee CommandButtons toe, cmdSave en cmdCancel, en schrijf de procedures UserForm_Initialize en cmdCancel_Click exact zoals weergegeven.
  3. Schrijf cmdSave_Click zoals getoond, voeg vervolgens een tijdelijke knop elders in de werkmap toe met de code frmAddCustomer.Show om het openen van je formulier te testen.
  4. Vul het formulier in voor een fictieve zesde klant en klik op Opslaan — controleer of er een nieuwe rij verschijnt in tblCustomers met de door jou ingevoerde waarden.
Tip
expand arrow

1. Het formulier bouwen

  • Invoegen → UserForm in de VBE, hernoem deze vervolgens via het veld (Name) in het Eigenschappenvenster naar frmAddCustomer — niet het veld Caption, dat alleen de tekst in de titelbalk wijzigt.
  • Sleep voor elk van Bedrijfsnaam, Contactpersoon en E-mail een Label + TextBox-paar; voor Stad en Status een Label + ComboBox-paar.
  • Hernoem elke besturingselement direct na het toevoegen — dit is de gewoonte die in het hoofdstuk werd benadrukt. Labels hoeven geen codevriendelijke namen te krijgen omdat je ze nooit in de code gebruikt, maar elke TextBox/ComboBox/Knop wel.

2. UserForm_Initialize en cmdCancel_Click

  • Dubbelklik op de lege achtergrond van het formulier (niet op een besturingselement) om naar UserForm_Initialize te gaan — dubbelklik je op cmdCancel, dan ga je direct naar cmdCancel_Click.
  • Beide procedures zijn exact in het hoofdstuk gegeven — typ ze ongewijzigd over.

3. Testen met een tijdelijke knop

  • Deze knop hoeft niet op het formulier te staan — plaats hem op een willekeurig werkblad via Ontwikkelaars → Invoegen → Knop (Formulierbesturingselement), of voer gewoon een eenregelige Sub uit vanuit de VBE in plaats van een werkbladknop toe te voegen.
  • frmAddCustomer.Show is de volledige code die nodig is om het formulier weer te geven.

4. Een volledige opslag testen

  • Vul alle velden in en kies waarden uit beide keuzelijsten voordat je op Opslaan klikt — een lege ComboBox-selectie schrijft een lege cel weg.
  • Controleer daarna tblCustomers op een nieuwe rij met een ID in de stijl van C00x.
Oplossing
expand arrow
Private Sub UserForm_Initialize()
    ' runs once, automatically, when the form is first shown
    cboCity.AddItem "Chicago"
    cboCity.AddItem "Boston"
    cboCity.AddItem "Austin"
    cboCity.AddItem "Seattle"
    cboCity.AddItem "Denver"

    cboStatus.AddItem "Active"
    cboStatus.AddItem "Inactive"
    cboStatus.AddItem "Prospect"
End Sub

Private Sub cmdCancel_Click()
    Unload Me
End Sub

Private Sub cmdSave_Click()
    Dim tbl As ListObject
    Dim newRow As ListRow

    Set tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")
    Set newRow = tbl.ListRows.Add

    newRow.Range(1, 1).Value = "C0" & (tbl.ListRows.Count + 100)
    newRow.Range(1, 2).Value = txtCompanyName.Value
    newRow.Range(1, 3).Value = txtContact.Value
    newRow.Range(1, 4).Value = txtEmail.Value
    newRow.Range(1, 5).Value = cboCity.Value
    newRow.Range(1, 6).Value = cboStatus.Value

    MsgBox txtCompanyName.Value & " was added successfully."
    Unload Me
End Sub

Om te testen, voer dit uit vanuit een regulier module (niet de code van de UserForm zelf):

Sub ShowAddCustomerForm()
    frmAddCustomer.Show
End Sub

Druk op F5 met de cursor in ShowAddCustomerForm — het formulier zou moeten openen, en na invullen en op Opslaan klikken wordt een nieuwe rij aan tblCustomers toegevoegd.

Het formulier testen
Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 5. Hoofdstuk 2

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Sectie 5. Hoofdstuk 2
some-alt