Meddelanderutor och inmatningsrutor
Svep för att visa menyn
Innan du bygger ett fullständigt formulär är det värt att behärska de två enklaste sätten som VBA kan kommunicera med en användare: MsgBox, som visar information och eventuellt ställer en fråga, och InputBox, som ber om en kort text tillbaka.
MsgBox
I sin enklaste form visar MsgBox bara ett meddelande och väntar på att användaren ska klicka på OK:
MsgBox "Customer saved successfully."
Används det på detta sätt — som ett påstående, utan parenteser och utan att något fångar resultatet — är MsgBox en återvändsgränd: den visar meddelandet och koden fortsätter, oavsett vad användaren gör. Så snart du behöver veta vilken knapp som klickades på, blir MsgBox en funktion istället för ett påstående, vilket innebär att den behöver parenteser och något för att lagra dess resultat:
result = MsgBox("Delete customer Urban Retail?", _
vbYesNo + vbQuestion, "Confirm Delete")
vbYesNo och vbQuestion läggs ihop med ett vanligt +, vilket kan se ovanligt ut första gången du ser det men är helt enkelt hur VBA låter dig kombinera två oberoende inställningar — vilka knappar som visas och vilken ikon som visas — till det enda andra argumentet som MsgBox förväntar sig. result returneras som en av VBAs inbyggda konstanter, vbYes eller vbNo, som egentligen bara är siffror i förklädnad (6 och 7, även om du aldrig skulle skriva det faktiska numret). Styr en åtgärd baserat på svaret med ett vanligt If:
If result = vbYes Then
' proceed with deletion
End If
InputBox
Där MsgBox alltid returnerar en fast uppsättning knappkonstanter, ber InputBox användaren att skriva in något och returnerar vad de än har matat in:
city = InputBox("Enter a City to search for:", _
"Search Customers", "Chicago")
Det tredje argumentet, "Chicago" här, förfyller textrutan — användbart för att föreslå ett troligt svar som användaren kan acceptera eller skriva över. Två detaljer är lätta att missa första gången: oavsett vad användaren skriver in returneras det alltid som en sträng, så om man skriver 25 får man texten "25", inte talet 25, och du behöver använda CInt eller CDbl innan du gör beräkningar med det; och att klicka på Avbryt ger inte ett fel eller stoppar din kod — det returnerar helt enkelt en tom sträng (""), vilket din kod måste kontrollera uttryckligen om ett tomt svar inte är giltigt.
Användarfrågor och bekräftelser
Att kombinera de två är standardmönstret för alla åtgärder som läser användarinmatning och sedan behöver bekräfta innan något riskabelt utförs:
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
Observera att confirmMsg deklareras As VbMsgBoxResult istället för en generisk typ — detta är den faktiska namngivna typen som VBA använder för MsgBox returvärde, och att deklarera det explicit (istället för att lämna det som en Variant) gör att VBE erbjuder autokomplettering för vbYes, vbNo och resten medan du skriver. Kontroll av tom sträng efter InputBox och kontroll av vbNo efter MsgBox använder båda samma avbrytarmönster, Exit Sub, vilket stoppar proceduren omedelbart istället för att låta den fortsätta in i kod som förutsätter att giltig inmatning finns.
Uppgift
- Skriv en
Subsom använderInputBoxför att fråga efter ett Customer ID och sedan MsgBox för att bekräfta "Delete customer [ID]?" med Ja/Nej-knappar och en frågeikon. - Hantera både fallet med tom sträng (användaren klickade på Avbryt i InputBox) och fallet
vbNo(användaren avböjde bekräftelsen) genom att avsluta Sub i förtid med ett meddelande som förklarar att inget hände. - Endast när båda kontrollerna passerar, visa en sista MsgBox med texten "Customer would be deleted here."
1. Hämta Customer ID och bygg bekräftelsen
InputBoxbehöver en uppmaning och kan ta en titel som andra argument — spara det som returneras i enString-variabel.- Bekräftelsemeddelandet behöver det faktiska ID:t infogat med
&, inte som en fast sträng — annars står det alltid bokstavligen "[ID]". MsgBoxsom funktion (för att fånga ett resultat) kräver parenteser; kombineravbYesNoochvbQuestionmed+.
2. Hantera Avbryt och Nej
- Kontrollera fallet med tom sträng direkt efter raden med
InputBox, innan du försöker bygga ett bekräftelsemeddelande — det är ingen idé att fråga "Delete customer?" om det inte finns något ID att ta bort. Exit Substoppar proceduren omedelbart där den placeras — använd det direkt i varjeIf-block, med enMsgBoxprecis före som förklarar att inget hände.- Kontroll av
vbNosker efter bekräftelse-MsgBox, där du jämför resultatet mot konstantenvbNo.
3. Den slutliga bekräftelsen
- Den här raden körs bara om exekveringen når den — eftersom båda tidigare kontrollerna använder
Exit Subvid fel, räcker det att placera dennaMsgBoxefter båda kontrollerna för att garantera att den bara visas när båda har passerat.
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) och testa alla tre vägar: klicka på Avbryt i InputBox, klicka på Nej i bekräftelsen och slutligen ange ett ID och klicka på Ja — varje väg ska ge ett av de tre olika meddelandena.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal