Userform

In de Visual Basic for Applications Editor kun je alles regelen met betrekking tot macro’s.

De modules zijn al uitgelegd in een handig MODULE artikel. Nu gaan we een userform maken en proberen te begrijpen.

In dit voorbeeld maken we een simpel contactpersonen formulier met naam en plaats.
Dit is gekoppeld per regel aan een ID nummer.

Video

Ontwikkelaars tabblad activeren

Om gebruik te maken van de VBA Editor is het makkelijk om te weten hoe je deze kan openen. Deze kan je vinden via het lint en dan het Ontwikkelaars tabblad. Je kan de Editor ook openen met de sneltoets ALT + F11.
Zie je het Ontwikkelaars tabblad nog niet op het lint? Dan moet je deze activeren.

Vanaf Excel 2010
Dit doe je via Bestand > Opties > Lint en dan Ontwikkelaars aanvinken
Excel 2007
Via de Office knop > Opties voor Excel > Tabblad Ontwikkelaars op het lint weergeven

Userform maken

Scherm voor het toevoegen van een userform.

Open de Visual Basic Editor via het ontwikkelaarstabblad (of gebruikt Alt+F11). Maak hier een nieuw Userform aan. Dit doe je door in de taakbalk te kiezen voor Invoegen en vervolgens voor Userform.

Als het goed is heb je dan dit scherm voor je. Mocht je werkset of eigenschappen niet zien, dan kan je deze aanzetten onder Beeld in de taakbalk.

Voeg hier 3 labels (bijschriften), 3 tekstvakken en 3 opdrachtknoppen aan toe, geef deze de volgende eigenschappen:

Type(Name)Caption
UserformContactenBeheer contacten
LabelLabel1ID:
LabelLabel2Naam:
LabelLabel3Plaats:
TekstvakTextBox1
TekstvakTextBox2
TekstvakTextBox3
OpdrachtknopCommandButton1Wijzig / Voeg toe
OpdrachtknopCommandButton2Maak leeg
OpdrachtknopCommandButton3Sluit

Je kan deze opties toevoegen door ze te kiezen in de werkset en vervolgens aan te maken.

Dan heb je uiteindelijk als het goed is dit formulier:

Nu wil je vanuit Excel dit userform kunnen openen. Daar gaan we nu een knop voor maken. Sluit de VB Editor voor even (hier komen we zo weer terug voor de codes) en maak in Excel een ActiveX Opdrachtknop. Klik dubbel op deze knop en zorg dat deze code daar komt te staan:
Private Sub CommandButton1_Click()
Contacten.Show
End Sub

Als je vervolgens in Excel op de knop drukt, zal je zien dat het zojuist aangemaakte userform wordt geopend. Alleen werkt er nog niks van, dit gaan we nu maken.
Open daarom opnieuw de VB Editor.

Klik met je rechtermuisknop op contacten en selecteer hier Programmacode weergeven. Je hebt hier 2 dropdown menu’s, selecteer bij de linkse Userform en bij de rechtse Initialize, plak hier vervolgens de volgende code:
Private Sub UserForm_Initialize()
TextBox1.SetFocus
End Sub

Selecteer nu in het linker dropdown menu TextBox1 en plak daar deze code:
Private Sub TextBox1_Change()
GetData
End Sub

Kies in het linker dropdown menu voor CommandButton1 en plak daar deze code:
Private Sub CommandButton1_Click()
EditAdd
End Sub

Kies in het linker dropdown menu voor CommandButton2 en plak daar deze code:
Private Sub CommandButton2_Click()
ClearForm
End Sub

Kies in het linker dropdown menu voor CommandButton3 en plak daar deze code:
Private Sub CommandButton3_Click()
Unload Me
End Sub

Nu moet je alleen nog zorgen dat er een module is die het userform helemaal aanstuurt.
Maak een nieuwe module aan, via Invoegen en dan module en plak daar deze code:

