# Visual Basic/Keuze-instructies
## Inleiding keuze-instructies

Een programma wordt altijd sequentieel doorlopen. Dat betekent dat de uitvoering van het programma begint met de eerste instructie, dan de tweede en vervolgens zo door totdat de laatste instructie is uitgevoerd en het programma wordt afgesloten.
In de praktijk is dit natuurlijk niet werkbaar. Vaak moeten we naar aanleiding van een bepaalde voorwaarde verder gaan op de andere plaats in het programma of een bepaald deel herhalen.
In het gewone leven maken we dagelijks gebruik van keuzes, bijvoorbeeld:
of, uitgebreider
In de taal van Visual Basic wordt dit (met de sleutelwoorden vet gedrukt):
De If-instructie kent nog andere vormen, maar die vormen worden apart behandeld.
Als er een keuze wordt gemaakt tussen veel voorwaarden, kan beter de Case-instructie gebruikt worden. Deze wordt behandeld na de If-instructie.

## De If-instructie

De structuur van de If-instructie is:
De eenvoudigste vorm van de If-instructie is:
Voorwaarde is een logische expressie die de waarde True of False oplevert. Als de voorwaarde True is, worden de instructies tussen Then en End If uitgevoerd. Als de voorwaarde False is, wordt verder gegaan met de instructie na End If.
Als er tussen Then en End If slechts één instructie staat, kun je ook de volgende korte versie gebruiken:
Of, verdeeld over drie regels:
Zoals je ziet mag je, als alles op één regel staat, End If weglaten,maar het wordt aangeraden om de tweede vorm te gebruiken omdat dit duidelijker is. De structuur is zo veel beter zichtbaar. Dus beter is om ook in deze situaties End If te gebruiken m duidelijk aan te geven waar de If-instructie eindigt.

## Voorwaarden (logische uitdrukkingen)

Voorwaarden zijn logische expressies die resulteren in een waarde die True of False kan zijn. Voorwaarden kunnen enkelvoudig of samengesteld zijn.
Een voorbeeld van een eenvoudige voorwaarde:
Deze voorwaarde is True als de betreffende persoon meerderjarig is.
Om bijvoorbeeld meerderjarige mannen te selecteren kan de volgende (samengestelde) voorwaarde gebruikt worden:
Een samengestelde voorwaarde bestaat dus uit meerdere enkelvoudige voorwaarden (voor de duidelijkheid liefst tussen haakjes) en de logische operator And, Or of Xor.

### Logische expressies

De voorwaarde in een If-instructie heeft de vorm:
Hierbij kan operand de naam van een variabele zijn, een getal, een string of iets anders dat je wilt vergelijken. Het kan ook de naam van een functie zijn die een bepaalde waarde teruggeeft. Een operand kan ook een voorwaarde zijn (zie hieronder bij samengestelde voorwaarden). Het reultaat van de voorwaarde moet altijd True of False zijn of tot True en False herleidbaar.
Er zijn de volgende operatoren:
| Operator | Betekenis |
| = | is gelijk aan |
| <> | is niet gelijk aan |
| < | is kleiner dan |
| > | is groter dan |
| <= | is kleiner dan of gelijk aan |
| >= | is groter dan of gelijk aan |
Enkele voorbeelden met a = 3 en b = 5:
| Logische uitdrukking | Resultaat |
| a > b | False |
| 2 * a > b | True |
| "Jan" < "Piet" | True |

### Enkelvoudige voorwaarden

Wat hierboven gedemonstreerd is, zijn enkelvoudige voorwaarden. Je vergelijkt een bepaalde waarde met een andere.
Iedere enkelvoudige voorwaarde heeft de vorm:
Het is soms nodig om meerdere enkelvoudige voorwaarden te combineren. Dit noemen we een samengestelde voorwaarde.

### Samengestelde voorwaarden

Een samengestelde voorwaarde bestaat uit meerdere enkelvoudige voorwaarden die gecombineerd worden met logische operatoren. Er zijn drie vormen:
Waar enkelvoudige voorwaarde staat mag ook een samengestelde voorwaarde voorkomen, waardoor er ingewikkelde constructies kunnen ontstaan. Daarom is het goed om samengestelde voorwaarden te voorzien van commentaar, waarin precies wordt uitgelegd wat op welke manier wordt vergeleken. Bij het later aanpassen van een programma is zo'n commentaar vaak van onschatbare waarde.
Er zijn de volgende logische operatoren:
| Not | De waarde van de voorwaarde wordt omgekeerd |
| And | Logische And tussen twee voorwaarden |
| Or | Logische Or tussen twee voorwaarden |
| Xor | Logische Xor tussen twee voorwaarden |
| AndAlso | Logische And, maar de tweede wordt alleen geëvalueerd als de eerste True oplevert |
| OrElse | Logische Or, maar de tweede wordt alleen geëvalueerd als de eerste False oplevert |
Voorbeelden van samengestelde voorwaarden:
In de laatste twee voorbeelden is subsidieToegekend een boolean variabele die de waarde True of False kan hebben.
Onderstaande tabel verduidelijkt het gebruik van de logische operatoren:
| voorwaarde1 | voorwaarde2 | vwd1 And vwd2 | vwd1 Or vwd2 | vwd1 Xor vwd2 |
| True | True | True | True | False |
| True | False | False | True | True |
| False | True | False | True | True |
| False | False | False | False | False |
De operator Not keert de waarde van de voorwaarde om: True wordt False en False wordt True.

