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")
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")
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
- Skriv en
Sub, der brugerInputBoxtil 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. - 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. - Kun når begge tjek er bestået, vis en sidste MsgBox med teksten "Customer would be deleted here."
1. Indhentning af Customer ID og opbygning af bekræftelsen
InputBoxkræver en prompt og kan tage en titel som andet argument — gem det, der returneres, i enString-variabel.- Bekræftelsesbeskeden skal have det faktiske ID sat ind med
&, ikke skrevet som en fast streng — ellers vil den altid sige "[ID]" bogstaveligt. MsgBoxbrugt som funktion (hvor resultatet gemmes) kræver parenteser; kombinérvbYesNoogvbQuestionmed+.
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 Substopper proceduren med det samme, hvor end den placeres — brug den direkte i hverIf-blok, med enMsgBoxlige før, der forklarer at intet skete.vbNo-tjekket kommer efter bekræftelses-MsgBox, hvor resultatet sammenlignes med konstantenvbNo.
3. Den endelige bekræftelse
- Denne linje køres kun, hvis eksekveringen når dertil — da begge tidligere tjek bruger
Exit Subved fejl, er det nok blot at placere denneMsgBoxefter begge tjek for at sikre, at den kun vises, når begge er bestået.
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.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat