søndag den 13. november 2016

Hvad nu hvis?

Programkontrol er noget af det centrale i al programmering. Programmet skal gerne udføre handlinger afhængigt af forskellige betingelser. Betingelserne kan være noget brugeren indtaster, noget der opstår som følge af tid, eller noget der kommer fra data. Under alle omstændigheder er det altid noget vi kan måle og veje.

IF-sætning

Den mest brugte måde at styre programmet på, er med IF-sætninger. If...then...else. HVIS en bestemt betingelse er opfyldt SÅ skal der ske noget bestemt ELLERS skal der ske noget andet.

If betingelse=true Then
  programudtryk
[ElseIf betingelse=true Then]
  programudtryk
[Else]
  programudtryk
End If


  • Betingelsen skal altid resultere i en boolean (True/False).
  • Programudtryk er et stykke program som skal udføres.
Det er et krav at blokken starter med IF og slutter med END IF, men der behøver ikke være andet end en enkelt betingelse og et enkelt programudtryk. Resten er valgfrit, men jeg vil anbefale altid at anvende en ELSE-blok, bare for at være sikker på at tage hånd om fejl og undtagelser.

Et eksempel:

If x < 0 Then
  MsgBox "Tallet er negativt"
ElseIf x > 0 Then
  MsgBox "Tallet er positivt"
Else
  MsgBox "Tallet er nul"
End If


Det er muligt at indbygge IF-sætninger i IF-sætninger, hvilket ikke er usædvanligt at se.

If...Then...Else ses også ofte brugt som manuel fejlhåndtering, f.eks. til at kontrollere for helt konkrete fejlsituationer. Men det er en helt anden historie.

IIF-sætning

En mere simpel løsning er en IIF-sætning:

IIf (betingelse, SandUdtryk, FalskUdtryk)

Eksempel:

hoejeste_alder = IIf(johns_alder > peters_alder, johns_alder, peters_alder)

Samme blok kunne vi have skrevet med en IF-sætning sådan:

If johns_alder > peters_alder Then
  hoejeste_alder= johns_alder
Else
  hoejeste_alder= peters_alder
End If


IIF-sætningen egner sig bedst til små og korte betingelses-blokke.

CHOOSE-sætning

Choose-sætningen giver dig muighed for at vælge fra en liste, baseret på et indeks.

Choose (Indeks, Valg_1[, Valg_2, ... [,Valg__n]])

Hvis Indeks er 1 returneres Valg_1, hvis Indeks er 2 returneres Vlag_2 osv.

FOR...NEXT-loop

Denne funktion gentager en blok et bestemt antal gange.

For taeller=start To slut [Step trin]
  programudtryk
  [Exit For]
  programudtryk
Next [taeller]


Det er muligt at angive hvordan loopet skal tælle ("Step trin"), men denne parameter udelades ofte, hvilket også gør sig gældende for "Exit For".

Et eksempel:

  For n = LBound(oPrinter) To UBound(oPrinter)
    sMsg = sMsg + oPrinter(n).Name + Chr(13)
  Next n


I eksemplet herover bruger vi UBound(...) som aflutning, hvilket er særdeles praktisk. UBound angiver øvre grænse eller største indeksværdi i et array. På den måde kan for..next bruges til at gennemløbe et array trin for trin.

I min tidligere artikel om årskalender bruger jeg for...next loop rigtig meget: http://libreofficedk.blogspot.dk/2016/10/regneark-i-calc-arskalender.html


DO WHILE loop

Så længe en betingelse er opfyldt, fortsæt med at udføre ...

Do While betingelse
  programudtryk
Loop


Alternativ syntakt:
Indtil en betingelse er opfyldt, fortsæt med at udføre ...

Do Until betingelse
  programudtryk
Loop


Et eksempel fra min artikel om fortløbende nummerering:

Do While NOT EOF(n)          
    Input #n, s                
    If result="" then
        result = s
    Else
        result = result + chr(13) + s
    end if
Loop


Hele artiklen kan læses her: https://libreofficedk.blogspot.dk/2016/11/fortlbende-nummerering-fortsat_8.html

Vær meget opmærksom på at Do...While...Loop er lidt farlig, fordi den kan ende med et af enhver programmørs værste mareridt, nemlig et endeløst loop. Du skal være 100% sikker på at du faktsik når frem til betingelsen. Ellers vil din makro fortsætte uendeligt (eller til en bruger vælger at afbryde den).

SELECT...CASE-sætning

Vælg fra en liste baseret på et valg.

Syntaks:

Select Case betingelses_udtryk
  Case tilfælde_1
    programudtryk_1
  Case tilfælde_2
    programudtryk_2
  Case Else
    programudtryk_3
End Select


Select...Case bruges ofte i tilfælde, hvor antallet af valgmuligheder er fastlagt af omstændighederne. Et godt eksempel er ugedagene, som der er syv af, og det er temmelig fastsat på forhånd.

Funktionen Weekday(dato) returnerer et heltal mellem 1 og 7, hvor 1 er søndag.

    Select Case WeekDay( Now )
        Case 1
            sDay="Søndag"
        Case 2
            sDay="Mandag"
        Case 3
            sDay="Tirsdag"
        Case 4
            sDay="Onsdag"
        Case 5
            sDay="Torsdag"
        Case 6
            sDay="Fredag"
        Case 7
            sDay="Lørdag"
    End Select
    Msgbox sDay,64,"I dag er det"