## De If-Else-instructie

Vaak is het zo dat er afhankelijk van de keuze twee mogelijkheden zijn, b.v.:
In Visual Basic gebeurt dit als volgt:
De algemene vorm is:
Een instructie in de Then- of Else-tak kan ook weer bestaan uit een If- of If-Else-instructie. Als je deze constructie gebruikt, moet je er goed op letten dat de IF en End If die bij elkaar horen ook even ver zijn ingesprongen. Dit verhoogt de leesbaarheid van het programma.

## Voorbeelden If-instructie

In onderstaand voorbeeld bevat de variabele geslacht de tekst "M" of "V" en de variabele naam de naam van een persoon. Afhankelijk van het geslacht moet de juiste aanspreekvorm gekozen worden.
Stel dat geslacht ook leeg kan zijn of een andere waarde kan bevatten. In dat geval kan onderstaande geneste IF-instructie gebruikt worden:

## AndAlso en OrElse

Deze logische operatoren komen nauwelijks voor.
Het formaat is:
Bij AndAlso wordt de tweede voorwaarde alleen geëvalueerd als de eerste True is. Bij OrElse wordt de tweede voorwaarde alleen geëvalueerd als de eerste voorwaarde False is.
Er is één situatie waarbij deze constructie gebruikt moet worden: als de tweede voorwaarde een functie is die alleen moet worden uitgevoerd als de eerste voorwaarde True resp. False is. Deze situatie zul je dus heel weinig zien en kan meestal ook op een andere manier worden opgelost, b.v. in het geval van AndAlso:

## De Case-instructie

De structuur van de Case-instructie is:
Soms heb je een hele serie If-instructies nodig, b.v. om cijfers om te zetten naar teksten, b.v.:
Voor zo'n reeks instructies kun je ook een Case-instructie gebruiken. Het formaat hiervan is:
Er wordt van boven naar beneden gewerkt. Zodra het programma een Case tegenkomt waarvan expressie True is, worden de bijbehorende instructies tot aan de volgende Case-instructie uitgevoerd. Vervolgens wordt verder gegaan met de instructies volgend op End Select.
Case Else levert altijd True op. Dat betekent dat de instructies erna worden uitgevoerd als geen enkele expressie True oplevert.
Als Case Else niet gebruikt wordt en alle expressies False opleveren, wordt geen enkele instructie uitgevoerd en wordt verder gegaan met de instructie volgend op End Select.
Bovenstaand voorbeeld met If-instructies kan als volgt omgezet met Select Case:
Zoals je ziet is dit veel compacter en leesbaarder dan met If-instructies,.
Bij expressie kun je ook een bereik opgeven, bijvoorbeeld:
Ook kun je meerdere waardes opgeven gescheiden door komma's, bijvoorbeeld:
De expressie achter Select Case moet een resultaat leveren van het type Boolean, Byte, Char, Date, Double, Decimal, Integer, Long, Object, SByte, Short, Single, String, UInteger of UShort. Gebroken getallen zoals Float zijn dus niet toegestaan.

## Voorbeelden Case-instructie

We gaan een console-toepassing maken dat aan de hand van het nummer van de maand en het jaartal het aantal dagen in die maand geeft.
Start Visual Basic en start een nieuw project. Noem het console03. Je krijgt dan het volgende raamwerk te zien.
De gebruiker wordt gevraagd naar een maand en een jaar. Daarna berekent het programma het aantal dagen in de opgegeven maand en jaar. Het jaartal is nodig om rekening te houden met schrikkeljaren. Dit voorbeeld is heel eenvoudig gehouden: als het jaartal deelbaar is door 4, is het een schrikkeljaar.
Wijzig het raamwerk zodat het als volgt uitziet:
Afhankelijk van het maandnummer wordt het aantal dagen op 30 of 31 gezet, met uitzondering van februari (maand 2). Daar wordt eerst gekeken of het een schrikkeljaar is (jaarnr Mod 4 is dan gelijk aan 0). Afhankelijk van de uitkomst wordt het aantal dagen op 28 of 29 bepaald.
Als je als maandnummer 13 opgeeft, zie je geen aantal dagen. Dat komt omdat geen enkele Case-conditie True is, waardoor geen enkele instructie wordt uitgevoerd en de variabele aantalDagen leeg blijft.
In een "echt" programma moet je natuurlijk eerst testen of het maandnummer numeriek is en in het bereik 1 t/m 12 ligt en dat het jaartal 1 t/m b.v. 2100 is.
Het maandnummer kun je gemakkelijk controleren. Pas het programma zodanig aan dat het gelijk is aan onderstaand programma:
Nu wordt de variabele uitvoer eerst gevuld met de vaste tekst en in de Case-instructie aangevuld met het juiste aantal dagen. Als het aantal dagen niet klopt, wordt in de End Select de variabele uitvoer overschreven met de tekst "Fout: het maandnummer klopt niet !!!"