インストールレスプログラミング( ´ー`)

VBA , JavaScript , HTAなど 365アプリはインストール必要ですが、仕事に無いケースはほぼないから(・_・;)

Powerpointで一定間隔マクロ

探せばすぐ見つかると思ってて,昨日探しきれなかったので,ノートから転機(;´▽`A``

元となったページは不明。私にとっての必要部分以外削って,けっこういろいろ組み入れたので原型もよくわからない。
ワードアートを挿入する AddTextEffectが比較的新しいコマンドな気がするので,もしかしたら編集しないと動かないかも。
理解が不十分ですが,AddressOfの使い方がかっこよくて好きなコード。

標準モジュールに下記のものを貼って, StartOnTimeを実行するとタイマーが動きます。
時間部分をクリックすると止まり,もう一度クリックするとリセットしてまた動きます。
スライドショー切っても動き続けるので,止めるときはKillOnTimeを実行してください。

ファイルが添付できれば,下準備は図形書いて済ませれるのにコードにすると長くなっちゃいますね(;´▽`A``

Option Explicit
Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Dim lngTimerID As Long
Dim blnTimer As Boolean
Dim StartTime As Date
Dim TimerPie As Shape, TimerTxt As Shape
Dim CountDownTime As Date


Sub StartOnTime()
    Dim TSlide As Slide: Set TSlide = ActivePresentation.Slides(1)
    CountDownTime = TimeValue("00:01:00")
    'CountDownTime = TimeValue("00:" & Format(oshp.TextFrame.TextRange.Text, "hh:mm")) 'ボタンから取得するよう作ってた分
    '扇形と時間表示部分を作成-------------------------------------------------------------------下準備
    On Error Resume Next
    TSlide.Shapes("Time").Delete: TSlide.Shapes("Pie").Delete: TSlide.Shapes("Oval").Delete
    On Error GoTo 0
    TSlide.Shapes.AddShape(msoShapeOval, 5, 5, 220, 220).Name = "Oval"
    TSlide.Shapes("Oval").Fill.ForeColor.RGB = RGB(0, 0, 255)
    Set TimerPie = TSlide.Shapes.AddShape(msoShapePie, 10, 10, 220, 220)
    TimerPie.Name = "Pie"
    TimerPie.Fill.ForeColor.RGB = RGB(255, 255, 0)
    Set TimerTxt = _
    TSlide.Shapes.AddTextEffect(msoTextEffect33, DispTime(CountDownTime), "Meiryo UI", 180, msoTrue, msoFalse, 240, 10)
    TimerTxt.Name = "Time"
    TimerTxt.ActionSettings(ppMouseClick).Action = ppActionRunMacro
    TimerTxt.ActionSettings(ppMouseClick).Run = "ClickTime"
    ActivePresentation.SlideShowSettings.ShowType = ppShowTypeWindow
    ActivePresentation.SlideShowSettings.Run
    '---------------------------------------------------------------------------------------下準備
    
    'もし前のタイマーが動いているなら切る。
    If blnTimer = True Then lngTimerID = KillTimer(0, lngTimerID)

    StartTime = Now
    TimerPie.Adjustments.Item(1) = -90
    TimerPie.Adjustments.Item(2) = -89.9
    
    'タイマースタート
    lngTimerID = SetTimer(0, 0, 1000, AddressOf DisplayTimer)
    blnTimer = True
    'SlideShowWindows(1).View.Player(TSlide.Shapes("start").Id).Play '音を鳴らす とりあえず切ってます
    TimerTxt.TextFrame.TextRange.Text = DispTime(CountDownTime)
End Sub

Sub KillOnTime()
    Dim TSlide As Slide: Set TSlide = ActivePresentation.Slides(1)
    
    TimerTxt.TextFrame.TextRange.Text = DispTime(CountDownTime)
    
    lngTimerID = KillTimer(0, lngTimerID)
    blnTimer = False
End Sub
Sub DisplayTimer()
Dim TSlide As Slide: Set TSlide = ActivePresentation.Slides(1)
    Dim NokoriJikan As Integer, ZentaiJikan As Integer

    NokoriJikan = ConvSec(StartTime + CountDownTime - Now)
    ZentaiJikan = ConvSec(CountDownTime)
    
    TimerTxt.TextFrame.TextRange.Text = DispTime(StartTime + CountDownTime - Now)
    
    TimerPie.Adjustments(2) = -Int(NokoriJikan / ZentaiJikan * 360) - 90
    If NokoriJikan <= 0 Then
        Call KillOnTime
        'SlideShowWindows(1).View.Player(TSlide.Shapes("stop").Id).Play  '音を鳴らす とりあえず切ってます
    ElseIf NokoriJikan Mod 5 = 0 Or NokoriJikan <= 10 Then
        'SlideShowWindows(1).View.Player(TSlide.Shapes("pu").Id).Play '音を鳴らす とりあえず切ってます
    End If
End Sub

Sub ClickTime()
    If blnTimer = False Then
        Call StartOnTime
    Else
        Call KillOnTime
    End If
End Sub
Function DispTime(datTime As Date)
    DispTime = Format(Minute(datTime), "00") & ":" & Format(Second(datTime), "00")
End Function

Function ConvSec(datTime As Date)
    ConvSec = Hour(datTime) * 3600 + Minute(datTime) * 60 + Second(datTime)
End Function

f:id:chemiphys:20170103123852g:plain