Getallen op een userform tonen met een klassemodule

Voorbeeldbestanden bij dit artikel:
  • Getallen op een userform
  • 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 Collection
    
    
    Public Sub UserForm_Initialize()
    ' Wim Gielis ' http://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 0
    End 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.Label
    
    
    Public Sub lbl_Click()
    overz.Range("A2").Offset(Mid(lbl.Name, 6)).Resize(, 2).Select
    End 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 !




    Over Wim

    Wim Gielis is Business Intelligence consultant en Excel expert

    Andere links