6 . Schrijf een race programma (zie Flash movie hiernaast). Op het scherm verschijnen 3 rechthoeken in verschillende kleur. Iedere rechthoek groeit op toevallige wijze. Wie eerst de finish haalt (aangegeven met de zwarte balk), is gewonnen. Deze oefening borduurt verder op het voorbeeld uit het handboek (blz 99-101).

Analyse van de opgave: Het programma start met het tonen van de 'deelnemers' (balkjes). Daarna verschijnt het startsein. Het programma stopt als één van de deelnemers de finish heeft bereikt. De andere deelnemers blijven dan 'ter plaatse' hangen.

De balkjes zijn eigenlijk AutoVormen (we hadden ook cellen van het rekenblad kunnen gebruiken; zie uitbreiding). Het 'groeien' van de rechthoeken wordt gerealiseerd door de eigenschap Width in te stellen. Hiertoe tellen we steeds een willekeurig getal bij de reeds bestaande breedte van de rechthoek. Een willekeurig getal kan gegenereerd worden door de Rnd-functie van Excel VBA. Deze functie geeft echter een willekeurig getal 0 <= x < 1. In de Help-file staat de formule om een willekeurig getal tussen een onder- en bovengrens te genereren: Int((bovengrens - benedengrens + 1) * Rnd + benedengrens). De bovengrens wordt in de oplossing 'speed' genoemd, omdat het de snelheid aangeeft waarmee de balkjes groeien. Doordat de meeste huidige PC's erg snel zijn dient er ook een wachtroutine ingebouwd te worden. Anders is de race in een mum van tijd voorbij. Hiertoe is het voorbeeld van blz 82 van het handboek genomen.

Oplossing :

Het algoritme/PSD van dit programma is vrij eenvoudig. Bij de implementatie in Excel VBA zult u een aantal moeilijkheden tegenkomen. In het PSD gebruiken we de notatie met de dot-operator om eigenschappen van objecten te lezen en in te stellen. Zo stelt de instructie a.width ¬ 10 de breedte van het rechthoekje a in op 10 pixels. Omgekeerd, w ¬ a.width leest de breedte van het rechthoekje a in de variabele w.

De procedure 'maakBalk' verbergt de implementatie van de creatie van een AutoVorm. De procedure aanvaardt 5 parameters: de positie (x,y), de afmetingen (b,h) en de kleur. In Excel VBA zal dit uiteraard nog verder uitgewerkt moeten worden. De code volgt hieronder.

Option Explicit

Sub race()
  Dim a As Shape, b As Shape, c As Shape, d As Shape
  Dim x As Single, y As Single, breedte As Single, hoogte As Single
  Dim speed As Byte, einde As Integer, kleur As Byte
  
  x = 20:  y = 15:  breedte = 5:  hoogte = 10
  speed = 10: einde = 150: kleur = 1
  
  Set a = maakBalk(x, y, breedte, hoogte, kleur)
  Set b = maakBalk(x, y + 2 * hoogte, breedte, hoogte, kleur + 1)
  Set c = maakBalk(x, y + 4 * hoogte, breedte, hoogte, kleur + 2)
  Set d = maakBalk(x, y + 7 * hoogte, einde, hoogte, kleur + 3)
    
  MsgBox "3-2-1 - Go!"
  
  Do While a.Width <= einde And b.Width <= einde And c.Width <= einde
    
    a.Width = a.Width + willek_getal(speed)
    b.Width = b.Width + willek_getal(speed)
    c.Width = c.Width + willek_getal(speed)
    Application.ScreenUpdating = True

    Call wachten(1)
 Loop
End Sub

Function maakBalk(ByVal l As Single, ByVal t As Single, ByVal w As Single, h As Single, k As Byte) As Shape
  Dim temp As Shape
  Set temp = ActiveSheet.Shapes.AddShape(msoShapeRectangle, l, t, w, h)
  Select Case k
    Case 1: temp.Fill.ForeColor.RGB = vbRed
    Case 2: temp.Fill.ForeColor.RGB = vbGreen
    Case 3: temp.Fill.ForeColor.RGB = vbBlue
    Case 4: temp.Fill.ForeColor.RGB = vbBlack
  End Select
  Set maakBalk = temp
End Function

Function willek_getal(s As Byte) As Byte
  willek_getal = Int(s * Rnd)
End Function

Sub wachten(t As Integer)
  Dim w As Long
  Const type_computer = 1000000
  For w = 1 To t * type_computer
  Next w
End Sub

De instructie Application.ScreenUpdating = True is nodig om het scherm te laten verversen. Doordat deze schermverversing meestal erg tijdsintensief is, zal Excel VBA deze taak uitbesteden aan het besturingssysteem en verder gaan in de verwerking. Dit betekent dat de macro soms al kan afgelopen zijn als de eerste schermhertekening pas afgewerkt is. Met deze screenUpdating zorgt de macro ervoor dat de schermverversing uitdrukkelijk gebeurt en wacht de macro op de uitvoering ervan.

Uitbreiding

In plaats van met AutoVormen te werken kan men ook cellen kleuren van het werkblad.Dit geeft wel de bijkomende implicatie dat de macro moet bijhouden hoeveel cellen van iedere deelnemer reeds gekleurd zijn.

Op het einde van de macro zou de winnaar kunnen bekend gemaakt worden. Hiervoor is een bijkomende test nodig. De parameters 'speed' en 'einde' zouden kunnen opgevraagd worden bij de gebruiker, evenals de wachttijd.

Ook het aantal deelnemers zou variabel kunnen gemaakt worden. Dit veronderstelt echter wat meer aanpassingswerk.

©  H. Schouppe
Laatste wijziging: 2004-05-12