Getallen op een userform tonen met een klassemodule
- 15/01/2016
Voorbeeldbestanden bij dit artikel: | |
Inleiding
Een gebruikersformulier in Excel is vaak de manier om de gebruiker te sturen of te begeleiden in een Excel document. Het kan heel uitgebreid zijn, of heel beperkt zoals onderstaand voorbeeld. Ik toon hier hoe je op een gebruikersformulier namen en bedragen kan tonen in een label. De bedragen worden mooi uitgelijnd en de komma's staan onder mekaar. Een bedrag gelijk aan 0 wordt niet getoond.
Klikken we op een naam in het gebruikersformulier dan selecteer ik in het Excel bestand zowel de naam in kolom A als het bedrag in kolom B.
Lettertype Consolas
Het uitlijnen van bedragen en komma's wordt mogelijk gemaakt door het gebruik van het lettertype "Consolas". Bij veel andere lettertypes zijn de verschillende karakters (cijfers in dit geval) bijvoorbeeld niet even breed, waardoor sommige getallen van 4 cijfers meer plaats innemen dan andere getallen van eveneens 4 cijfers. Dit oogt slordig en draagt niet bij tot de leesbaarheid/bruikbaarheid van uw gebruikersformulier. Consolas is een zogenaamd Monospaced font. Courier en Courier new zijn dat ook, maar ik vind persoonlijk Consolas mooier.
VBA-code
Ik maak gebruik van labels op het gebruikersformulier om zowel namen als bedragen te tonen. Daarbij voeg ik elk label toe aan een Klasse. Het doel is om een "Click" event voor elk label uit te voeren, zonder de code expliciet voor elk label te maken. We maken onze code robuuster en generieker, onafhankelijk van het aantal labels op het gebruikersformulier.
Dim colLabels As CollectionPublic Sub UserForm_Initialize()' Wim Gielis ' https://www.wimgielis.com''''' ' Userform initializing ' 15/01/2016 '''''Dim objLblHandler As CLabelHandler Dim ctl As Control Dim rFoundCell As Range With Me .StartUpPosition = 0 .Top = 50 .Left = (Application.Left + Application.Width - Me.Width) / 4 End With On Error Resume Next Set colLabels = New Collection ' loop through controls For Each ctl In Me.Controls ' test if label and if name matches If TypeOf ctl Is MSForms.Label Then If InStr(ctl.Name, "_") = 0 Then '' initializing the class ' create new instance of class Set objLblHandler = New CLabelHandler ' assign label to its variable Set objLblHandler.lbl = ctl ' add instance to collection so it stays in scope colLabels.Add objLblHandler '' setting the caption iCellOffset = Val(Mid(ctl.Name, 6)) Set rFoundCell = overz.Range("A2").Offset(iCellOffset) ctl.Caption = rFoundCell.Text '' filling in the amount and font color With Controls(ctl.Name & "_Amount") .Caption = rFoundCell.Offset(, 1).Text If rFoundCell.Offset(, 1).Value < 0 Then .ForeColor = vbRed End If End With End If End If Next On Error GoTo 0End Sub
Code in de klasse
In de macro schrijf ik volgende code om te bepalen wat er gebeurt als je op een willekeurig label op het gebruikersformulier klikt:
Public WithEvents lbl As MSForms.LabelPublic Sub lbl_Click()overz.Range("A2").Offset(Mid(lbl.Name, 6)).Resize(, 2).SelectEnd Sub
"overz" is de naam van het werkblad met de namen en bedragen. Voor de rest laat ik jullie zelf de code ontdekken en mogen jullie er zeker mee experimenteren !