Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Berichtvensters en Invoervelden | Gebruikersinteractie
Excel VBA voor Bedrijfsautomatisering

Berichtvensters en Invoervelden

Veeg om het menu te tonen

Voordat je een volledig formulier bouwt, is het de moeite waard om de twee eenvoudigste manieren waarop VBA met een gebruiker kan communiceren onder de knie te krijgen: MsgBox, die informatie toont en eventueel een vraag stelt, en InputBox, die om een kort stukje tekst vraagt.

MsgBox

In zijn eenvoudigste vorm toont MsgBox gewoon een bericht en wacht tot de gebruiker op OK klikt:

MsgBox "Customer saved successfully."

Op deze manier gebruikt — als een statement, zonder haakjes en zonder dat het resultaat wordt opgeslagen — is MsgBox een doodlopende weg: het toont het bericht en de code gaat verder, ongeacht wat de gebruiker doet. Zodra je moet weten op welke knop is geklikt, wordt MsgBox een functie in plaats van een statement, wat betekent dat het haakjes nodig heeft en iets om het resultaat in op te slaan:

result = MsgBox("Delete customer Urban Retail?", _
    vbYesNo + vbQuestion, "Confirm Delete")
Figuur 5.1

vbYesNo en vbQuestion worden bij elkaar opgeteld met een gewone +, wat ongebruikelijk lijkt de eerste keer dat je het ziet, maar het is simpelweg hoe VBA je toestaat om twee onafhankelijke instellingen — welke knoppen verschijnen en welk pictogram wordt getoond — te combineren tot het enkele tweede argument dat MsgBox verwacht. result komt terug als een van VBA's ingebouwde constanten, vbYes of vbNo, die eigenlijk gewoon vermomde getallen zijn (6 en 7, hoewel je nooit het letterlijke getal zou schrijven). Een actie laten afhangen van het antwoord doe je met een gewone If:

If result = vbYes Then
    ' proceed with deletion
End If

InputBox

Waar MsgBox altijd een vaste set knopconstanten retourneert, vraagt InputBox de gebruiker om iets in te typen en geeft het terug wat er is ingevoerd:

city = InputBox("Enter a City to search for:", _
    "Search Customers", "Chicago")
Figuur 5.2

Het derde argument, hier "Chicago", vult het tekstvak vooraf in — handig om een waarschijnlijk antwoord te suggereren dat de gebruiker kan accepteren of overschrijven. Twee details gaan gemakkelijk de eerste keer mis: wat de gebruiker ook typt, het wordt altijd als een String teruggegeven, ongeacht hoe het eruitziet. Dus als je 25 typt, krijg je de tekst "25" en niet het getal 25. Je hebt CInt of CDbl nodig voordat je er rekenkundige bewerkingen mee uitvoert. Daarnaast veroorzaakt het klikken op Annuleren geen foutmelding en stopt het je code niet — het retourneert simpelweg een lege string (""), waar je code expliciet op moet controleren als een leeg antwoord niet geldig is.

Gebruikersprompts en bevestigingen

Het combineren van beide is het standaardpatroon voor elke actie die gebruikersinvoer leest en vervolgens bevestiging nodig heeft voordat er iets risicovols gebeurt:

Dim searchCity As String
Dim confirmMsg As VbMsgBoxResult
 
searchCity = InputBox("Enter a City to search for:", "Search Customers")
 
If searchCity = "" Then
    MsgBox "Search cancelled — no city entered."
    Exit Sub
End If

confirmMsg = MsgBox("Search for customers in " & searchCity & "?", vbYesNo)
If confirmMsg = vbNo Then Exit Sub
 
' ... proceed with the search

Let op: confirmMsg wordt gedeclareerd als As VbMsgBoxResult in plaats van een generiek type — dit is het daadwerkelijke benoemde type dat VBA gebruikt voor de returnwaarde van MsgBox. Door het expliciet te declareren (in plaats van als Variant), biedt de VBE automatisch aanvullen voor vbYes, vbNo en de rest tijdens het typen. De controle op een lege string na InputBox en de controle op vbNo na MsgBox gebruiken hetzelfde ontsnappingspatroon, Exit Sub, waarmee de procedure direct wordt gestopt in plaats van door te gaan naar code die ervan uitgaat dat er geldige invoer is.

Taak

  1. Schrijf een Sub die met InputBox om een Customer ID vraagt en vervolgens met MsgBox bevestigt: "Delete customer [ID]?" met Ja/Nee-knoppen en een vraagtekenpictogram.
  2. Behandel zowel het lege-string geval (gebruiker klikt op Annuleren in de InputBox) als het vbNo geval (gebruiker weigert de bevestiging) door de Sub vroegtijdig te verlaten met een bericht dat uitlegt dat er niets is gebeurd.
  3. Alleen als beide controles slagen, toon dan een laatste MsgBox met de tekst "Customer would be deleted here."
Hint
expand arrow