Dim id As Integer, i As Integer, j As Integer, flag As Boolean
Sub GetData()
If IsNumeric(Contacten.TextBox1.Value) Then
flag = False
i = 0
id = Contacten.TextBox1.Value
Do While Cells(i + 1, 1).Value <> ""
If Cells(i + 1, 1).Value = id Then
flag = True
For j = 2 To 3
Contacten.Controls("TextBox" & j).Value = Cells(i + 1, j).Value
Next j
End If
i = i + 1
Loop
If flag = False Then
For j = 2 To 3
Contacten.Controls("TextBox" & j).Value = ""
Next j
End If
Else
ClearForm
End If
End Sub
Sub ClearForm()
For j = 1 To 3
Contacten.Controls("TextBox" & j).Value = ""
Next j
End Sub
Sub EditAdd()
Dim emptyRow As Long
If Contacten.TextBox1.Value <> "" Then
flag = False
i = 0
id = Contacten.TextBox1.Value
emptyRow = WorksheetFunction.CountA(Range("A:A")) + 1
Do While Cells(i + 1, 1).Value <> ""
If Cells(i + 1, 1).Value = id Then
flag = True
For j = 2 To 3
Cells(i + 1, j).Value = Contacten.Controls("TextBox" & j).Value
Next j
End If
i = i + 1
Loop
If flag = False Then
For j = 1 To 3
Cells(emptyRow, j).Value = Contacten.Controls("TextBox" & j).Value
Next j
End If
End If
End Sub

Nu is het formulier klaar en kun je de tabel maken met de kopjes en (eventueel) wat voorbeeld data.
Zet als kop in A1 ID, A2 Naam en A3 Plaats.

Vervolgens kun je met de knop data toevoegen of opzoeken. Veel plezier!

