Teilkreis in PowerPoint via VBA anpassen (für Funktion á la TimeTimer)

  • PowerPoint

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Garageman.

    Teilkreis in PowerPoint via VBA anpassen (für Funktion á la TimeTimer)

    Hallo, lieber VB-Freunde.

    Ich habe kaum Erfahrung in VBA, suche aber trotzdem eine Lösung für einen analogen Timer in PowerPoint (in der Art des bekannten TimeTimers), um in meinen Scrum Events den Status der aktuellen Timebox anzeigen zu können.
    Gestern habe ich mir erste Lösung gebaut, die basierend auf einer auf Slide 1 in einer Textbox "timebox" hinterlegten Zeit in Minuten einen Balken auf jeder Seite der aktuellen Präsentation mit der Zeit von 0 auf 100% anwachsen lässt.
    Das VBA Macro wir gestartet, wenn der Ablaufbalken initial angeklickt wird (Starttime), dann wird die Timebox daraufaddiert und der Var EndTime zugewiesen. Recht simpel.

    Nun aber möchte ich aus dieser Bar eine analoge Anzeige der Art des TimeTimers machen:
    Ein weißer Teilkreis liegt über einem roten Kreis.
    Der eine Parameter des weißen Teilkreises soll sich von 0 bis 359 mit dem Lauf der Zeit verändern (der zweite Parameter soll natürlich fix bleiben).

    Ich stehe etwas auf dem Schlauch mit der Adressierung der Parameter des Shapes, denn ich finde dazu nichts wirklich logisches im Netz-der-Netze.
    Gefunden habe ich "app.ActiveWindow.Selection.ShapeRange.Adjustments(1)" und "...(2)", die mit Werten von 0 bis 360 belegt werden können.
    Diese Parameter scheinen aber nicht unter VBA zu funktionieren - oder ich bin einfach zu unerfahren mit VBA...

    Ganz simpel zum Einstieg und Verstehen der Adressierung der beiden Argumente wäre:


    Quellcode

    1. Sub TimeTimer()
    2. Dim Percentage As Long
    3. Dim SlideNumber As Integer
    4. Percentage = 0.25
    5. SlideNumber = 1
    6. ActivePresentation.Slides(SlideNumber).Shapes("elapsed_time").Adjustments(2) = 360 * Percentage
    7. ActivePresentation.Slides(SlideNumber).Shapes("elapsed_time").Adjustments(1) = 0
    8. End Sub



    Kann mir hier jemand helfen?

    Das wäre fein!

    .:. lutz
    Ok, I found the solution after posting by inquiry - sometimes, asking a question activates my brain even more ;)

    The solution for my very specific request is:

    Quellcode

    1. ​Sub countdown()
    2. Dim Starttime As Date
    3. Starttime = Now() 'The current time, start the countdown by clicking on the countdown field after starting the presentation'
    4. Dim count As Integer
    5. count = ActivePresentation.Slides(1).Shapes("timebox").TextFrame.TextRange 'timebox in minutes has to be entered on first slide in the shape called "timebox" anywhere on the presentation (outside the visible part ;-) )'
    6. Dim pos_x, pos_y, diamater_x, diameter_y As Integer
    7. pos_x = 100
    8. pos_y = 100
    9. diameter_x = 100
    10. diameter_y = 100
    11. Dim Finishtime As Date
    12. Finishtime = DateAdd("n", count, Starttime)
    13. Dim time As Double
    14. time = CDbl(Finishtime)
    15. Dim slideCount As Long
    16. slideCount = ActivePresentation.Slides.count 'Number of slides in this presentation'
    17. Dim shp As Shape
    18. For i = 1 To slideCount
    19. 'chili-roten Kreis zeichnen, hinterste Ebene
    20. Set shp = ActivePresentation.Slides(i).Shapes.AddShape(msoShapeOval, pos_x, pos_y, diameter_x, diameter_y)
    21. With shp
    22. .Name = "background_red_circle"
    23. .Line.Visible = msoFalse
    24. .Fill.Visible = msoTrue
    25. .Fill.ForeColor.RGB = RGB(194, 24, 7)
    26. End With
    27. 'Kuchendiagramm zeichnen, weiß (bzw. Farbe des Hintergrundes), über dem roten Kreis, Startwert auf -45 und 360 setzen (12 Uhr)
    28. Set shp = ActivePresentation.Slides(i).Shapes.AddShape(msoShapePie, pos_x, pos_y, diameter_x, diameter_y)
    29. With shp
    30. .Name = "elapsed_time"
    31. .Line.Visible = msoFalse
    32. .Fill.Visible = msoTrue
    33. .Fill.ForeColor.RGB = vbWhite
    34. End With
    35. ActivePresentation.Slides(i).Shapes("elapsed_time").Adjustments(1) = -90
    36. ActivePresentation.Slides(i).Shapes("elapsed_time").Adjustments(2) = 270
    37. 'schwarze dicke Umrandung zeichnen, oberste Ebene
    38. Set shp = ActivePresentation.Slides(i).Shapes.AddShape(msoShapeOval, pos_x, pos_y, diameter_x, diameter_y)
    39. With shp
    40. .Name = "framed_circle"
    41. .Line.Visible = msoTrue
    42. .Line.Weight = 3
    43. .Fill.Visible = msoFalse
    44. .Line.ForeColor.RGB = vbBlack
    45. End With
    46. Next i
    47. Do Until time < CDbl(Now())
    48. DoEvents
    49. For i = 1 To slideCount
    50. On Error Resume Next
    51. ActivePresentation.Slides(i).Shapes("countdown").TextFrame.TextRange.Paragraphs(i).Font.Color.RGB = vbWhite
    52. ActivePresentation.Slides(i).Shapes("countdown").TextFrame.TextRange = Format((time - CDbl(Now())), "hh:mm:ss")
    53. PastTime = Now() - Starttime
    54. TotalTime = Finishtime - Starttime
    55. ActivePresentation.Slides(i).Shapes("ProgressBar").Delete
    56. Set shp = ActivePresentation.Slides(i).Shapes.AddShape(msoShapeRectangle, 0, ActivePresentation.PageSetup.SlideHeight - 12, ActivePresentation.PageSetup.SlideWidth * PastTime / TotalTime, 12)
    57. shp.Name = "ProgressBar"
    58. 'Fortschrittsbalken "Timebox" in DZ-Bank-Orange (242, 109, 58) zeichnen
    59. shp.Fill.ForeColor.RGB = RGB(242, 109, 58)
    60. shp.Line.ForeColor.RGB = RGB(242, 109, 58)
    61. ActivePresentation.Slides(i).Shapes("elapsed_time").Adjustments(1) = -90 + 360 * PastTime / TotalTime
    62. ActivePresentation.Slides(i).Shapes("elapsed_time").Adjustments(2) = 270
    63. Next i
    64. If time < Now() Then
    65. For i = 1 To slideCount
    66. ActivePresentation.Slides(i).Shapes("countdown").TextFrame.TextRange.Paragraphs(i).Font.Color.RGB = vbRed
    67. ActivePresentation.Slides(i).Shapes("countdown").TextFrame.TextRange = "ENDE"
    68. Next i
    69. End If
    70. Loop
    71. ' Aufräumen
    72. For i = 1 To slideCount
    73. ActivePresentation.Slides(i).Shapes("ProgressBar").Delete
    74. ActivePresentation.Slides(i).Shapes("framed_circle").Delete
    75. ActivePresentation.Slides(i).Shapes("elapsed_time").Delete
    76. ActivePresentation.Slides(i).Shapes("background_red_circle").Delete
    77. Next i
    78. End Sub


    Auf der ersten Slide der PPTM (M für Macro) muss ein Shape mit dem Namen "timebox" existieren (außerhalb des sichtbaren Bereichs sinnvoller Weise) mit dem Wert für die Timebox in Minuten.
    Das Macro "countdown" wird an ein Shape gebunden, dass sich auf der ersten Slide befindet (es wird beim Start auf alle anderen Slide kopiert)
    Nach dem Start des Count Downs wird die Zeit in Sekunden in der Box rechts oben numerisch herunter gezählt.
    Am unteren Bildschirmrand baut sich eine Bar auf in Relation zur abgelaufenen Zeit
    Links oben erscheint der "TimeTimer", der ebenfalls die abgelaufene Zeit anzeigt.

    Maybe someone wants to reuse it.

    Cheers.

    .:. lutz