1. Het verkrijgen van de Customer ID en het opbouwen van de bevestiging

  • InputBox heeft een prompt nodig en kan een titel als tweede argument krijgen — sla de invoer op in een String-variabele.
  • Het bevestigingsbericht moet de daadwerkelijke ID bevatten door deze te koppelen met &, niet als vaste tekst — anders zou er letterlijk altijd "[ID]" staan.
  • MsgBox als functie (om het resultaat op te vangen) vereist haakjes; combineer vbYesNo en vbQuestion met +.

2. Afhandelen van Annuleren en Nee

  • Controleer direct na de InputBox-regel op het lege-string geval, voordat je een bevestigingsbericht probeert te maken — het heeft geen zin om te vragen "Delete customer?" als er geen ID is om te verwijderen.
  • Exit Sub stopt de procedure onmiddellijk waar deze wordt geplaatst — gebruik dit direct in elke If-blok, met een MsgBox vlak ervoor die uitlegt dat er niets is gebeurd.
  • De vbNo-controle komt na de bevestigings-MsgBox, waarbij het resultaat wordt vergeleken met de constante vbNo.

3. De laatste bevestiging

  • Deze regel wordt alleen uitgevoerd als de uitvoering hier komt — omdat beide eerdere controles bij mislukking Exit Sub uitvoeren, is het voldoende om deze MsgBox na beide controles te plaatsen om te garanderen dat deze alleen wordt getoond als beide zijn geslaagd.
Oplossing
expand arrow
Option Explicit

Sub DeleteCustomerPrompt()
    Dim customerID As String
    Dim confirmResult As VbMsgBoxResult

    ' Step 1 — ask for the Customer ID
    customerID = InputBox("Enter the Customer ID to delete:", "Delete Customer")

    ' Step 2a — handle Cancel / empty input
    If customerID = "" Then
        MsgBox "Cancelled — no Customer ID was entered. Nothing happened."
        Exit Sub
    End If

    ' Step 1 (continued) — confirm with Yes/No
    confirmResult = MsgBox("Delete customer " & customerID & "?", _
        vbYesNo + vbQuestion, "Confirm Delete")

    ' Step 2b — handle No
    If confirmResult = vbNo Then
        MsgBox "Cancelled — deletion was not confirmed. Nothing happened."
        Exit Sub
    End If

    ' Step 3 — both checks passed
    MsgBox "Customer would be deleted here."
End Sub

Voer het uit (F5) en probeer alle drie de paden: klik op Annuleren in de InputBox, klik op Nee bij de bevestiging en voer tenslotte een ID in en klik op Ja — elk zou een ander van de drie berichten moeten tonen.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 5. Hoofdstuk 1

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Berichtvensters en Invoervelden

Voordat je een volledig formulier bouwt, is het de moeite waard om de twee eenvoudigste manieren waarop VBA met een gebruiker kan communiceren onder de knie te krijgen: MsgBox, die informatie toont en eventueel een vraag stelt, en InputBox, die om een kort stukje tekst vraagt.

MsgBox

In zijn eenvoudigste vorm toont MsgBox gewoon een bericht en wacht tot de gebruiker op OK klikt:

MsgBox "Customer saved successfully."

Op deze manier gebruikt — als een statement, zonder haakjes en zonder dat het resultaat wordt opgeslagen — is MsgBox een doodlopende weg: het toont het bericht en de code gaat verder, ongeacht wat de gebruiker doet. Zodra je moet weten op welke knop is geklikt, wordt MsgBox een functie in plaats van een statement, wat betekent dat het haakjes nodig heeft en iets om het resultaat in op te slaan:

result = MsgBox("Delete customer Urban Retail?", _
    vbYesNo + vbQuestion, "Confirm Delete")
Figuur 5.1

vbYesNo en vbQuestion worden bij elkaar opgeteld met een gewone +, wat ongebruikelijk lijkt de eerste keer dat je het ziet, maar het is simpelweg hoe VBA je toestaat om twee onafhankelijke instellingen — welke knoppen verschijnen en welk pictogram wordt getoond — te combineren tot het enkele tweede argument dat MsgBox verwacht. result komt terug als een van VBA's ingebouwde constanten, vbYes of vbNo, die eigenlijk gewoon vermomde getallen zijn (6 en 7, hoewel je nooit het letterlijke getal zou schrijven). Een actie laten afhangen van het antwoord doe je met een gewone If:

If result = vbYes Then
    ' proceed with deletion
End If

InputBox

Waar MsgBox altijd een vaste set knopconstanten retourneert, vraagt InputBox de gebruiker om iets in te typen en geeft het terug wat er is ingevoerd:

city = InputBox("Enter a City to search for:", _
    "Search Customers", "Chicago")
Figuur 5.2

