Consulting

Results 1 to 18 of 18

Thread: How to Randomize Only VISIBLE Slides, Not Hidden Slides??

  1. #1
    VBAX Regular
    Joined
    Feb 2022
    Posts
    37
    Location

    How to Randomize Only VISIBLE Slides, Not Hidden Slides??

    Hello all, I'm trying to make my code only randomize non-hidden slides. I'm a noobie to VBA. I've just tried to figure it out logically, but I'm afraid I lack fundamental coding knowledge to solve this problem.
    There are 6 slides and the code will randomize them successfully if I leave out the If statement about "SlideShowTransition.Hidden = False" - So therein lies the problem...
    Sub RandomVisibleSlides ()
    FirstSlide = 1
    LastSlide = 6
    RSN = SlideIndex
    Randomize
    'generate random number for Index
    GRN:
    RSN = Int((LastSlide - FirstSlide + 1) * Rnd + FirstSlide)
    If RSN = ActivePresentation.SlideShowWindow.View.Slide.SlideIndex Then
    If ActivePresentation.Slides(RSN).SlideShowTransition.Hidden = False Then GoTo GRN
    ActivePresentation.SlideShowWindow.View.GotoSlide (RSN)
    End Sub
    My experiment PowerPoint is attached.
    What am I doing wrong?
    Attached Files Attached Files
    Last edited by Aussiebear; 02-23-2022 at 12:15 AM. Reason: Added code tags to supplied code

  2. #2
    VBAX Sage
    Joined
    Apr 2007
    Location
    United States
    Posts
    8,711
    Location
    Try this

    It uses SlideID and a simple bubble sort

    Hidden slides are pushed to the end

    Option Explicit
    
    
    
    
    Sub RandomVisibleSlides()
        Dim arySlides() As Long, cntSlides As Long
        Dim oSlide As Slide, oPres As Presentation
        Dim aryRandom() As Double
        Dim i As Long, j As Long
        Dim HoldRnd As Double, HoldSlide As Long
        
        Randomize
        
        Set oPres = ActivePresentation
        cntSlides = 0
        For Each oSlide In oPres.Slides
            If Not oSlide.SlideShowTransition.Hidden Then
                cntSlides = cntSlides + 1
                ReDim Preserve arySlides(1 To cntSlides)
                arySlides(cntSlides) = oSlide.SlideID
                ReDim Preserve aryRandom(1 To cntSlides)
                aryRandom(cntSlides) = Rnd
            End If
        Next
    
    
        For i = LBound(arySlides) To UBound(arySlides) - 1
            For j = i + 1 To UBound(arySlides)
                If aryRandom(i) > aryRandom(j) Then
                    HoldRnd = aryRandom(i)
                    aryRandom(i) = aryRandom(j)
                    aryRandom(j) = HoldRnd
                    
                    HoldSlide = arySlides(i)
                    arySlides(i) = arySlides(j)
                    arySlides(j) = HoldSlide
                End If
            Next j
        Next i
                
        For i = LBound(arySlides) To UBound(arySlides)
            oPres.Slides.FindBySlideID(arySlides(i)).MoveTo i
        Next i
    End Sub
    ---------------------------------------------------------------------------------------------------------------------

    Paul


    Remember: Tell us WHAT you want to do, not HOW you think you want to do it

    1. Use [CODE] ....[/CODE ] Tags for readability
    [CODE]PasteYourCodeHere[/CODE ] -- (or paste your code, select it, click [#] button)
    2. Upload an example
    Go Advanced / Attachments - Manage Attachments / Add Files / Select Files / Select the file(s) / Upload Files / Done
    3. Mark the thread as [Solved] when you have an answer
    Thread Tools (on the top right corner, above the first message)
    4. Read the Forum FAQ, especially the part about cross-posting in other forums
    http://www.vbaexpress.com/forum/faq...._new_faq_item3

  3. #3
    VBAX Regular
    Joined
    Feb 2022
    Posts
    37
    Location
    Hi Paul, this code is brilliant and way over my head. I read through your points at the bottom. I was unaware of #4 and now, after having read it, I can understand the reasoning behind it. Thanks for sharing.
    So, this code actually helps me solve another project I had lol, but I don't think it will work for my current problem because of two reasons:
    1. Each slide represents a student's name (I'm a teacher) and they have to stay in a certain classroom order. An order that reflects project grouping.
    2. The randomization needs to happen between certain slides (ie 12-18) - Sorry, my mistake to not include these conditions in the original post.

    I found this other post about setting a footer only on visible slides. Could this method be applied to my problem??
    https://stackoverflow.com/a/35277025/9526136

    Thank you for your time-

  4. #4
    VBAX Sage
    Joined
    Apr 2007
    Location
    United States
    Posts
    8,711
    Location
    Might be easier to attach a more realistic presentation file and clearly spell out what you're looking to end up with

    So the slide order is

    1 - Class 1
    2 Student 1
    3 Student 2
    4 Student 3
    5 Student 4
    6 Student 5
    7 - Class 2
    8 Student 6
    9 Student 7
    10 Student 8
    11 Student 9
    12 Student 10

    And you want to randomly arrange students 1 - 5 and 6 - 10, making something like this?

    1 - Class 1
    2 Student 5
    3 Student 3
    4 Student 1
    5 Student 2
    6 Student 4
    7 - Class 2
    8 Student 9
    9 Student 7
    10 Student 6
    11 Student 10
    12 Student 8

    It's easy enough to input a From - To (e.g. 6 - 10) and sort just those if there is no way to identify the Class

    If there's a Class lead in slide that is identifiable, we can use that also


    Do you really need hidden slides if you can sort within a classroom?
    Last edited by Paul_Hossler; 02-23-2022 at 09:44 PM.
    ---------------------------------------------------------------------------------------------------------------------

    Paul


    Remember: Tell us WHAT you want to do, not HOW you think you want to do it

    1. Use [CODE] ....[/CODE ] Tags for readability
    [CODE]PasteYourCodeHere[/CODE ] -- (or paste your code, select it, click [#] button)
    2. Upload an example
    Go Advanced / Attachments - Manage Attachments / Add Files / Select Files / Select the file(s) / Upload Files / Done
    3. Mark the thread as [Solved] when you have an answer
    Thread Tools (on the top right corner, above the first message)
    4. Read the Forum FAQ, especially the part about cross-posting in other forums
    http://www.vbaexpress.com/forum/faq...._new_faq_item3

  5. #5
    VBAX Regular
    Joined
    Feb 2022
    Posts
    37
    Location

    Revised PPT to more accurately represent my goal

    Good suggestion. I tried to revise the PPT I originally posted to give a more accurate representation of my goal.
    The code should just GoTo /hyperlink to a student's slide, but not change the order of the slides.
    They need to stay in the same order index day after day.
    Some students will be absent quite often, and on those days I will hide their slides.
    My problem is that my current Randomizer still jumps to 'hidden' slides.

    Thank you for your time-
    Attached Files Attached Files

  6. #6
    VBAX Regular
    Joined
    Feb 2022
    Posts
    37
    Location
    I forgot to reply to your last question.
    I guess I don't need to hide the slides of students who are absent, but I can't think of another way to omit their slides from the randomizer on days they are absent.
    We will use the randomizer quite often, and if it's jumping to students who aren't present half the time then it will be really lagging on our tempo/efficiency.

    Is it possible to randomly select from a range of objects (ie. objects that are hyperlinks) but not randomize those objects that are hidden? Perhaps this angle of approach would be easier.

  7. #7
    VBAX Sage
    Joined
    Apr 2007
    Location
    United States
    Posts
    8,711
    Location
    Hello all, I'm trying to make my code only randomize non-hidden slides.
    So you didn't really mean that you wanted to rearrange the non-hidden slides in a random order, but just pick a non-hidden slide from a classroom subset


    Class 1
    Student 1
    Student 2
    Student 3 (Hidden - don't pick)
    Student 4
    Student 5

    Class 2

    Student 6
    Student 7 (Hidden - don't pick)
    Student 8
    Student 9 (Hidden - don't pick)
    Student 10

    So pick 1, 2, 4, or 5 at random and pick 6, 8, or 10 at random, but leave the slides in the original order?
    ---------------------------------------------------------------------------------------------------------------------

    Paul


    Remember: Tell us WHAT you want to do, not HOW you think you want to do it

    1. Use [CODE] ....[/CODE ] Tags for readability
    [CODE]PasteYourCodeHere[/CODE ] -- (or paste your code, select it, click [#] button)
    2. Upload an example
    Go Advanced / Attachments - Manage Attachments / Add Files / Select Files / Select the file(s) / Upload Files / Done
    3. Mark the thread as [Solved] when you have an answer
    Thread Tools (on the top right corner, above the first message)
    4. Read the Forum FAQ, especially the part about cross-posting in other forums
    http://www.vbaexpress.com/forum/faq...._new_faq_item3

  8. #8
    VBAX Regular
    Joined
    Feb 2022
    Posts
    37
    Location
    Exactly right. That's what I mean to say.

  9. #9
    VBAX Regular
    Joined
    Feb 2022
    Posts
    37
    Location
    Also, just to be clear - The 'hidden' slides will change from class to class, day to day. Much like an attendance sheet.

  10. #10
    VBAX Sage
    Joined
    Apr 2007
    Location
    United States
    Posts
    8,711
    Location
    Try the attachment - barebones and needs some prettying-up


    Option Explicit
    
    
    Dim arySlides() As Long, cntSlides As Long
    Dim aryRandom() As Double
    Dim oPres As Presentation
    
    
    Sub PickSlide(oShapeIn As Shape)
    
    
        Call SetupRandomVisibleSlides
        
        Select Case oShapeIn.Name
            Case "Class 1"
                Call GotoSlide(1)
            Case "Class 2"
                Call GotoSlide(2)
        End Select
    End Sub
    
    
    Private Sub GotoSlide(ClassNum As Double)
        Dim i As Long
        
        For i = LBound(aryRandom) To UBound(aryRandom)
            If aryRandom(i) = ClassNum Then
                SlideShowWindows(1).View.GotoSlide arySlides(i + 1)
                Exit Sub
            End If
        Next i
    
    
    End Sub
    
    
    
    
    Private Sub SetupRandomVisibleSlides()
        Dim oSlide As Slide, oShape As Shape
        Dim i As Long, j As Long
        Dim HoldRnd As Double, HoldSlide As Long
        Dim cntGroup As Double
        
        Randomize
        
        Set oPres = ActivePresentation
        
        cntSlides = 0
        cntGroup = 0#
        
        For Each oSlide In oPres.Slides
            For Each oShape In oSlide.Shapes
                If oShape.Type = msoPlaceholder Then
                    If oShape.PlaceholderFormat.Type = ppPlaceholderTitle Then
                        If oShape.TextFrame.HasText Then
                            If LCase(oShape.TextFrame.TextRange.Text) Like "class*" Then
                                cntGroup = cntGroup + 1
                                cntSlides = cntSlides + 1
                                ReDim Preserve arySlides(1 To cntSlides)
                                arySlides(cntSlides) = oSlide.SlideNumber
                                ReDim Preserve aryRandom(1 To cntSlides)
                                aryRandom(cntSlides) = cntGroup
                                GoTo NextSlide
                            End If
                        End If
                    End If
                End If
            Next oShape
            
            If cntGroup = 0 Then GoTo NextSlide
        
            If Not oSlide.SlideShowTransition.Hidden Then
                cntSlides = cntSlides + 1
                ReDim Preserve arySlides(1 To cntSlides)
                arySlides(cntSlides) = oSlide.SlideNumber
                ReDim Preserve aryRandom(1 To cntSlides)
                aryRandom(cntSlides) = cntGroup + Rnd
            End If
            
    NextSlide:
        Next oSlide
    
    
    
    
        For i = LBound(arySlides) To UBound(arySlides) - 1
            For j = i + 1 To UBound(arySlides)
                If aryRandom(i) > aryRandom(j) Then
                    HoldRnd = aryRandom(i)
                    aryRandom(i) = aryRandom(j)
                    aryRandom(j) = HoldRnd
                    
                    HoldSlide = arySlides(i)
                    arySlides(i) = arySlides(j)
                    arySlides(j) = HoldSlide
                End If
            Next j
        Next i
    End Sub
    Attached Files Attached Files
    ---------------------------------------------------------------------------------------------------------------------

    Paul


    Remember: Tell us WHAT you want to do, not HOW you think you want to do it

    1. Use [CODE] ....[/CODE ] Tags for readability
    [CODE]PasteYourCodeHere[/CODE ] -- (or paste your code, select it, click [#] button)
    2. Upload an example
    Go Advanced / Attachments - Manage Attachments / Add Files / Select Files / Select the file(s) / Upload Files / Done
    3. Mark the thread as [Solved] when you have an answer
    Thread Tools (on the top right corner, above the first message)
    4. Read the Forum FAQ, especially the part about cross-posting in other forums
    http://www.vbaexpress.com/forum/faq...._new_faq_item3

  11. #11
    VBAX Regular
    Joined
    Feb 2022
    Posts
    37
    Location
    Wow. It's brilliant and it works.
    I will need to pore over this for hours to understand better, but am looking forward to that.
    Could this code be modified to for no repeats? As in, not the same student back-to-back.

    Sorry to bring this up now, but I'm suddenly starting to believe that all things are possible lol.

  12. #12
    VBAX Sage
    Joined
    Apr 2007
    Location
    United States
    Posts
    8,711
    Location
    Quote Originally Posted by Kellaroo View Post
    Wow. It's brilliant and it works.
    I will need to pore over this for hours to understand better, but am looking forward to that.
    Could this code be modified to for no repeats? As in, not the same student back-to-back.

    Sorry to bring this up now, but I'm suddenly starting to believe that all things are possible lol.


    it works.
    Don't sound so surprised

    So now you want to go through each class' students in a random order

    Class 1
    Student 6
    Student 3
    Student2

    and then back to the intro slide?

    Right now they're re-randomize each time you click a class button o the first slide
    ---------------------------------------------------------------------------------------------------------------------

    Paul


    Remember: Tell us WHAT you want to do, not HOW you think you want to do it

    1. Use [CODE] ....[/CODE ] Tags for readability
    [CODE]PasteYourCodeHere[/CODE ] -- (or paste your code, select it, click [#] button)
    2. Upload an example
    Go Advanced / Attachments - Manage Attachments / Add Files / Select Files / Select the file(s) / Upload Files / Done
    3. Mark the thread as [Solved] when you have an answer
    Thread Tools (on the top right corner, above the first message)
    4. Read the Forum FAQ, especially the part about cross-posting in other forums
    http://www.vbaexpress.com/forum/faq...._new_faq_item3

  13. #13
    VBAX Regular
    Joined
    Feb 2022
    Posts
    37
    Location
    I'm a teacher. I'm not really used to things working out lol

    Good insight^. Now that I've thought about it more- Ideally I'd want it to be like:
    Main Slide
    Student 6
    Return to Main
    Student 2 (not Student 6)
    Return to Main
    Next Student (not Student 2)
    Return to Main
    Possibly Student 6 again

    The same student could be up for discussion more than once, or more than other students, but not back-to-back consecutive.

  14. #14
    VBAX Sage
    Joined
    Apr 2007
    Location
    United States
    Posts
    8,711
    Location
    That's harder since it requires housekeeping while you're in a class, and clearing if you go to another class

    Look at this version

    The [Next] action button takes you to the next random student in that class, with the last one returning you to slide 1. Clicking a Class button re-randomizes
    Attached Files Attached Files
    ---------------------------------------------------------------------------------------------------------------------

    Paul


    Remember: Tell us WHAT you want to do, not HOW you think you want to do it

    1. Use [CODE] ....[/CODE ] Tags for readability
    [CODE]PasteYourCodeHere[/CODE ] -- (or paste your code, select it, click [#] button)
    2. Upload an example
    Go Advanced / Attachments - Manage Attachments / Add Files / Select Files / Select the file(s) / Upload Files / Done
    3. Mark the thread as [Solved] when you have an answer
    Thread Tools (on the top right corner, above the first message)
    4. Read the Forum FAQ, especially the part about cross-posting in other forums
    http://www.vbaexpress.com/forum/faq...._new_faq_item3

  15. #15
    VBAX Regular
    Joined
    Feb 2022
    Posts
    37
    Location
    Paul,
    I pored over your coding for some hours. I still don't understand it really but I've successfully implemented it with previous classroom PPTs. It works wonderfully! This is going to add a level of sophistication to group discussion previously not thought possible! You're a wizard : )
    Thank You!

  16. #16
    VBAX Sage
    Joined
    Apr 2007
    Location
    United States
    Posts
    8,711
    Location
    Good

    I added some comments to the code and a few explanations via screen clips to the slides

    Feel free to come back


    On the subject on comments ....

    this is just my personal style / opinion / way of doing things

    1. IMVHO a comment should provide information about why something is being done, and not just a free form English repeat of the code

    2. I like to avoid 'magic numbers', e.g. 0.06 ("where did THAT come from) and use meaningful Const's and variables, Const SaleTaxRate = 0.06


    This is an Excel example

    Option Explicit
    
    Sub NotGoodComments()
        'define variables
        Dim i As Long
    
        'go from 4 to a long way down
        For i = 4 To 10000
            'Multiply inputs to get outputs
            Cells(i, 3) = Cells(i, 4) * Cells(i, 5)
        
            'if col B is empty
            If Cells(i + 1, 2) = "" Then
                'get out
                GoTo Done
            End If
        'get another row
        Next i
    
    Done:
        ' blah blah blah
    
    
    End Sub
    
    
    Sub BetterComments()
        Const rowStartOfRealData As Long = 4
        Const colSalePerson As Long = 2
        Const colSales As Long = 3
        Const colQty As Long = 4
        Const colUnitCost As Long = 5
        
        Dim rowData As Long
    
    
        'go down all sales persons until there are no more
        For rowData = rowStartOfRealData To Cells(rowStartOfRealData, colSalePerson).End(xlDown).Row
            
            'if there is no sales person in this row, we finished
            If Cells(rowData + 1, colSalePerson) = "" Then Exit For
            
            'Sales = Qty x Cost
            Cells(rowData, colSales) = Cells(rowData, colQty) * Cells(rowData, colUnitCost)
        
        Next rowData
    
        ' blah blah blah
    
    
    End Sub
    Attached Files Attached Files
    Last edited by Paul_Hossler; 02-28-2022 at 12:16 PM.
    ---------------------------------------------------------------------------------------------------------------------

    Paul


    Remember: Tell us WHAT you want to do, not HOW you think you want to do it

    1. Use [CODE] ....[/CODE ] Tags for readability
    [CODE]PasteYourCodeHere[/CODE ] -- (or paste your code, select it, click [#] button)
    2. Upload an example
    Go Advanced / Attachments - Manage Attachments / Add Files / Select Files / Select the file(s) / Upload Files / Done
    3. Mark the thread as [Solved] when you have an answer
    Thread Tools (on the top right corner, above the first message)
    4. Read the Forum FAQ, especially the part about cross-posting in other forums
    http://www.vbaexpress.com/forum/faq...._new_faq_item3

  17. #17
    VBAX Regular
    Joined
    Feb 2022
    Posts
    37
    Location
    Annotated coding! The answer to all my riddles : )
    On behalf of myself and every other VBA-newbie teacher who may find their way here - Thank You!

  18. #18
    VBAX Newbie
    Joined
    Nov 2023
    Posts
    4
    Location

    VBA code randomvisibleslide

    Quote Originally Posted by Paul_Hossler View Post
    Try this

    It uses SlideID and a simple bubble sort

    Hidden slides are pushed to the end

    Option Explicit
    
    
    
    
    Sub RandomVisibleSlides()
        Dim arySlides() As Long, cntSlides As Long
        Dim oSlide As Slide, oPres As Presentation
        Dim aryRandom() As Double
        Dim i As Long, j As Long
        Dim HoldRnd As Double, HoldSlide As Long
        
        Randomize
        
        Set oPres = ActivePresentation
        cntSlides = 0
        For Each oSlide In oPres.Slides
            If Not oSlide.SlideShowTransition.Hidden Then
                cntSlides = cntSlides + 1
                ReDim Preserve arySlides(1 To cntSlides)
                arySlides(cntSlides) = oSlide.SlideID
                ReDim Preserve aryRandom(1 To cntSlides)
                aryRandom(cntSlides) = Rnd
            End If
        Next
    
    
        For i = LBound(arySlides) To UBound(arySlides) - 1
            For j = i + 1 To UBound(arySlides)
                If aryRandom(i) > aryRandom(j) Then
                    HoldRnd = aryRandom(i)
                    aryRandom(i) = aryRandom(j)
                    aryRandom(j) = HoldRnd
                    
                    HoldSlide = arySlides(i)
                    arySlides(i) = arySlides(j)
                    arySlides(j) = HoldSlide
                End If
            Next j
        Next i
                
        For i = LBound(arySlides) To UBound(arySlides)
            oPres.Slides.FindBySlideID(arySlides(i)).MoveTo i
        Next i
    End Sub
    This code works perfect, but is works for all sheets in my slideshow.
    Is it also posible to this with a small selections of sheets, so sheet 19 till 23?

    Greetz Tyas

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •