Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Meddelanderutor och inmatningsrutor | Användarinteraktion
Excel VBA för affärsautomatisering

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")
Figur 5.1

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")
Figur 5.2

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

  1. Skriv en Sub som använder InputBox fö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.
  2. 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.
  3. Endast när båda kontrollerna passerar, visa en sista MsgBox med texten "Customer would be deleted here."
Tips
expand arrow

1. Hämta Customer ID och bygg bekräftelsen

  • InputBox behöver en uppmaning och kan ta en titel som andra argument — spara det som returneras i en String-variabel.
  • Bekräftelsemeddelandet behöver det faktiska ID:t infogat med &, inte som en fast sträng — annars står det alltid bokstavligen "[ID]".
  • MsgBox som funktion (för att fånga ett resultat) kräver parenteser; kombinera vbYesNo och vbQuestion med +.

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 Sub stoppar proceduren omedelbart där den placeras — använd det direkt i varje If-block, med en MsgBox precis före som förklarar att inget hände.
  • Kontroll av vbNo sker efter bekräftelse-MsgBox, där du jämför resultatet mot konstanten vbNo.

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 Sub vid fel, räcker det att placera denna MsgBox efter båda kontrollerna för att garantera att den bara visas när båda har passerat.
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) 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.

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 5. Kapitel 1

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Avsnitt 5. Kapitel 1
some-alt