Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Meddelelsesbokse og Inputbokse | Brugerinteraktion
Excel VBA til Forretningsautomatisering

Meddelelsesbokse og Inputbokse

Stryg for at vise menuen

Før du bygger en fuld formular, er det værd at mestre de to enkleste måder, hvorpå VBA kan kommunikere med en bruger: MsgBox, som viser information og eventuelt stiller et spørgsmål, og InputBox, som beder om et kort tekstsvar.

MsgBox

I sin simpleste form viser MsgBox blot en besked og venter på, at brugeren klikker OK:

MsgBox "Customer saved successfully."

Brugt på denne måde — som en erklæring, uden parenteser og uden at gemme et resultat — er MsgBox en blindgyde: den viser beskeden, og koden fortsætter, uanset hvad brugeren gør. I det øjeblik du har brug for at vide, hvilken knap der blev klikket, bliver MsgBox en funktion i stedet for en erklæring, hvilket betyder, at den skal have parenteser og noget til at gemme resultatet:

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

vbYesNo og vbQuestion lægges sammen med et almindeligt +, hvilket kan virke usædvanligt første gang, men det er blot sådan, VBA lader dig kombinere to uafhængige indstillinger — hvilke knapper der vises, og hvilket ikon der vises — til det enkelte andet argument, MsgBox forventer. result returneres som en af VBA's indbyggede konstanter, vbYes eller vbNo, som i virkeligheden bare er tal forklædt (6 og 7, selvom du aldrig ville skrive det bogstavelige tal). Afgræns en handling baseret på svaret med en almindelig If:

If result = vbYes Then
    ' proceed with deletion
End If

InputBox

Hvor MsgBox kun returnerer et fast sæt af knapkonstanter, beder InputBox brugeren om at indtaste noget og returnerer præcis det, de har skrevet:

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

Det tredje argument, "Chicago" her, forudfylder tekstboksen — nyttigt til at foreslå et sandsynligt svar, som brugeren enten kan acceptere eller overskrive. To detaljer er lette at overse første gang: Uanset hvad brugeren indtaster, returneres det altid som en streng (String), så hvis man skriver 25, får man teksten "25" og ikke tallet 25. Du skal derfor bruge CInt eller CDbl, før du kan udføre beregninger med det. Hvis brugeren klikker på Annuller, udløses der ikke en fejl, og koden stoppes ikke — der returneres blot en tom streng (""), som din kode eksplicit skal tjekke for, hvis et tomt svar ikke er gyldigt.

Brugerprompter og bekræftelser

At kombinere de to er standardmønsteret for enhver handling, der læser brugerinput og derefter skal bekræfte, før der udføres noget risikabelt:

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

Bemærk, at confirmMsg er erklæret As VbMsgBoxResult i stedet for en generisk type — dette er den faktiske navngivne type, som VBA bruger til MsgBox'ens returværdi, og ved at erklære den eksplicit (i stedet for at lade den være en Variant) får du autoudfyldning for vbYes, vbNo og de øvrige muligheder, mens du skriver. Tjekket for tom streng efter InputBox og tjekket for vbNo efter MsgBox bruger begge samme undvigelsesmønster, Exit Sub, som straks stopper proceduren i stedet for at lade den fortsætte ind i kode, der antager, at der findes gyldigt input.

Opgave

  1. Skriv en Sub, der bruger InputBox til at bede om et Customer ID, og derefter MsgBox til at bekræfte "Delete customer [ID]?" med Ja/Nej-knapper og et spørgsmålstegn-ikon.
  2. Håndter både tilfælde med tom streng (brugeren klikkede Annuller i InputBox) og vbNo-tilfældet (brugeren afviste bekræftelsen) ved at afslutte Sub tidligt med en besked, der forklarer, at intet skete.
  3. Kun når begge tjek er bestået, vis en sidste MsgBox med teksten "Customer would be deleted here."
Tip
expand arrow

1. Indhentning af Customer ID og opbygning af bekræftelsen

  • InputBox kræver en prompt og kan tage en titel som andet argument — gem det, der returneres, i en String-variabel.
  • Bekræftelsesbeskeden skal have det faktiske ID sat ind med &, ikke skrevet som en fast streng — ellers vil den altid sige "[ID]" bogstaveligt.
  • MsgBox brugt som funktion (hvor resultatet gemmes) kræver parenteser; kombinér vbYesNo og vbQuestion med +.

2. Håndtering af Annuller og Nej

  • Tjek for tom streng lige efter InputBox-linjen, før du forsøger at opbygge en bekræftelsesbesked — der er ingen grund til at spørge "Delete customer?" hvis der ikke er noget ID at slette.
  • Exit Sub stopper proceduren med det samme, hvor end den placeres — brug den direkte i hver If-blok, med en MsgBox lige før, der forklarer at intet skete.
  • vbNo-tjekket kommer efter bekræftelses-MsgBox, hvor resultatet sammenlignes med konstanten vbNo.

3. Den endelige bekræftelse

  • Denne linje køres kun, hvis eksekveringen når dertil — da begge tidligere tjek bruger Exit Sub ved fejl, er det nok blot at placere denne MsgBox efter begge tjek for at sikre, at den kun vises, når begge er bestået.
Løsning
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

Kør den (F5) og prøv alle tre forløb: klik Annuller i InputBox, klik Nej i bekræftelsen, og til sidst indtast et ID og klik Ja — hver mulighed skal give en af de tre forskellige beskeder.

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 5. Kapitel 1

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Sektion 5. Kapitel 1
some-alt