Community Pick: Many members of our community have endorsed this article.

Generating pseudo-random numbers on Powerpoint slideshow

Published:
This article describes how to make a simple, pseudo-random number generator in Microsoft PowerPoint. The code checks the generated numbers against a list of numbers already generated to prevent duplication. We used this as a youth group activity but it could be adapted for other entertainment or competition purposes as well. This macro demonstrates the power of Visual Basic for Applications (VBA) in PowerPoint to obtain data from, and make dynamic changes to, elements of a slideshow at runtime.

This code generates pseudo-random numbers between 1 and 75. The lower and upper limits can be changed by setting the constants SMALLEST_NUMBER and BIGGEST_NUMBER, respectively, in the declarations area of the code. The macro also stores a list of the generated numbers (PickedNumbers private integer array) and checks to see if a newly generated number has already been selected and used. The generated numbers can be reset by clicking the asterisk button on the slide as the 'game' is running. Once all the possible numbers have been used, the macro disables the button to generate the next number and forces the user to press the reset button to continue.

The textbox is included for authenticity, as it allows the user to change the letter on the 'bingo ball'. Changes in this textbox are reflected on the 'bingo ball'. No letter needs to be entered.

To try this macro out, download the PPTX (for PowerPoint 2007 and up) or PPT and then open up VBA (for example, in PowerPoint 2007, click the Developer tab on the ribbon, then select Visual Basic).
bingo.ppt bingo.pptx

Then open the code for Slide 1, and paste the attached code into the window, if the code is not there already.
Option Explicit

Private PickedNumbers() As Integer

'change these two constants to modify the allowed range of numbers
Private Const SMALLEST_NUMBER As Integer = 1
Private Const BIGGEST_NUMBER As Integer = 75

Private Sub cmdNextNumber_Click()

On Error GoTo ErrHandler

Dim tmpNumber As Integer
Dim a As Integer
Dim textToShow As String

Randomize Timer

If (UBound(PickedNumbers)) > (BIGGEST_NUMBER - SMALLEST_NUMBER) Then
    'end of game, all numbers have been picked already
    'the reset button must be pressed to continue
    textToShow = "--"
    cmdNextNumber.Enabled = False
Else
    If UBound(PickedNumbers) = 0 Then
        'call a function to generate a pseud-random number
        tmpNumber = generateANumber
    Else
        'check if the generated number has already been chosen by looping through the stored number array
        Do
        tmpNumber = generateANumber
            For a = 0 To UBound(PickedNumbers)
                If tmpNumber = PickedNumbers(a) Then Exit For
            DoEvents
            Next a
            If a - 1 = UBound(PickedNumbers) Then Exit Do 'all stored numbers searched, new number is indeed new
        DoEvents
        Loop
    End If
    'store the new number in the array, expand the array for the next number, and update the total numbers display
    PickedNumbers(UBound(PickedNumbers)) = tmpNumber
    textToShow = tmpNumber
    ReDim Preserve PickedNumbers(UBound(PickedNumbers) + 1)
    lblTotalNumberOfNumbers.Caption = UBound(PickedNumbers)
End If

'set the text on the ball
ActivePresentation.Slides(1).Shapes(2).TextFrame.TextRange.Text = textToShow

Exit Sub
ErrHandler:
Select Case Err.Number
    Case 9
        ReDim PickedNumbers(0)
        Resume
End Select

End Sub

Private Function generateANumber() As Integer

Dim tmpNumber As Integer
Do Until tmpNumber >= SMALLEST_NUMBER And tmpNumber <= BIGGEST_NUMBER
    'generate a pseudo-random number using the Rnd function
    tmpNumber = Round(Rnd * BIGGEST_NUMBER)
DoEvents
Loop
generateANumber = tmpNumber

End Function

Private Sub cmdReset_Click()

Erase PickedNumbers
cmdNextNumber.Enabled = True
lblTotalNumberOfNumbers.Caption = ""
ActivePresentation.Slides(1).Shapes(2).TextFrame.TextRange.Text = ""

End Sub

Private Sub txtBallLabel_Change()

ActivePresentation.Slides(1).Shapes(3).TextFrame.TextRange.Text = txtBallLabel.Text

End Sub

Open in new window


To 'play', start the slideshow (press F5), click the * button to reset, and start generating numbers by clicking the > button.  
1
16,320 Views

Comments (5)

John WilsonCEO PowerPoint Alchemy
CERTIFIED EXPERT

Commented:
Nice code!

Just a thought when most numbers have "gone" it could take a while to generate a number that is not in the array of picked numbers.

I would maybe
1. generate an array with ALL the numbers
2. Randomly choose a position in the array and read the number stored there.
3. Read the top number in the array and make the chosen position this value
4. Redim 1 to Ubound-1 to strip the old top number

Chose another random number based on the new Ubound

Hope that makes sense.

Author

Commented:
Good point, JSRWilson. That would form a better user experience, especially on slower machines or when a large range is used. Thanks for the comment.

Commented:
Is there a way to view or store the previously used random numbers in a separate file or powerpoint slide?
John WilsonCEO PowerPoint Alchemy
CERTIFIED EXPERT

Commented:
Lots of ways but you should ask this as a question in the main area. Include exactly what you aare trying to acheive.
aikimarkSocial distance; Wear a mask; Get vaccinated
CERTIFIED EXPERT
Top Expert 2014

Commented:
In case anyone is interested in the behavior of the VB PRNG, I've republished my article on the subject here at EE: http:A_11114.html

Have a question about something in this article? You can receive help directly from the article author. Sign up for a free trial to get started.

Get access with a 7-day free trial.
You Belong in the World's Smartest IT Community