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
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 |
---|---|---|
Userform | Contacten | Beheer contacten |
Label | Label1 | ID: |
Label | Label2 | Naam: |
Label | Label3 | Plaats: |
Tekstvak | TextBox1 | |
Tekstvak | TextBox2 | |
Tekstvak | TextBox3 | |
Opdrachtknop | CommandButton1 | Wijzig / Voeg toe |
Opdrachtknop | CommandButton2 | Maak leeg |
Opdrachtknop | CommandButton3 | Sluit |
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!
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
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.
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
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.
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.
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!
userform. Alle textvelden wil ik graag nummeriek met cijver achter de comma. Hoe moet het fomat in de vba ingesteld worden.
Om te zorgen dat alle tekstvelden in een UserForm alleen numerieke waarden met cijfers achter de komma accepteren, kun je de KeyPress gebeurtenis van elk tekstveld gebruiken om invoer te valideren.
Hierbij kun je controleren of de ingevoerde tekens numeriek zijn of een decimaal scheidingsteken (bijvoorbeeld een punt of komma).
Hierbij een VBA voorbeeld:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
KeyAscii = ValidateNumericInput(KeyAscii, Me.TextBox1)
End Sub
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
KeyAscii = ValidateNumericInput(KeyAscii, Me.TextBox2)
End Sub
‘ Herhaal bovenstaande Sub voor elke TextBox die je hebt toegevoegd.
Private Function ValidateNumericInput(KeyAscii As MSForms.ReturnInteger, TextBox As MSForms.TextBox) As MSForms.ReturnInteger
Select Case KeyAscii
Case Asc(“0”) To Asc(“9”) ‘ Toegestaan: cijfers 0-9
ValidateNumericInput = KeyAscii
Case Asc(“.”) ‘ Toegestaan: punt als decimaal scheidingsteken
‘ Controleer of er al een punt in de tekst staat
If InStr(TextBox.Text, “.”) = 0 Then
ValidateNumericInput = KeyAscii
Else
ValidateNumericInput = 0
End If
Case Asc(“,”) ‘ Toegestaan: komma als decimaal scheidingsteken (optioneel)
‘ Controleer of er al een komma in de tekst staat
If InStr(TextBox.Text, “,”) = 0 Then
ValidateNumericInput = KeyAscii
Else
ValidateNumericInput = 0
End If
Case vbKeyBack ‘ Toegestaan: backspace
ValidateNumericInput = KeyAscii
Case Else ‘ Alle andere tekens weigeren
ValidateNumericInput = 0
End Select
End Function
Uitleg:
KeyPress Gebeurtenis
Voor elk tekstveld (TextBox) voeg je een `KeyPress`-gebeurtenis toe die de invoer van de gebruiker controleert.
ValidateNumericInput Functie
Deze functie controleert of het ingedrukte teken een cijfer, punt, komma of backspace is. Zo ja, dan laat het de invoer toe. Als er al een punt of komma in de tekst staat, laat het geen tweede toe.
Herhaal voor Elk TextBox
Voeg de `KeyPress`-gebeurtenis toe voor elk TextBox in je UserForm. Pas `TextBox1` en `TextBox2` aan naar de namen van je eigen tekstvelden.
Succes!