[VBA] Scorebord bijhouden in Powerpoint met VBA en macro's

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Gotenks1990
  • Registratie: Februari 2012
  • Laatst online: 08-04 17:31
Ik ben bezig met in Powerpoint een groepsquiz te maken dat bij leerlingen met een beperking specifieke vaardigheden moet testen, dit is in functie van mijn werk. Het scorebord (zie de afbeelding hieronder) staat geplaatst op alle slides en bestaat uit 5 groepen, gaande van groep 1 t.e.m. groep 5. Qua opmaak is er niet veel aan: iedere groep heeft 1 textbox (txtGroep1, txtGroep2, ...) en 2 rechthoekjes waaraan elk een macro is gekoppel (bv. Groep1Plus, Groep2Plus, Groep1Min, Groep2Min, ...).

Afbeeldingslocatie: https://s31.postimg.org/6v1t6zkg7/scorebord.jpg

Als er bij bv. groep 1 op '+1' gedrukt wordt, wordt macro Groep1Plus aangesproken om de score op te tellen met +1 en de score te tonen in de textbox txtGroep1. Idem ditto voor -1. De scores moeten getoond worden doorheen de hele presentatie.

Ik dacht dat het een simpele macro was (gewoon optellen/aftrekken en waarde tonen), maar ik krijg de score niet meer getoond in de textboxen. Toegegeven, ik ben nogal roestig geworden wat betreft VBA. Hierbij de code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Static scoreGroep1 As Integer
Static scoreGroep2 As Integer
Static scoreGroep3 As Integer
Static scoreGroep4 As Integer
Static scoreGroep5 As Integer

Sub StartQuiz()
    ' Reset de score naar 0
    scoreGroep1 = 0
    scoreGroep2 = 0
    scoreGroep3 = 0
    scoreGroep4 = 0
    scoreGroep5 = 0
End Sub

Sub Groep1Plus()
    scoreGroep1 = scoreGroep1 + 1
    Me.txtGroep1.Text = scoreGroep1
End Sub

Sub Groep1Min()
    scoreGroep1 = scoreGroep1 - 1
    Me.txtGroep1 = scoreGroep1
End Sub

Sub Groep2Plus()
    scoreGroep2 = scoreGroep2 + 1
    Me.txtGroep2.Text = scoreGroep2
End Sub

Sub Groep2Min()
    scoreGroep2 = scoreGroep2 - 1
    Me.txtGroep2 = scoreGroep2
End Sub

Sub Groep3Plus()
    scoreGroep3 = scoreGroep3 + 1
    Me.txtGroep3.Text = scoreGroep3
End Sub

Sub Groep3Min()
    scoreGroep3 = scoreGroep3 - 1
    Me.txtGroep3 = scoreGroep3
End Sub

Sub Groep4Plus()
    scoreGroep4 = scoreGroep4 + 1
    Me.txtGroep4.Text = scoreGroep4
End Sub

Sub Groep4Min()
    scoreGroep4 = scoreGroep4 - 1
    Me.txtGroep4 = scoreGroep4
End Sub

Sub Groep5Plus()
    scoreGroep5 = scoreGroep5 + 1
    Me.txtGroep5.Text = scoreGroep5
End Sub

Sub Groep5Min()
    scoreGroep5 = scoreGroep5 - 1
    Me.txtGroep5 = scoreGroep5
End Sub


Ik heb de "Me.txtGroep1.Text = scoreGroep1" ook al vervangen door "ActivePresentation.Slides(3).Shapes("txtGroep1").TextFrame.TextRange.Text = scoreGroep1", maar ook zonder resultaat.

Iemand die ziet wat ik over het hoofd zie?

Thanks!

Beste antwoord (via Gotenks1990 op 24-06-2016 18:31)


  • nescafe
  • Registratie: Januari 2001
  • Nu online
Tja duidelijker dan hiervoor kan ik het niet uitleggen..

Afbeeldingslocatie: http://content.screencast.com/users/nescafe2002/folders/Default/media/82dcb925-01d8-4f15-9492-896f37702262/06.23.2016-22.10.png

Afbeeldingslocatie: http://content.screencast.com/users/nescafe2002/folders/Default/media/c6d768cb-ca9b-4155-bc20-095c0d1959a8/06.23.2016-22.11.png

Afbeeldingslocatie: http://content.screencast.com/users/nescafe2002/folders/Default/media/7395c511-5908-4caa-bdb8-ab7b984b2ee9/06.23.2016-22.12.png

Screencast in GIF-formaat (4MB!)

Wellicht dat de modulenaam iets afwijkt (in dit voorbeeld Module1, in mijn eerdere voorbeeld Scores)?

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans

Alle reacties


Acties:
  • 0 Henk 'm!

  • nescafe
  • Registratie: Januari 2001
  • Nu online
VBA is standaard nogal laks in foutdetectie (bijv. de missende .Text property in alle Min()-functies wordt nu niet kenbaar gemaakt).

Plaats eens Option Explicit bovenin je sub module en ga vervolgens naar Foutopsporing > Compileren.
Krijg je nu al meer info?

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


Acties:
  • 0 Henk 'm!

  • vdws
  • Registratie: December 2010
  • Laatst online: 10-09 20:58
Komt het niet door de static? Waarom niet "Dim scoreGroep1 As Integer" gebruiken?

Acties:
  • 0 Henk 'm!

  • Gotenks1990
  • Registratie: Februari 2012
  • Laatst online: 08-04 17:31
nescafe schreef op maandag 20 juni 2016 @ 12:47:
VBA is standaard nogal laks in foutdetectie (bijv. de missende .Text property in alle Min()-functies wordt nu niet kenbaar gemaakt).

Plaats eens Option Explicit bovenin je sub module en ga vervolgens naar Foutopsporing > Compileren.
Krijg je nu al meer info?
Bedankt hiervoor, handige tip! Nu krijg ik tenminste te zien dat de foutmelding zegt dat er een ongeldig gebruik is van het sleutelwoord Me. Ik dacht dat je in VBA altijd Me... moest gebruiken om zo het tekstveld te benaderen binnen de hele presentatie? Blijkbaar werkt het niet als het gebruikt wordt in een module...

Hoe moet ik er dan voor zorgen dat de score steeds in het betreffende tekstveld getoond moet worden?
vdws schreef op maandag 20 juni 2016 @ 13:36:
Komt het niet door de static? Waarom niet "Dim scoreGroep1 As Integer" gebruiken?
Ik wil de variabelen graag als globale variabelen gebruiken, zodat deze in alle functies benaderd kunnen worden. Het schoot me er juist in dat het 'public' moet zijn i.p.v. 'static' om dit te bereiken.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-10 14:49
Gotenks1990 schreef op maandag 20 juni 2016 @ 16:02:
[...]

Bedankt hiervoor, handige tip! Nu krijg ik tenminste te zien dat de foutmelding zegt dat er een ongeldig gebruik is van het sleutelwoord Me. Ik dacht dat je in VBA altijd Me... moest gebruiken om zo het tekstveld te benaderen binnen de hele presentatie? Blijkbaar werkt het niet als het gebruikt wordt in een module...
"Me" is als "this" en werkt alleen als er sprake is van een "current object". Per definitie is dat in een module niet het geval (per slot van rekening kun je een module niet instantieren) , en in bijvoorbeeld een class wel.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • nescafe
  • Registratie: Januari 2001
  • Nu online
Gotenks1990 schreef op maandag 20 juni 2016 @ 16:02:
[...]

Hoe moet ik er dan voor zorgen dat de score steeds in het betreffende tekstveld getoond moet worden?
Volgens mij wordt er door PP al per slide een class aangemaakt.
Als je je code verhuist naar die class zou het al goed moeten gaan ("Me" is dan de instantie van de slide)

class Slide3:
code:
1
2
3
4
5
6
Option Explicit

Sub Groep1Plus()
    Scores.scoreGroep1 = Scores.scoreGroep1 + 1
    Me.txtGroep1.Text = Scores.scoreGroep1
End Sub


Omdat je de scores over de verschillende slides wilt kunnen benaderen kun je deze declareren in een eigen module:

module Scores:
code:
1
2
3
Option Explicit

Public scoreGroep1 As Integer

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


Acties:
  • 0 Henk 'm!

  • Gotenks1990
  • Registratie: Februari 2012
  • Laatst online: 08-04 17:31
nescafe schreef op maandag 20 juni 2016 @ 20:15:
[...]


Volgens mij wordt er door PP al per slide een class aangemaakt.
Als je je code verhuist naar die class zou het al goed moeten gaan ("Me" is dan de instantie van de slide)

class Slide3:
code:
1
2
3
4
5
6
Option Explicit

Sub Groep1Plus()
    Scores.scoreGroep1 = Scores.scoreGroep1 + 1
    Me.txtGroep1.Text = Scores.scoreGroep1
End Sub


Omdat je de scores over de verschillende slides wilt kunnen benaderen kun je deze declareren in een eigen module:

module Scores:
code:
1
2
3
Option Explicit

Public scoreGroep1 As Integer
Bedankt Nescafe, dit helpt me al een eind verder! Hierdoor werken het op- en aftellen van de waarden en krijg ik de waarde van de variabele nu te zien op de slide waar ik dit doe. Het enige probleem dat nu nog resteert is dat als ik op slide 1 de waardes verander, op de overige slides gewoon 0 blijft staan en dus niet mee worden overgenomen.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-10 14:49
Gotenks1990 schreef op woensdag 22 juni 2016 @ 09:11:
[...]

Bedankt Nescafe, dit helpt me al een eind verder! Hierdoor werken het op- en aftellen van de waarden en krijg ik de waarde van de variabele nu te zien op de slide waar ik dit doe. Het enige probleem dat nu nog resteert is dat als ik op slide 1 de waardes verander, op de overige slides gewoon 0 blijft staan en dus niet mee worden overgenomen.
Als de variabelen zelf wel hun waarde behouden, door ze static te maken in een module bijvoorbeeld, kan het zijn dat je bij het laden van de slide je velden moet updaten.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • nescafe
  • Registratie: Januari 2001
  • Nu online
Ik zie zo 1-2-3 geen Slide.Activate event waarin je de controls kunt bijwerken met de actuele waarden, maar je kunt natuurlijk wel controls in meerdere slides tegelijkertijd updaten.

Slide1 / Slide2 / Slide3:
code:
1
2
3
4
5
Option Explicit

Sub Groep1Plus()
    Call Scores.Groep1Plus()
End Sub


Scores:
code:
1
2
3
4
5
6
7
8
9
10
Option Explicit

Public scoreGroep1 As Integer

Public Sub Groep1Plus()
    scoreGroep1 = scoreGroep1 + 1
    Slide1.txtGroep1.Text = scoreGroep1
    Slide2.txtGroep1.Text = scoreGroep1
    Slide3.txtGroep1.Text = scoreGroep1
End Sub

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


Acties:
  • 0 Henk 'm!

  • Gotenks1990
  • Registratie: Februari 2012
  • Laatst online: 08-04 17:31
nescafe schreef op woensdag 22 juni 2016 @ 15:55:
Ik zie zo 1-2-3 geen Slide.Activate event waarin je de controls kunt bijwerken met de actuele waarden, maar je kunt natuurlijk wel controls in meerdere slides tegelijkertijd updaten.

Slide1 / Slide2 / Slide3:
code:
1
2
3
4
5
Option Explicit

Sub Groep1Plus()
    Call Scores.Groep1Plus()
End Sub


Scores:
code:
1
2
3
4
5
6
7
8
9
10
Option Explicit

Public scoreGroep1 As Integer

Public Sub Groep1Plus()
    scoreGroep1 = scoreGroep1 + 1
    Slide1.txtGroep1.Text = scoreGroep1
    Slide2.txtGroep1.Text = scoreGroep1
    Slide3.txtGroep1.Text = scoreGroep1
End Sub
Geprobeerd, maar dan heb ik het probleem dat het niets meer doet...
Ik zal het documentje even uploaden, dan kun je er ook eens zelf in sleutelen, dat is misschien iets makkelijker :) Ik probeer er ook nog aan verder te klommelen.

EDIT: Bestandje is via deze link te downloaden tot 30 juni 2016: https://we.tl/8H3Nxp3h2X

Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • nescafe
  • Registratie: Januari 2001
  • Nu online
Tja duidelijker dan hiervoor kan ik het niet uitleggen..

Afbeeldingslocatie: http://content.screencast.com/users/nescafe2002/folders/Default/media/82dcb925-01d8-4f15-9492-896f37702262/06.23.2016-22.10.png

Afbeeldingslocatie: http://content.screencast.com/users/nescafe2002/folders/Default/media/c6d768cb-ca9b-4155-bc20-095c0d1959a8/06.23.2016-22.11.png

Afbeeldingslocatie: http://content.screencast.com/users/nescafe2002/folders/Default/media/7395c511-5908-4caa-bdb8-ab7b984b2ee9/06.23.2016-22.12.png

Screencast in GIF-formaat (4MB!)

Wellicht dat de modulenaam iets afwijkt (in dit voorbeeld Module1, in mijn eerdere voorbeeld Scores)?

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


Acties:
  • 0 Henk 'm!

  • Gotenks1990
  • Registratie: Februari 2012
  • Laatst online: 08-04 17:31
Klopt, ik zat in de war met het gebruik van de module. Ik dacht als je een functie maakte in de module, dat je niet meer de naam van de module (in dit geval Module1) moest gebruiken om de functie op te roepen... Mijn excuses hiervoor!

Ik heb je feedback gevolgd en geïntegreerd, en het werkt nu als een pareltje! Doordat ik nu weet hoe ik de velden kan updaten, heb ik op het begin van de presentatie ook een extra knop gemaakt "Start Quiz" die alle scores naar 0 reset. Kwestie van zeker te zijn dat iedereen begint met een propere lei.

Heel erg bedankt voor alle hulp! 8)

Acties:
  • +1 Henk 'm!

  • nescafe
  • Registratie: Januari 2001
  • Nu online
Geen probleem. Had ik iets duidelijker kunnen aangeven. Maar met een beetje screenshot dus wel gelukt :)

Wat ik je kan aanraden is om de volgende keer even te zoeken in de object browser (F2) in de VBA-editor. Als je er met intellisense niet direct uitkomt kun je daar altijd functies op naam zoeken.

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans

Pagina: 1