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

PowerPointのVBAについて質問です。

スライドショー実行中に、スライド内の図形をクリックすると、その図形の名前を取得する方法がわかりません。

今の状況ですが、
PowerPoint外部から図を20個ほど取得し、決まった名前を付け、定位置にランダムに配置することまでできました。
ここからが本題で、配置された図形をクリックしたときに、その図形の名前を取得したいのですが、どうすればいいのかわかりません。

今目指しているのは、
”もし、「あいう」という図形がクリックされたら、図形の名前を答える”というもので、

If ActivePresentation.Slides(2).Shapes(”あいう”).ActionSettings(ppMouseClick) = On Then
 MsgBox ActivePresentation.Slides(2).Shapes(”あいう”).Name

みたいな文章にしたいと考えていますが、もちろんできませんでした。

補足ですが、
スライドショーをやめて、図形にマクロ登録をする方法は使用できません。
スライドショーの中で、外部フォルダから画像を取ってきて、名前を付け、並べ、その図形をクリックされたときにその図形の名前を答える…… これを一括で行いたいです。

質問者からの補足コメント

  • すみません、補足が足りませんでした。
    PowerPoint外部から図を20個ほど取得し、決まった名前を付け、定位置にランダムに配置することまでしているため、スライドショー中には、”あいう”以外にも、”えおか”、”きくけ”、”こさち”……などなど、計20枚の図形が一つのスライドの中にあります。

    なおかつ、その20枚のどれかをクリックしたとき、「私は”きくけ”だよ~」とか、「私は”あいう”だよ~」を表示したいのです。

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

      補足日時:2021/01/05 01:23

A 回答 (4件)

#4です。


読み返して、検証してみたら#4の回答はダメダメですね。すみません。
>その図形をクリックされたときにその図形の名前を答える

shp.ActionSettings(ppMouseClick).Run = #4のマクロ
のようにマクロを登録した場合、図形をクリックされたときに
クリックされた図形を特定するのが、PowerPointの場合、難しいようですね。・・・

乗りかかった船と言う事で、違う方法を考えました。
不確定要素あり有りなので、あくまで参考として検証及び不確定部分は調べてください。
処理の流れ
WindosAPIを使いクリック座標を取得してスライド(全画面)内の画像の座標をFor Each shp In sld.Shapesで一つずつ取得、クリック座標が画像座標内にある場合、そのShape名を表示します。危ういのは、座標取得、、、
大体の位置と言う事で、、、取敢えず

いずれも標準モジュールに

画像クリック時のアクションを設定(条件に合うすべてに)
Public Sub Sample()
Dim sld As Slide, shp As Shape
For Each sld In ActivePresentation.Slides
If sld.SlideIndex = 1 Then ’1ページ目のスライドのみ(変更してください
For Each shp In sld.Shapes
'If shp.Type = msoPicture Then 'Typeを限定した方が良いかも
shp.ActionSettings(ppMouseClick).Run = "Test_Sample"
'End If
Next shp
End If
Next sld
End Sub

"Test_Sample"は、モジュール名など適時追加変更してください。

Option Explicit
Type coordinate
x As Long
y As Long
End Type
Declare Function GetCursorPos Lib "User32" (lpPoint As coordinate) As Long
Sub Test_Sample()
Dim c As coordinate
GetCursorPos c
Dim sld As Slide, shp As Shape
For Each sld In ActivePresentation.Slides
If sld.SlideIndex = 1 Then
For Each shp In sld.Shapes
With shp
If c.y / 2 >= .Top And c.y / 2 <= .Top + .Height _
And c.x / 2 >= .Left And c.x / 2 <= .Left + .Width Then
MsgBox (.Name)
Exit Sub
End If
End With
Next
End If
Next
End Sub


おおよそ ポイント / 2? ちゃんと調べて回答した方が良いと思いますが
ごめんなさい。タイムアップと言う事で、、、
    • good
    • 1
この回答へのお礼

助かりました

>shp.ActionSettings(ppMouseClick).Run = #4のマクロ
のようにマクロを登録した場合、図形をクリックされたときに
クリックされた図形を特定するのが、PowerPointの場合、難しいようですね。

やはりそうでしたか…
こちらもいろいろと試行錯誤してみましたが、For EachやWithを入れちゃうと動作が止まったり、値の受け渡しもできずでした。
いただいた文を基に、もう一度試行錯誤いたします。
お時間等お忙しい中、いろいろと考えてくださり、ありがとうございました。

お礼日時:2021/01/05 21:26

こんにちは、横から失礼します。


>配置された図形をクリックしたとき
図形をクリックしたときマクロが実行されるように各画像の動作設定をします。
対象の画像を選択 >>挿入タグの動作をクリック >ダイアログのマクロを実行を選択し下記マクロを登録 (まとめて登録する事が出来ませんので1枚ずつ設定してください)

標準モジュールへ
Sub Shape_Name()
Dim sld As Slide, shp As Shape
Dim act As ActionSetting
For Each sld In ActivePresentation.Slides
For Each shp In sld.Shapes
For Each act In shp.ActionSettings
If act.Action <> ppActionNone Then
MsgBox (shp.Name & " です")
End If
Next act
Next shp
Next sld
End Sub
どのスライドシェイプから実行してもクリックされたシェイプの名前がメッセージボックスに出力されます。
出力方法やクリック時の他のアクションを設定したい場合は工夫が必要かもです。

もし、マクロで画像に動作を設定するなら、すでに回答にあるように下記のようなマクロで設定できます。
例:
スライドインデックス1のすべての画像に対してアクションをマクロの実行に設定してよいなら
下記のマクロで設定できますが、、すべての画像です。
また、If sld.SlideIndex = 1 Thenの条件をなくせば、すべてのスライドとなります。

Public Sub Sample()
Dim sld As Slide, shp As Shape
For Each sld In ActivePresentation.Slides
If sld.SlideIndex = 1 Then
For Each shp In sld.Shapes
shp.ActionSettings(ppMouseClick).Run = "Shape_Name"
Next shp
End If
Next sld
End Sub
    • good
    • 1

No2です。



>計20枚の図形が一つのスライドの中にあります。
図形にマクロを登録するだけのことなので、何枚あろうが関係ないと思いますけれど?

PPTのVBAは知らないので、よくわかりませんけれど・・・
    • good
    • 2

こんばんは



PPTのVBAはほとんど知りませんが・・・

全体的になさりたいことはよくわかりませんが、ご質問の内容としては、スライドショー実行中のクリックアクションを設定したいという意味ですよね?
シェイプは「あいう」限定でよさそうなので・・・

ActivePresentation.Slides(2).Shapes(”あいう”).ActionSettings(ppMouseClick).Run = "hoge"

を実行しておくことで、クリック時にSub hoge()が実行されるようになります。
hoge内にメッセージを出すなどの処理を記述しておいてください。

※PPT2011(B 13426)にてテスト済。
    • good
    • 1

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