Näkemäsi käännösvirhe osoittaa, että Else- (tai ElseIf-) avainsanaa ei ole edeltänyt asianmukainen If-lauseke.

Kääntäjä löysi Else-lausekkeen (jonka se korostaa käyttäjälle) näkemättä If-lauseketta sen yläpuolella olevilla rivillä. Tämä on virhe, koska se rikkoo If-Then-Else-lauseen oikeaa syntaksia. Oikea syntaksi on seuraava:

Käytetään if-lauseen lyhennettyä syntaksia, jossa määritetään ehto ja toiminta (kun ehto täyttyy):

If Then

Käyttääksesi If-lauseen vakiosyntaksia, jossa määritetään ehto ja toiminto (kun ehto täyttyy) sekä vaihtoehtoinen toiminto, kun ehto ei täyty:

If Then

Else

.

End if

Useamman kuin yhden ehdon (ja niiden toimien) määrittämiseen:

Jos Silloin

ElseJos Silloin

Else

.

End if

Kääntämisvirhe ”Else Without If” ilmenee, kun ”If Then ” puuttuu tai on kirjoitettu väärin. Keskustellaan seuraavassa tarkemmin virheen yleisimmistä syistä esimerkkien avulla.

Puuttuva If-lause

Kun VBA-kääntäjä näkee, että Else-avainsanaa ei edeltää tunnistettava (oikea) If-lause, se tuottaa virheen ”Else ilman If”. Jokaista Else-lausetta varten on oltava If-lause. Jokaista If-lausetta varten ei kuitenkaan välttämättä tarvita else-lausetta.

Esimerkki 1: Puuttuva If-lauseke

Tässä esimerkissä näytetään syöttölaatikko, joka ottaa käyttäjän syötteen ja tallentaa sen arvoon x. Tämän jälkeen törmäämme Else-avainsanaan, mutta sitä edeltävää If-lausetta ei ollut. Tämä todellakin aiheuttaa kääntäjän virheen: Else Without If.

Tämän ongelman ratkaisemiseksi meidän tarvitsee vain lisätä If-lause. If-lause koostuu If Then.

Hyvien sisennyskäytäntöjen noudattaminen on ratkaisevaa, jotta voidaan tunnistaa, koostuuko kukin If-Else-Then-logiikka tarvittavista avainsanoista (If-lauseen lausekkeesta, Else-avainsanasta, End If-avainsanasta).

Jos Silloin

Else

Jos Silloin

Else

Loppu Jos

Loppu Jos

Esimerkki 2: Else-lause on silmukan sisällä ja If-lause sen ulkopuolella

Saatat yllättyä siitä, että saat virheen, kun If-lause on jo olemassa koodissa ja sijoitettu ennen Else-avainsanaa ja kirjoitettu oikein. Ongelma ei ehkä näy ensi silmäyksellä. Mutta jos tarkastelemme asiaa tarkemmin, huomaamme, että If-lausekkeen laajuus on erilainen kuin else-lausekkeen.

Kaikki If-lausekkeen ja End If -avainsanan välissä oleva kuuluu tämän If-lausekkeen laajuuteen. Koodissa voi olla myös muita laajuuksia johtuen silmukoiden, kuten For Next -silmukan, Do Until -silmukan tai For Each Next -silmukan olemassaolosta.

Laajuus on olemassa silloin, kun looginen lauseke vaatii useita avainsanoja osoittamaan lausekkeen alku- ja loppupistettä. Ongelma syntyy, jos päällekkäisiä laajuuksia käytetään siten, että yksi sijoittuu osittain toisen sisälle. Oikea tapa saada useat laajuudet toimimaan keskenään on, että yksi sijoittuu kokonaan toisen sisälle.

Oheisessa esimerkissä If Then seuraa For silmukan alku, jota seuraa Else avainsana. Tämä erottaa If-lausekkeen ja Else-avainsanan toisistaan ja aiheuttaa virheen näkymisen.

