アプリ版:「スタンプのみでお礼する」機能のリリースについて

よろしくお願いいたします。
パワーポイントのマクロを使って添付画像にある3つの数字(number1,2,3)を
ボタン(兜のイラスト)を押した後に5回シャッフルしてランダムな数字を表示したいと考えております。

ボタンを押したらランダムに数字を表示させることは出来たのですが、
5回シャッフルした後に表示させるマクロの書き方が分からなかったので教えてください。

下記が現在のマクロです。

Sub Test()
Randomize
With ActivePresentation.Slides(1).Shapes("number1")
.TextFrame.TextRange.Text = Int((10 * Rnd) + 1)
End With
With ActivePresentation.Slides(1).Shapes("number2")
.TextFrame.TextRange.Text = Int((10 * Rnd) + 1)
End With
With ActivePresentation.Slides(1).Shapes("number3")
.TextFrame.TextRange.Text = Int((10 * Rnd) + 1)
End With
End Sub

またシャッフル中の数字も見えるようにしたいです。
イメージ的にはこの方のYouTube動画のような数字の動きです。



よろしくお願いいたします。

「Powerpointでランダムな数字の結」の質問画像

A 回答 (2件)

No1です。



連投失礼。

No1は、短時間に2度クリックされることを考慮していませんでした。
(試してはいませんが、IDが上書きされるので止まらなくなるはず)

最初に
If mTimerID <> 0 Then Exit Sub
などを入れて、防止しておいてください。
    • good
    • 0

こんにちは



Shapeということは、対象がテキストボックスなどということでしょうか?
基本的には、適当な時間間隔を置いて、ご提示の処理を繰り返せば良いのですが、当方の環境では画面のリフレッシュがされないようです。(Office 2019)

旧い記事では、DoEventsで一旦制御を渡せば、リフレッシュされるような雰囲気なのですが、試してみたところ反映されませんね。
表示要素をChartを利用するように変えれば、Refresh メソッドがあるので再描画可能と思いますが、Shapeの場合はそのようなメソッドもなさそうです。

ですので、以下は、APIのSetTimerを利用する方法にしてあります。
(他にも方法はあるかも知れませんけれど・・)
スライドショー実行中に動作することで良いものと解釈しました。
(実行中でないと動作しませんので、ご注意。)

※ AddressOfを利用する関係で、以下は標準モジュールに記載する必要があります。
※ その上で、トリガー(画像クリック?)から、startShuffleを呼び出すようにしてください。
※ 対象のShapeは表示中のスライドの、Nameが number1、number2、number3と決め打ちにしてあります。


Private Declare PtrSafe Function SetTimer Lib "USER32" (ByVal hwnd As Long, _
ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As Long

Private Declare PtrSafe Function KillTimer Lib "USER32" (ByVal hwnd As Long, _
ByVal nIDEvent As Long) As Long

Private mTimerID As Long
Private cnt As Long

Sub startShuffle()
cnt = 0
mTimerID = SetTimer(0&, 1&, 150&, AddressOf changeText)
End Sub

Sub changeText()
Dim i As Long
If mTimerID = 0 Then End
With ActivePresentation.SlideShowWindow.View.Slide
For i = 1 To 3
.Shapes("number" & i).TextFrame.TextRange.Text = Int(10 * Rnd)
Next i
End With
cnt = cnt + 1
If cnt > 5 Then
Call KillTimer(0&, mTimerID)
mTimerID = 0
End If
End Sub


※ もしも32ビット環境の場合には、関数宣言の「PtrSafe」等を除いてください。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!