Intelligente invoer in een userform

Voorbeeldbestanden bij dit artikel:
  • Intelligente invoer in een userform
  • Inleiding

    De manier van interactie met een gebruiker van een Excel toepassing, is heel vaak via een userform of gebruikersformulier. Dit zet je op in VBA en het resultaat is een gecustomizeerd "scherm" waarin de gebruiker invoer kan verrichten, een overzicht krijgt van resultaten in het werkboek of een aantal menu-opties krijgt aangeboden. Mijn toepassing voor de voetbalopstelling had een gebruikersformulier:

    Wanneer we invoer vragen aan de gebruiker, dienen we hem/haar zo goed mogelijk te begeleiden in de taak: het gebruikersformulier dient logisch opgebouwd te zijn en gemakkelijk te begrijpen. Daarnaast is het van primordiaal belang dat de ontwikkelaar maatregelen neemt om fouten en foute invoer tegen te gaan. De gebruiker moet niet geconfronteerd worden met foutmeldingen bij een bepaalde actie - eerder moet het hem/haar onmogelijk gemaakt worden die bepaalde actie uit te voeren. Beter voorkomen dan genezen. Bijvoorbeeld: als je niet wil dat een tekstveld ingevuld wordt, verander de eigenschappen dan: Me.txtCommentaar.Enabled = False. Of als je een Ja/Neen antwoord van de gebruiker verlangt, toon dan een checkbox in plaats van een tekstveld waar men allerlei dingen kan typen. Gegarandeerd krijg je niet wat je verwacht.

    Illustratie en VBA-code

    Dit artikel is echter geen ellenlange beschrijving van wat je niet mag doen en juist wel moet doen. Eerder heb ik bovenaan het artikel een Excel bestand gezet met een gebruikersformulier. De code is ook voorzien, je mag die gerust nakijken en bestuderen.

                     

    Het voorbeeld gaat als volgt. Je moet de namen van personen invoeren die al dan niet aanwezig gaan zijn op een feestje. Je wil zowel de personen die toezeggen, als de personen die afzeggen, noteren. De invoer behelst aldus 2 zaken: naam en aanwezig of niet. Die invoer zou ook rechtstreeks op een werkblad kunnen, maar door gebruik te maken van een gebruikersformulier heeft de maker van de toepassing veel meer de controle over de invoer. Plus het feit dat er mogelijk nog andere code dient uitgevoerd te worden, welke de gebruiker over het hoofd zou kunnen zien of verkeerd uitvoeren.

    In de schermen hierboven zie je het gebruikersformulier, in 2 gedaanten: door een zogenaamde toggle button aan te bieden kan de gebruiker gemakkelijk wisselen tussen 2 voorstellingen: meer gegevens (Meer >>) of Minder (<< Minder) De gewenste userform controls worden getoond of verborgen.

    De invoer gebeurt in de textbox links bovenaan, gevolgd door de checkbox eronder. Vervolgens Toevoegen. Excel houdt de ingevoerde gegevens bij in een listbox. Je kan die bekijken als je op "Meer >>" klikt.

    Maar er is uiteraard meer dan dit, anders zou ik er geen artikel aan wijden. Waarom niet de items in de listbox zelf laten aanpassen? Je maakte een schrijffout of iemand moet op aanwezig staan en niet op afwezig. Je klikt gewoon in de listbox op de juiste rij, en de textbox en checkbox hernemen de waarden voor die rij. Dan pas je de naam aan of het vinkje, en kiest om te Vervangen. Een rij verwijderen gaat al even makkelijk.

    Ben je klaar met de invoer? Druk dan op de knop om weg te schrijven naar het werkblad.

    Tips en trucks

    In de code van de userform zitten nog tal van andere interessante tips. Enkele daarvan:

    • Op een userform kan je events niet uitschakelen zoals je zou doen op een werkblad met Application.EnableEvents = False. Chip Pearson raadt aan om variabelen te gebruiken op het niveau van de module: lees hier. Ik zie echter meer in het gebruik van de Tag eigenschap van een element. Op de userform hebben we voldoende elementen waarvan de tag eigenschap (tijdelijk) ingesteld en uitgelezen kan worden. De code uit het bestand:
      Private Sub Button_Vervangen_Click()
      ' Wim Gielis ' http://www.wimgielis.com
      ''''' ' Turn off events on a userform ' 12/01/12 '''''
      With Me.List_Gegevens Me.Text_Naam.Tag = 1 .List(.ListIndex, 0) = Me.Text_Naam.Text .List(.ListIndex, 1) = IIf(Me.Check_Aanwezig.Value, "ja", "neen") Me.Text_Naam.Tag = "" End With
      End Sub
      Private Sub List_Gegevens_Click()
      With Me If Me.Text_Naam.Tag = "" Then If .List_Gegevens.ListIndex > -1 Then .Text_Naam.Text = .List_Gegevens.List(.List_Gegevens.ListIndex, 0) .Check_Aanwezig = .List_Gegevens.List(.List_Gegevens.ListIndex, 1) = "ja" .Button_Vervangen.Enabled = True .Button_Verwijderen.Enabled = True End If End If Me.Button_Wegschrijven.Enabled = Me.List_Gegevens.ListCount > 0 End With
      End Sub
      Alvorens een actie uit te voeren die events genereert, zetten we een 1 in de tag van de textbox. Vervolgens is er het uitvoeren van de actie (met name het bijwerken van de listbox), en dan zetten we de tag weer op de normale waarde.
    • Is de textbox voor de naam leeg, dan kan je ook niet Toevoegen kiezen. Alweer een maatregel om onjuiste invoer te vermijden. Zijn er geen rijen in de listbox dan is het niet mogelijk om de knop Wegschrijven te activeren.
    • De tab order van de elementen op het gebruikersformulier moet logisch en consistent zijn. Een gebruiker die de Tab en Enter gebruikt moet bij de juiste elementen uitkomen.

    Conclusie

    Mits een doordachte aanpak en VBA-codering, kan een gebruikersformulier de methode bij uitstek zijn om invoer van de gebruiker op een vlotte en correcte manier te accepteren en verwerken.




    Over Wim

    Wim Gielis is Business Intelligence consultant en Excel expert

    Andere links