Avbryta ett Makro och behålla kontrollen

October 30

När du utvecklar ett makro för andra att använda, kanske du vill lägga till en metod för användaren att avsluta ditt makro innan den slutar, och ändå behålla kontrollen över vad makrot gör. Ctrl + Break stoppar ett makro, men det spelar ingen 't avsluta graciöst, eftersom det tillåter användaren att se koden i VBA editorn.

Det finns flera sätt att närma sig detta problem. Den första är att bygga en "vill du avsluta" frågar in ditt makro, och sedan har makro displayen prompten periodvis. Till exempel, på följande kod:

Gör ...

"Din kod går här

Counter = Räknare + 1
Om Counter Mod 25 = 0 Då
Om MsgBox ("Stoppa Macro?", VbYesNo) = vbYes Avsluta sedan
End If
Loop

Makro konstruktionen bygger på antagandet att du har ett antal steg som du vill upprepa om och om igen, med hjälp av en Do ... Loop struktur. Varje gång genom öglan, är värdet på Counter ökas. Var 25 gånger genom slingan, "stopp makrot?" prompten visas, och användaren har en chans att avsluta.

Detta tillvägagångssätt är lätt att implementera och kan fungera ganska bra för vissa ändamål. Den största nackdelen med detta tillvägagångssätt är dock att den inte tillåter omedelbarhet-användaren måste vänta med att lämna makrot förrän minst 25 iterationer har inträffat.

Ett annat sätt är att "gömma" VBA-kod och tillämpa ett lösenord för den. Detta gör du genom att följa dessa steg inifrån VBA Redaktör:

  1. Välj alternativ från menyn Verktyg i VBAProject Properties. Redaktören visar dialogrutan Projektegenskaper.
  2. Se till att fliken Skydd visas. (Se figur 1.)

    Avbryta ett Makro och behålla kontrollen

    Figur 1. Fliken Skydd av Projekt dialogrutan Egenskaper.

  3. Välj Lås Project för kryssrutan Kollar.
  4. I rutan Lösenord anger du ett lösenord som du vill används för att skydda makrot.
  5. I rutan Bekräfta lösenord, ange samma lösenord en gång till.
  6. Klicka på OK.

Stäng VBA Editor, spara sedan arbetsboken. Med VBA-projektet skyddade, kan användaren fortfarande klicka Ctrl + Break för att stoppa makrot, men de kommer inte att kunna få till själva programkoden. De kommer bara att kunna välja från de Fortsätt eller avsluta knappar, som båda skydda din kod. Som en extra fördel, detta synsätt begränsar också användaren från att visa din kod genom att använda menyn, verktygsfält, eller band val.

Kanske den bästa metoden är dock att skapa en felhanterare som i huvudsak kommer att ta ansvar när användaren trycker på Esc eller Ctrl + Break. Hanteraren som körs kan sedan be användaren om de verkligen vill sluta, och sedan stänga graciöst om de gör. Här är några exempel kod som visar hur detta görs:

Sub Looptest ()
Application.EnableCancelKey = xlErrorHandler
On Error GoTo ErrHandler

Dim x As Long
Dim y As Long
Dim lContinue As Long

y = 100000000
För x = 1 till y Steg 1
Nästa

Application.EnableCancelKey = xlInterrupt
Exit Sub

ErrHandler:
Om Err.Number = 18 Sen
lContinue = MsgBox (prompten: = Format (x / y, "0,0%") & _
"Komplett" & vbCrLf & _
"Vill du fortsätta (JA)?" & VbCrLf & _
"Vill du avsluta? [Klicka NO]", _
Knappar: = vbYesNo)
Om lContinue = vbYes Därefter
Återuppta
Else
Application.EnableCancelKey = xlInterrupt
MsgBox ("Program slutade på din begäran")
Exit Sub
End If
End If

Application.EnableCancelKey = xlInterrupt
End Sub

Observera att det här exemplet använder EnableCancelKey metoden, tilldela det namnet på den etikett som ska hoppade till om knappen Avbryt (Esc eller Ctrl + Break) trycks in. I detta fall är ErrHandler hoppade till, och användaren ombeds vad de ska göra. Om användaren väljer att avsluta, då makrot stängs graciöst.

Lägg märke till att det första görs efter ErrHandler etiketten är att kontrollera om Number egenskapen av Err objektet är lika med 18. Om det är, vet du att en avbryt-tangenten trycktes. Om inte, då någon annan typ av fel inträffade, och det bör hanteras på det sätt som är lämpligt för ditt makro.

ExcelTips är din källa för kostnadseffektiv Microsoft Excel utbildning. Detta tips (3021) gäller för Microsoft Excel 97, 2000, 2002, och 2003. Du kan hitta en version av detta tips för menyfliksområdet i Excel (Excel 2007 och senare) här: Avbryta en Macro och behålla kontrollen.