Het derde argument, hier "Chicago", vult het tekstvak vooraf in — handig om een waarschijnlijk antwoord te suggereren dat de gebruiker kan accepteren of overschrijven. Twee details gaan gemakkelijk de eerste keer mis: wat de gebruiker ook typt, het wordt altijd als een String teruggegeven, ongeacht hoe het eruitziet. Dus als je 25 typt, krijg je de tekst "25" en niet het getal 25. Je hebt CInt of CDbl nodig voordat je er rekenkundige bewerkingen mee uitvoert. Daarnaast veroorzaakt het klikken op Annuleren geen foutmelding en stopt het je code niet — het retourneert simpelweg een lege string (""), waar je code expliciet op moet controleren als een leeg antwoord niet geldig is.

Gebruikersprompts en bevestigingen

Het combineren van beide is het standaardpatroon voor elke actie die gebruikersinvoer leest en vervolgens bevestiging nodig heeft voordat er iets risicovols gebeurt:

Dim searchCity As String
Dim confirmMsg As VbMsgBoxResult
 
searchCity = InputBox("Enter a City to search for:", "Search Customers")
 
If searchCity = "" Then
    MsgBox "Search cancelled — no city entered."
    Exit Sub
End If

confirmMsg = MsgBox("Search for customers in " & searchCity & "?", vbYesNo)
If confirmMsg = vbNo Then Exit Sub
 
' ... proceed with the search

Let op: confirmMsg wordt gedeclareerd als As VbMsgBoxResult in plaats van een generiek type — dit is het daadwerkelijke benoemde type dat VBA gebruikt voor de returnwaarde van MsgBox. Door het expliciet te declareren (in plaats van als Variant), biedt de VBE automatisch aanvullen voor vbYes, vbNo en de rest tijdens het typen. De controle op een lege string na InputBox en de controle op vbNo na MsgBox gebruiken hetzelfde ontsnappingspatroon, Exit Sub, waarmee de procedure direct wordt gestopt in plaats van door te gaan naar code die ervan uitgaat dat er geldige invoer is.

Taak

  1. Schrijf een Sub die met InputBox om een Customer ID vraagt en vervolgens met MsgBox bevestigt: "Delete customer [ID]?" met Ja/Nee-knoppen en een vraagtekenpictogram.
  2. Behandel zowel het lege-string geval (gebruiker klikt op Annuleren in de InputBox) als het vbNo geval (gebruiker weigert de bevestiging) door de Sub vroegtijdig te verlaten met een bericht dat uitlegt dat er niets is gebeurd.
  3. Alleen als beide controles slagen, toon dan een laatste MsgBox met de tekst "Customer would be deleted here."
Hint
expand arrow

1. Het verkrijgen van de Customer ID en het opbouwen van de bevestiging

  • InputBox heeft een prompt nodig en kan een titel als tweede argument krijgen — sla de invoer op in een String-variabele.
  • Het bevestigingsbericht moet de daadwerkelijke ID bevatten door deze te koppelen met &, niet als vaste tekst — anders zou er letterlijk altijd "[ID]" staan.
  • MsgBox als functie (om het resultaat op te vangen) vereist haakjes; combineer vbYesNo en vbQuestion met +.

2. Afhandelen van Annuleren en Nee

  • Controleer direct na de InputBox-regel op het lege-string geval, voordat je een bevestigingsbericht probeert te maken — het heeft geen zin om te vragen "Delete customer?" als er geen ID is om te verwijderen.
  • Exit Sub stopt de procedure onmiddellijk waar deze wordt geplaatst — gebruik dit direct in elke If-blok, met een MsgBox vlak ervoor die uitlegt dat er niets is gebeurd.
  • De vbNo-controle komt na de bevestigings-MsgBox, waarbij het resultaat wordt vergeleken met de constante vbNo.

3. De laatste bevestiging

  • Deze regel wordt alleen uitgevoerd als de uitvoering hier komt — omdat beide eerdere controles bij mislukking Exit Sub uitvoeren, is het voldoende om deze MsgBox na beide controles te plaatsen om te garanderen dat deze alleen wordt getoond als beide zijn geslaagd.
Oplossing
expand arrow
Option Explicit

Sub DeleteCustomerPrompt()
    Dim customerID As String
    Dim confirmResult As VbMsgBoxResult

    ' Step 1 — ask for the Customer ID
    customerID = InputBox("Enter the Customer ID to delete:", "Delete Customer")

    ' Step 2a — handle Cancel / empty input
    If customerID = "" Then
        MsgBox "Cancelled — no Customer ID was entered. Nothing happened."
        Exit Sub
    End If

    ' Step 1 (continued) — confirm with Yes/No
    confirmResult = MsgBox("Delete customer " & customerID & "?", _
        vbYesNo + vbQuestion, "Confirm Delete")

    ' Step 2b — handle No
    If confirmResult = vbNo Then
        MsgBox "Cancelled — deletion was not confirmed. Nothing happened."
        Exit Sub
    End If

    ' Step 3 — both checks passed
    MsgBox "Customer would be deleted here."
End Sub

Voer het uit (F5) en probeer alle drie de paden: klik op Annuleren in de InputBox, klik op Nee bij de bevestiging en voer tenslotte een ID in en klik op Ja — elk zou een ander van de drie berichten moeten tonen.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 5. Hoofdstuk 1
some-alt