Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Meldingsbokser og inndatabokser | Brukerinteraksjon
Excel VBA for Forretningsautomatisering

Meldingsbokser og inndatabokser

Sveip for å vise menyen

Før du bygger et komplett skjema, er det verdt å mestre de to enkleste måtene VBA kan kommunisere med en bruker på: MsgBox, som viser informasjon og eventuelt stiller et spørsmål, og InputBox, som ber om en kort tekst tilbake.

MsgBox

I sin enkleste form viser MsgBox bare en melding og venter på at brukeren klikker OK:

MsgBox "Customer saved successfully."

Brukt på denne måten — som en setning, uten parenteser og uten å fange opp et resultat — er MsgBox en blindvei: den viser meldingen, og koden fortsetter uansett hva brukeren gjør. I det øyeblikket du trenger å vite hvilken knapp som ble klikket, blir MsgBox en funksjon i stedet for en setning, noe som betyr at den trenger parenteser og noe å lagre resultatet i:

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

vbYesNo og vbQuestion legges sammen med et vanlig +, noe som kan virke uvant første gang du ser det, men det er rett og slett slik VBA lar deg kombinere to uavhengige innstillinger — hvilke knapper som vises, og hvilket ikon som vises — til det ene andre argumentet MsgBox forventer. result kommer tilbake som en av VBAs innebygde konstanter, vbYes eller vbNo, som egentlig bare er tall i forkledning (6 og 7, selv om du aldri ville skrevet det bokstavelige tallet). Styr en handling basert på svaret med en enkel If:

If result = vbYes Then
    ' proceed with deletion
End If

InputBox

Der MsgBox returnerer kun et fast sett med knappkonstanter, ber InputBox brukeren om å skrive inn noe og returnerer det brukeren har skrevet inn:

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

Det tredje argumentet, "Chicago" her, forhåndsutfyller tekstboksen — nyttig for å foreslå et sannsynlig svar brukeren enten kan godta eller overskrive. To detaljer er lette å gjøre feil første gang: uansett hva brukeren skriver inn, returneres det alltid som en streng, så hvis man skriver inn 25 får man teksten "25", ikke tallet 25, og du må bruke CInt eller CDbl før du gjør aritmetikk med det; og hvis man klikker Cancel oppstår det ingen feil og koden stopper ikke — det returneres bare en tom streng (""), som koden din må sjekke eksplisitt hvis et tomt svar ikke er gyldig.

Brukerforespørsler og bekreftelser

Å kombinere de to er standardmønsteret for enhver handling som leser brukerinput og deretter må bekrefte før noe risikabelt utføres:

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

Merk at confirmMsg er deklarert As VbMsgBoxResult i stedet for en generell type — dette er den faktiske navngitte typen VBA bruker for returverdien fra MsgBox, og ved å deklarere den eksplisitt (i stedet for å la den være en Variant) får du autoutfylling for vbYes, vbNo og de andre mens du skriver. Sjekken for tom streng etter InputBox og sjekken for vbNo etter MsgBox bruker begge samme avbrytelsesmønster, Exit Sub, som stopper prosedyren umiddelbart i stedet for å la den fortsette inn i kode som forutsetter at gyldig input finnes.

Oppgave

  1. Skriv en Sub som bruker InputBox for å be om et Customer ID, deretter MsgBox for å bekrefte "Delete customer [ID]?" med Ja/Nei-knapper og et spørsmålstegn-ikon.
  2. Håndter både tom streng (brukeren trykket Avbryt i InputBox) og vbNo-tilfellet (brukeren avslo bekreftelsen) ved å avslutte Sub tidlig med en melding som forklarer at ingenting skjedde.
  3. Kun når begge sjekker er bestått, vis en siste MsgBox med teksten "Customer would be deleted here."
Tips
expand arrow

1. Hente Customer ID og bygge bekreftelsen

  • InputBox trenger en melding og kan ta en tittel som andre argument — lagre det som returneres i en String-variabel.
  • Bekreftelsesmeldingen må ha den faktiske ID-en satt inn med &, ikke skrevet som en fast streng — ellers vil det alltid stå "[ID]" bokstavelig.
  • MsgBox brukt som funksjon (for å fange resultatet) trenger parenteser; kombiner vbYesNo og vbQuestion med +.

2. Håndtering av Avbryt og Nei

  • Sjekk for tom streng rett etter InputBox-linjen, før du prøver å bygge en bekreftelsesmelding — det er ingen vits i å spørre "Delete customer?" hvis det ikke finnes en ID å slette.
  • Exit Sub stopper prosedyren umiddelbart der den står — bruk den rett inne i hver If-blokk, med en MsgBox rett før som forklarer at ingenting skjedde.
  • vbNo-sjekken kommer etter bekreftelses-MsgBox, og sammenligner resultatet du fanget mot konstanten vbNo.

3. Den siste bekreftelsen

  • Denne linjen kjøres bare hvis utførelsen når den — siden begge de tidligere sjekkene bruker Exit Sub ved feil, er det nok å plassere denne MsgBox etter begge sjekkene for å garantere at den kun vises når begge er bestått.
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

Kjør den (F5) og prøv alle tre veier: klikk Avbryt i InputBox, klikk Nei i bekreftelsen, og til slutt skriv inn en ID og klikk Ja — hver skal gi en av de tre ulike meldingene.

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 5. Kapittel 1

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Meldingsbokser og inndatabokser

