VBA išėjimas iš antrinio | Išeikite iš VBA subprocedūros, jei nesilaikoma sąlygų

„Excel VBA Exit Sub“ procedūra

„Exit Sub“ sakinys baigia antrinę procedūrą anksčiau nei apibrėžtos VBA kodų eilutės. Tačiau norėdami išeiti iš subprocedūros turime taikyti tam tikrą loginį testą.

Sukonstruokime tai paprastai.

 Sub MacroName () '...' Kažkas kodas čia '... Exit Sub' Išeikite iš Sub, nevykdydami tolesnių kodo eilučių žemiau '...' Šis kodas bus ignoruojamas '... End Sub 

Pavyzdžiai

Šį „VBA Exit Sub Excel“ šabloną galite atsisiųsti čia - „VBA Exit Sub Excel“ šablonas

1 pavyzdys

Geresnio pavyzdžio ieškokite žemiau esančiame kode.

Kodas:

 Sub Exit_Example1 () Dim k As Long For k = 1–10 langelių (k, 1). Vertė = k Kitas k End Sub 

Aukščiau nurodytu kodu į A1 - A10 langelius bus įterpti serijos numeriai nuo 1 iki 10.

Dabar noriu įterpti tik 5 serijos numerius ir kai tik kintamojo „k“ reikšmė taps 6, noriu išeiti iš antrinio.

Tam turėsiu pridėti loginį testą programoje „Excel“, jei IF k = 6, tada išeikite iš sub .

Kodas:

 Sub Exit_Example1 () Dim k As Long For k = 1-10 Jei k = 6, tada Exit Sub 'Kai tik k reikšmė taps 6, ji nepaisys visų kodų ir išeis iš langelių (k, 1). Vertė = k Kitas k End Sub 

Dabar paleiskite kodą eilutėje. Norėdami pradėti procesą, paspauskite klavišą F8.

Nuo šiol k reikšmė lygi nuliui.

Norėdami pakeisti k reikšmę į 1, dar kartą paspauskite klavišą F8.

Taigi k vertė yra 1, o mūsų kodas nuolat veikia ir įterpia 1 į langelį A1. Panaikinkite tai, kol k reikšmė taps 6.

Dabar k reikšmė yra 6, o kodo eilutė ketina atlikti loginį bandymą, kad išeitumėte iš antrinės procedūros. Jei dar kartą paspausiu F8 klavišą, jis tiesiai išeis tik iš visos antrinės procedūros.

Kaip matome, jis paryškino žodį „Exit Sub“ . Paspaudus klavišą F8, jis išeis iš antrinės procedūros, nenueidamas į žodį „End Sub“ .

2 pavyzdys - dėl klaidos išeikite iš antrinio proceso

Mes taip pat galime išeiti iš antrinės procedūros, kai gausime klaidų reikšmes. Pvz., Apsvarstykite toliau nurodytus duomenis, kaip padalinti skaičių1 iš skaičiaus 2.

Žemiau yra kodas, norint gauti dviejų skaičių padalijimą.

Kodas:

 Sub Exit_Example2 () Dim k As Long For k = 2–9 ląstelės (k, 3). Vertė = ląstelės (k, 1). Vertė / langeliai (k, 2). Vertė Kitas k End Sub 

Kaip žinome, negalime nė vieno skaičiaus padalyti iš nulio. Taigi, jei bandysime tai padaryti, gausime klaidą kaip „Vykdymo laiko klaida“ 11: dalijimas pagal nulį.

Norėdami to išvengti, kai tik aptiksime kokių nors klaidų, paminėsiu savo makrokomandą, kad išeikčiau iš subprocedūros nedelsiant. Žemiau pateiktas kodas yra vienas iš tokių atvejų.

Kodas:

 Sub Exit_Example2 () Dim k As Long For k = 2 - 9 On Error GoTo ErrorHandler Cells (k, 3). Value = Cells (k, 1). Value / Cells (k, 2). Next value k ErrorHandler: Exit Sub Pabaigos antr 

Pirmiau pateiktame pavyzdyje paminėjau teiginį „On Error Goto ErrorHandler“. Čia žodis ErrorHandler yra mano priskirta etiketė. Jei matote kodo apačioje, aš paminėjau etiketę kaip

„ErrorHandler“: išeikite iš sub 

Taigi, kai tik kodas susidurs su klaida, jis paspaus kodą, kad pereitų prie etiketės, o etiketėje yra sakinys „Exit Sub“, todėl jis išeis iš antrinės procedūros.

Dabar aš paleisiu kodą, jis apskaičiuos padalijimą, kol ras klaidą.

Kaip matote langelyje C7, įvyko klaida kaip „Padalijimas pagal nulį“, todėl jis išėjo iš antrinės procedūros. Neinformuoti vartotojo, išeinančio iš antrinės procedūros, visada yra pavojingas dalykas. Norėdami informuoti vartotoją apie klaidą, galime įtraukti vieną mažą pranešimų laukelį.

Kodas:

 Sub Exit_Example2 () Dim k As Long For k = 2 - 9 On Error GoTo ErrorHandler Cells (k, 3). Value = Cells (k, 1). Value / Cells (k, 2). Value Next k ErrorHandler: MsgBox " Įvyko klaida ir klaida: "& vbNewLine & Err.Description Exit Sub End Sub Sub 

Aukščiau pateiktas kodas parodys klaidos pranešimą, tada išeikite iš antrinės procedūros. Vykdant kodą, jei įvyksta klaida, jis rodys pranešimų laukelį VBA, kaip nurodyta toliau.

Tai labiau patikimas būdas atsisakyti antrinės procedūros.


$config[zx-auto] not found$config[zx-overlay] not found