Sub Else_Without_If()x = InputBox("Aseta x arvo")'if-lausekkeen aloitus scopeIf x = 1 Then MsgBox "x arvo on yhtä suuri kuin 1" 'uuden scope-lausekkeen aloitus (For Next-silmukka) For R = 1 To 5'Else-avainsana erotetaan If-lausekkeestaan, koska se on eri scope-lausekkeessa.Else Next R MsgBox "x:n arvo ei ole yhtä suuri kuin 1 "End IfEnd Sub

Korjataksemme ongelman varmistamme, että If-logiikkalauseke kokonaisuudessaan sisältyy kokonaan For-silmukkaan. Tai For-silmukka on täysin If-logisen lausekkeen sisällä Toiminta; Ifin ja Elsen välissä tai Elsen ja End Ifin välissä.

Yleissääntönä voidaan todeta, että jos koodin osalla on jokin tila, joka johtuu siitä, että sillä on alku- ja loppupiste (If-Else, Else-End If, For-Next, Do-Kypsä, Do-Milloin), et voi aloittaa toista osuuttaan (laajuuttaan) sen sisältä ilman, että lopetat sen ensimmäiseen osaan.

Aloituskohta (If, Else, For, Do)

Toinen aloituskohta

Tee jotain

Toinen lopetuskohta

Lopetuskohta (Else, End If, Next, Until)

Soveltaaksemme tätä esimerkkiin muutamme sen seuraavaksi koodiksi;

Sub Else_Without_If()x = InputBox("Aseta x:n arvo")'aloitetaan if-lause scopeIf x = 1 Then MsgBox "x:n arvo on yhtä suuri kuin 1" 'aloitetaan uusi scope (For Next-silmukka) For R = 1 To 5 MsgBox "x". value is equal to 1" 'uuden laajuuden lopettaminen samassa laajuudessa, jossa se aloitettiin Next RElse MsgBox "x value is not equal to 1 "End IfEnd Sub

Virheellinen If-lause

Esimerkki 3: Toiminnon sijoittaminen samalle riville If-lauseen kanssa

Toinen hyvin yleinen virhe, joka usein tehdään, on If-lauseen kirjoittaminen tavalla, joka ei ole yhteensopiva Else-avainsanan hyödyntämisen kanssa.

Jos haluamme käyttää Else-avainsanaa, meidän on sijoitettava If-Then-Else-logiikan toimintaosa seuraavalle riville if-lauseen jälkeen. Jos emme käytä Else-avainsanaa, voimme sijoittaa toiminnon samalle riville If-lauseen kanssa emmekä kirjoita Else-avainsanaa tai End If-avainsanaa.

Kun toiminto (joka on suoritettava, jos ehto on tosi) sijoitetaan samalle riville If-lauseen kanssa, If-lauseen katsotaan olevan valmis. Tätä pidetään lyhennettynä tapana kirjoittaa If – then -logiikka.

Sentähden kun kääntäjä kohtaa sen jälkeen Else-avainsanan, se ei löydä Else-avainsanaan kuuluvaa If-lausetta, koska kyseinen If-lauseke on saatettu loppuun sijoittamalla toiminta samalle riville kuin If-lauseke. Seuraava koodi EI ole oikein ja aiheuttaa kääntäjän virheen:

Toiminto (MsgBox "x:n arvo on yhtä suuri kuin 1") on sijoitettava seuraavalle riville If-lauseen jälkeen, jotta If-Then-Else-logiikassa voidaan käyttää Else-lause. Seuraavassa koodissa olemme siirtäneet action-lauseen seuraavalle riville, mikä korjaa ongelman.

Olemme nyt käsitelleet kaikki mahdolliset kääntämisvirheen syyt: Else ilman if. Yhteenvetona: jos saat tämän virheen, tarkista, onko

1) Paikalla on If-lause, joka edeltää Else-avainsanaa.

2) If-lauseen rivi ei sisällä mitään muuta kuin If Then.

3) Tarkista, että If-lauseen ja Else-avainsanan välissä ei ole toista soveltamisalaa tai -aluetta, kuten silmukoita.

Katsokaa myös: Kuinka korjata ”End If ilman lohkon If”-virhe

Vastaa

Sähköpostiosoitettasi ei julkaista.