Før du bygger et komplett skjema, er det verdt å mestre de to enkleste måtene VBA kan kommunisere med en bruker på: MsgBox, som viser informasjon og eventuelt stiller et spørsmål, og InputBox, som ber om en kort tekst tilbake.

MsgBox

I sin enkleste form viser MsgBox bare en melding og venter på at brukeren klikker OK:

MsgBox "Customer saved successfully."

Brukt på denne måten — som en setning, uten parenteser og uten å fange opp et resultat — er MsgBox en blindvei: den viser meldingen, og koden fortsetter uansett hva brukeren gjør. I det øyeblikket du trenger å vite hvilken knapp som ble klikket, blir MsgBox en funksjon i stedet for en setning, noe som betyr at den trenger parenteser og noe å lagre resultatet i:

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

vbYesNo og vbQuestion legges sammen med et vanlig +, noe som kan virke uvant første gang du ser det, men det er rett og slett slik VBA lar deg kombinere to uavhengige innstillinger — hvilke knapper som vises, og hvilket ikon som vises — til det ene andre argumentet MsgBox forventer. result kommer tilbake som en av VBAs innebygde konstanter, vbYes eller vbNo, som egentlig bare er tall i forkledning (6 og 7, selv om du aldri ville skrevet det bokstavelige tallet). Styr en handling basert på svaret med en enkel If:

If result = vbYes Then
    ' proceed with deletion
End If

InputBox

Der MsgBox returnerer kun et fast sett med knappkonstanter, ber InputBox brukeren om å skrive inn noe og returnerer det brukeren har skrevet inn:

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

Det tredje argumentet, "Chicago" her, forhåndsutfyller tekstboksen — nyttig for å foreslå et sannsynlig svar brukeren enten kan godta eller overskrive. To detaljer er lette å gjøre feil første gang: uansett hva brukeren skriver inn, returneres det alltid som en streng, så hvis man skriver inn 25 får man teksten "25", ikke tallet 25, og du må bruke CInt eller CDbl før du gjør aritmetikk med det; og hvis man klikker Cancel oppstår det ingen feil og koden stopper ikke — det returneres bare en tom streng (""), som koden din må sjekke eksplisitt hvis et tomt svar ikke er gyldig.

Brukerforespørsler og bekreftelser

Å kombinere de to er standardmønsteret for enhver handling som leser brukerinput og deretter må bekrefte før noe risikabelt utføres:

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

Merk at confirmMsg er deklarert As VbMsgBoxResult i stedet for en generell type — dette er den faktiske navngitte typen VBA bruker for returverdien fra MsgBox, og ved å deklarere den eksplisitt (i stedet for å la den være en Variant) får du autoutfylling for vbYes, vbNo og de andre mens du skriver. Sjekken for tom streng etter InputBox og sjekken for vbNo etter MsgBox bruker begge samme avbrytelsesmønster, Exit Sub, som stopper prosedyren umiddelbart i stedet for å la den fortsette inn i kode som forutsetter at gyldig input finnes.

Oppgave

  1. Skriv en Sub som bruker InputBox for å be om et Customer ID, deretter MsgBox for å bekrefte "Delete customer [ID]?" med Ja/Nei-knapper og et spørsmålstegn-ikon.
  2. Håndter både tom streng (brukeren trykket Avbryt i InputBox) og vbNo-tilfellet (brukeren avslo bekreftelsen) ved å avslutte Sub tidlig med en melding som forklarer at ingenting skjedde.
  3. Kun når begge sjekker er bestått, vis en siste MsgBox med teksten "Customer would be deleted here."
Tips
expand arrow

1. Hente Customer ID og bygge bekreftelsen

  • InputBox trenger en melding og kan ta en tittel som andre argument — lagre det som returneres i en String-variabel.
  • Bekreftelsesmeldingen må ha den faktiske ID-en satt inn med &, ikke skrevet som en fast streng — ellers vil det alltid stå "[ID]" bokstavelig.
  • MsgBox brukt som funksjon (for å fange resultatet) trenger parenteser; kombiner vbYesNo og vbQuestion med +.

2. Håndtering av Avbryt og Nei

  • Sjekk for tom streng rett etter InputBox-linjen, før du prøver å bygge en bekreftelsesmelding — det er ingen vits i å spørre "Delete customer?" hvis det ikke finnes en ID å slette.
  • Exit Sub stopper prosedyren umiddelbart der den står — bruk den rett inne i hver If-blokk, med en MsgBox rett før som forklarer at ingenting skjedde.
  • vbNo-sjekken kommer etter bekreftelses-MsgBox, og sammenligner resultatet du fanget mot konstanten vbNo.

3. Den siste bekreftelsen

  • Denne linjen kjøres bare hvis utførelsen når den — siden begge de tidligere sjekkene bruker Exit Sub ved feil, er det nok å plassere denne MsgBox etter begge sjekkene for å garantere at den kun vises når begge er bestått.
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

Kjør den (F5) og prøv alle tre veier: klikk Avbryt i InputBox, klikk Nei i bekreftelsen, og til slutt skriv inn en ID og klikk Ja — hver skal gi en av de tre ulike meldingene.

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 5. Kapittel 1
some-alt