9 replies on “Userform”

  • Best heren hele fijne instructie en video en tekst voor uitvoeren van het formulier
    Alleen bij de id box had ik graag in plaats van cijfers , woorden willen kunnen gebruiken
    Ik heb veel op gezocht maar vind de logica niet om de regel

    Sub GetData()
    If IsNumeric(Contacten.TextBox1.Value) Then
    flag = False
    i = 0

    om te zetting dat deze een boolean opzet van strings in plaats van nummer
    Graag enig in zicht hoe ik dit kan te bewerk stellen
    Ik zou graag een tabel hebben zie zoekbaar is op strings en niet op nummer
    Dus was mijn idee om id vba aan te passen naar string in plaats van tekst
    Groeten Mario

    Borremans mario
    • Je wilt de functionaliteit aanpassen om te zoeken op strings in plaats van nummers.

      Om een specifiek veld als een string te behandelen in plaats van een getal, kun je de variabele voor dat veld expliciet als een string declareren.

      Hier is een voorbeeld van hoe je het kunt doen:

      Sub GetData()
      Dim flag As Boolean
      Dim i As Long ‘ Gebruik Long in plaats van Integer voor grotere waarden
      Dim searchString As String ‘ Voeg een variabele toe voor de zoektekst

      ‘ Vervang “TextBox1” door de juiste naam van het tekstvak dat de zoekterm bevat
      searchString = Trim(Contacten.TextBox1.Value)

      flag = False
      i = 1 ‘ Ik neem aan dat je met rij 1 begint, omdat rij 0 niet bestaat in Excel

      ‘ Voer hier je zoeklogica uit
      ‘ Voorbeeld:
      Do While Not IsEmpty(Sheets(“Sheet1”).Cells(i, 1)) ‘ Stoppen als er geen gegevens meer zijn in kolom A
      ‘ Vergelijk de waarde in kolom A (in dit geval) met de zoektekst
      If StrComp(Sheets(“Sheet1”).Cells(i, 1).Value, searchString, vbTextCompare) = 0 Then
      flag = True
      Exit Do ‘ Als overeenkomst is gevonden, stop de lus
      End If
      i = i + 1
      Loop

      ‘ Voer hier je logica uit op basis van het zoekresultaat (flag)
      If flag Then
      MsgBox “String gevonden in de tabel!”
      Else
      MsgBox “String niet gevonden.”
      End If
      End Sub

      In dit voorbeeld wordt de waarde van het tekstvak “TextBox1” in de variabele “searchString” opgeslagen. Vervolgens wordt er door de gegevens in kolom A van “Sheet1” gelust om te controleren op overeenkomsten.

      De functie `StrComp` wordt gebruikt om de waarden te vergelijken zonder hoofdlettergevoeligheid (vbTextCompare). Als er een overeenkomst is gevonden, wordt de variabele “flag” ingesteld op “True”.

      Opmerking: Zorg ervoor dat je de juiste werkbladnaam (bijv. “Sheet1”) gebruikt en de juiste kolom (bijv. kolom A) voor jouw specifieke gegevens.

      Je kunt deze logica aanpassen aan de specifieke structuur van jouw gegevens en de acties uitvoeren die je nodig hebt wanneer een overeenkomst wordt gevonden.

      Joost Administrator
  • Leuk gedaan. Bedankt, maar heb een vraagje hoe kan ik de code beste schrijven als ik bijvoorbeeld de userform op blad1 heb, maar de dat moet op blad2 komen te staan, en de tabel begint bij C5.

    Is dat makkelijk om aan te passen?

    Met vriendelijke groet,

    Jelle Ruben

    Jelle Ruben
    • Om de gegevens in de UserForm naar Blad2 te schrijven en te beginnen bij C5, moet je de verwijzingen naar het bereik van de cellen aanpassen. Ook moet je de naam van het werkblad aangeven in de functies. Hier is de aangepaste code:

      Dim id As Integer, i As Integer, j As Integer, flag As Boolean

      Sub GetData()
      Dim ws As Worksheet
      Set ws = ThisWorkbook.Sheets(“Blad2”) ‘ Vervang “Blad2” door de naam van je werkblad

      If IsNumeric(Contacten.TextBox1.Value) Then
      flag = False
      i = 0
      id = Contacten.TextBox1.Value
      Do While ws.Cells(i + 5, 1).Value <> “” ‘ Begin bij rij 5 op Blad2 (C5)
      If ws.Cells(i + 5, 1).Value = id Then
      flag = True
      For j = 2 To 3
      Contacten.Controls(“TextBox” & j).Value = ws.Cells(i + 5, j).Value
      Next j
      End If
      i = i + 1
      Loop
      If flag = False Then
      For j = 2 To 3
      Contacten.Controls(“TextBox” & j).Value = “”
      Next j
      End If
      Else
      ClearForm
      End If
      End Sub

      Sub ClearForm()
      For j = 1 To 3
      Contacten.Controls(“TextBox” & j).Value = “”
      Next j
      End Sub

      Sub EditAdd()
      Dim emptyRow As Long
      Dim ws As Worksheet
      Set ws = ThisWorkbook.Sheets(“Blad2”) ‘ Vervang “Blad2” door de naam van je werkblad

      If Contacten.TextBox1.Value <> “” Then
      flag = False
      i = 0
      id = Contacten.TextBox1.Value
      emptyRow = ws.Cells(Rows.Count, 1).End(xlUp).Row + 1 ‘ Zoek de eerste lege rij in kolom A van Blad2
      Do While ws.Cells(i + 5, 1).Value <> “” ‘ Begin bij rij 5 op Blad2 (C5)
      If ws.Cells(i + 5, 1).Value = id Then
      flag = True
      For j = 2 To 3
      ws.Cells(i + 5, j).Value = Contacten.Controls(“TextBox” & j).Value
      Next j
      End If
      i = i + 1
      Loop
      If flag = False Then
      For j = 1 To 3
      ws.Cells(emptyRow, j).Value = Contacten.Controls(“TextBox” & j).Value
      Next j
      End If
      End If
      End Sub

      Zorg ervoor dat je de naam “Blad2” vervangt door de daadwerkelijke naam van het werkblad waarop je de gegevens wilt opslaan.

      Ook wordt ervan uitgegaan dat de UserForm de naam “Contacten” heeft, aangezien dit in de code wordt gebruikt.

      Als de naam van de UserForm anders is, wijzig dit dan ook naar de juiste naam.

      Joost Administrator
  • Heel handig dit. Wel een vraagje. De button “maak leeg” maakt idd het veld leeg echter niet de betreffende rij vanaf a1. Kan het zelf uitzoeken maar dit lijkt mij niet de bedoeling?

    Eigenlijk wil je een overzichtje van de records hebben en dan daar aan toevoegen en of wijzigen cq verwijderen….hoe doe je dat in dit voorbeeld?

  • Je kunt een opdrachtknop “Regel Verwijderen” toevoegen door een nieuwe subroutine toe te voegen aan de code en deze aan een nieuwe knop op het gebruikersformulier te koppelen.
    Hieronder de code hoe je dat kunt doen:

    1. Voeg een nieuwe subroutine toe voor het verwijderen van een regel:

    Sub VerwijderRegel()
    If IsNumeric(Contacten.TextBox1.Value) Then
    Dim idToDelete As Integer
    idToDelete = Contacten.TextBox1.Value
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    Dim rowToDelete As Long
    rowToDelete = 0

    ‘ Zoek de rij om te verwijderen
    For i = 1 To lastRow
    If Cells(i, 1).Value = idToDelete Then
    rowToDelete = i
    Exit For
    End If
    Next i

    ‘ Verwijder de rij als deze is gevonden
    If rowToDelete > 0 Then
    Rows(rowToDelete).Delete
    ClearForm
    End If
    End If
    End Sub

    2. Koppel deze nieuwe subroutine aan de nieuwe knop op het gebruikersformulier.
    Stel dat de knop de naam “BtnVerwijder” heeft, dan kun je onderstaande code toevoegen om de subroutine uit te voeren.

    Private Sub BtnVerwijder_Click()
    VerwijderRegel
    End Sub

    Wanneer je op de “Regel Verwijderen” knop klikt, wordt de geselecteerde regel met het opgegeven ID verwijderd, en wordt het formulier leeggemaakt met behulp van de `ClearForm` subroutine.
    Zorg ervoor dat je de knop “BtnVerwijder” aanmaakt op de gebruikersformulier en deze code aan de knop koppelt zoals hierboven beschreven.

    Joost Administrator
  • thx, het werkt. En voor een overzichtje maak ik gewoon een werkblad die verborgen is zichtbaar, daar zie je dan de userform dus kan je naar hartenlust toevoegen, wijzigen en verwijderen en zodra je sluit maak ik het werkblad weer verborgen. Als je een mooiere oplossing hebt houd ik mij aanbevolen!

  • Goedenmorgen,

    Kunt u aangeven wat fout gaat.
    Ik heb alles stappen gevolgd maar bij het het onderstaande gaat de userform niet open.

    Nu wil je vanuit Excel dit userform kunnen openen. Daar gaan we nu een knop voor maken. Sluit de VB Editor voor even (hier komen we zo weer terug voor de codes) en maak in Excel een ActiveX Opdrachtknop. Klik dubbel op deze knop en zorg dat deze code daar komt te staan:
    Private Sub CommandButton1_Click()
    Contacten.Show
    End Sub

    Er wordt een foutmelding getoond bij CONTACTEN.SHOW.

    Private Sub CommandButton1_Click()
    Contacten.Show
    End Sub

    Hopelijk kunt u mij helpen.

    Alvast dank!

    mvg,
    Roy

    • Als de userform niet wordt geopend en je een foutmelding krijgt bij `Contacten.Show`, zijn er een paar dingen die je kunt controleren:

      1. Naamgeving van de UserForm:
      Zorg ervoor dat de daadwerkelijke naam van de UserForm “Contacten” is. In de Visual Basic for Applications (VBA)-editor moet de naam van de UserForm exact overeenkomen met de naam die je in je code gebruikt. Controleer of je de UserForm correct hebt genoemd.

      2. Zichtbaarheid van de UserForm:
      Zorg ervoor dat de eigenschap “Visible” van de UserForm is ingesteld op “0 – fmVisible”. Dit zorgt ervoor dat de UserForm zichtbaar is wanneer je `Contacten.Show` gebruikt. Je kunt deze eigenschap instellen in de eigenschappenvenster van de UserForm in de VBA-editor.

      3. Foutmeldingen:
      Als je een foutmelding krijgt, kijk dan naar de details van de foutmelding. Dit kan je helpen begrijpen wat er misgaat. Fouten kunnen variëren van typfouten in de naam van de UserForm tot andere runtime-fouten die kunnen optreden tijdens de uitvoering van de code.

      Succes!

      Joost Administrator

Leave a Comment

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *