三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

パワポ 選択されたオブジェクト・シェイプに名前を付ける PowerPointVBA Shape Name

PowerPoint Shape.Name を使用して名前を付ける。
Shape.ID をプラス、連番をShape.Nameにセットしたり。
同じ名前が許される不思議???

事前準備として、
パワーポイントで設置したオブジェクトに対して、
名前を付ける、名前を付け直す。
そんな処理をマクロで行ってみます。

上司・先輩から
スライド内の画像をシャッフルするマクロを作るので、
オブジェクト・画像に固有の名前を付けといて?
と言われました。

指示内容:
スライド内の画像の名前を
マクロ・VBAで使用しやすいように、
オブジェクトに名前を付ける
操作画像XXXと名前規則の指定を受ける。
www.youtube.com
https://www.youtube.com/watch?v=YcbjdXfk94A
目次
00:00 やりたいこと 実行結果
01:16 1.手作業でガンバッテ名前を付ける
02:13 2.選択されたシェイプに名前+IDを付け 固有の名前にする
05:36 3.名前は連番にしてください と 追加オーダーを受ける
09:28 あたま001や015など、0付きで桁をそろえた連番にしたい
11:17 3.1 気になること、同じ名前でエラーにならないの?
12:07 3.2 名称変更後と変更前のデフォルト コピペの違い?
13:43 4.終わりの挨拶
14:00 おまけ:次回動画のネタを先行して?

1.手作業でガンバッテ名前を付ける

ホーム 配置 オブジェクトの選択と表示
から
手作業で 操作画像XXX と 名前を付ける


2.選択されたシェイプに名前+IDを付け 固有の名前にする

PowerPoint.Shape
シェイプのオブジェクト
.Nameプロパティに値を代入して、
名前を変更します。

固有の名前にしたかったので、
.ID プロパティを使用します。

下記、サンプルコードです。

単純に
strNewName = InputBox("名前の頭 XXXは?", "名前入力", "名前XXX")
で、頭の名前を決めて(入力してもらい)、

objShape.Name = strNewName & objShape.Id '新しい名前をセットする
後ろにオブジェクト・シェイプのIDをプラスしただけです。

Option Explicit

'選択されたシェイプに名前を付ける
'入力された名前 + .ID で重複しないようにする
'※連番でもよかったけど、IDを使ってみた。使ってみたかった・・・
Sub pp選択Shapeに名前プラスIDを付ける0601()

    If ActiveWindow.Selection.Type <> ppSelectionShapes Then  '種類の判断
        MsgBox "Shape図形やテキストボックスを選択してね"
        Exit Sub
    End If
    
    If ActiveWindow.Selection.ShapeRange.Count = 0 Then  '件数の判断
        MsgBox "Shape図形やテキストボックスを選択してね"
        Exit Sub
    End If


    Dim nPAGE As Integer
    Dim objSLD As PowerPoint.Slide   'スライド
    Dim objShape As PowerPoint.Shape 'シェイプ
    
    nPAGE = ActiveWindow.Selection.SlideRange.SlideIndex '現在選択しているページ
    Set objSLD = ActivePresentation.Slides(nPAGE)  'プレゼンの下、スライドnページをセット
    
    Dim strNewName As String   '新しくつける名前の頭文字
    strNewName = InputBox("名前の頭 XXXは?", "名前入力", "名前XXX")
    If strNewName = "" Then
        MsgBox "処理を中止しました、キャンセルします"
        Exit Sub
    End If
    
    Debug.Print "Id", "Name", "Type"

    Dim n As Long
    For n = 1 To ActiveWindow.Selection.ShapeRange.Count '選択された数までループ
        Set objShape = ActiveWindow.Selection.ShapeRange(n) '←この選択されたシェイプの名前を変更
        
        Debug.Print objShape.Id, objShape.Name, objShape.Type

        objShape.Name = strNewName & objShape.Id  '新しい名前をセットする
        DoEvents
    Next

    MsgBox "処理終了、配置 表示 から シェイプの名前を確認してください"
    DoEvents

End Sub

3.名前は連番にしてください と 追加オーダーを受ける

完成したので、依頼者(上司・先輩)に報告、結果を見せると
依頼者:「確かに固有の名前、一意の名称になっているけど、歯抜けがイヤだなぁ」

まぁ、作成してて、同じこと考えたけど、

依頼者:「仕様変更、再オーダー、名前+連番にしてください」

思い付きで、コロコロと・・はじめから言ってよね・・・
なんて、
小芝居を挟みつつ、

objShape.Name = strNewName & n '連番にする
で、単純にできると思います。

下記、サンプルコードです。

'選択されたシェイプに名前を付ける
'入力された名前 + 連番にする
'※使い方で、重複した名前が付けられるので、注意すること・・
Sub pp選択Shapeに名前プラス連番を付ける0601()

    If ActiveWindow.Selection.Type <> ppSelectionShapes Then  '種類の判断
        MsgBox "Shape図形やテキストボックスを選択してね"
        Exit Sub
    End If
    
    If ActiveWindow.Selection.ShapeRange.Count = 0 Then  '件数の判断
        MsgBox "Shape図形やテキストボックスを選択してね"
        Exit Sub
    End If


    Dim nPAGE As Integer
    Dim objSLD As PowerPoint.Slide   'スライド
    Dim objShape As PowerPoint.Shape 'シェイプ
    
    nPAGE = ActiveWindow.Selection.SlideRange.SlideIndex '現在選択しているページ
    Set objSLD = ActivePresentation.Slides(nPAGE)  'プレゼンの下、スライドnページをセット
    
    Dim strNewName As String   '新しくつける名前の頭文字
    strNewName = InputBox("名前の頭 XXXは?", "名前入力", "名前XXX")
    If strNewName = "" Then
        MsgBox "処理を中止しました、キャンセルします"
        Exit Sub
    End If
    
    Debug.Print "Id", "Name", "Type"

    Dim n As Long
    For n = 1 To ActiveWindow.Selection.ShapeRange.Count '選択された数までループ
        Set objShape = ActiveWindow.Selection.ShapeRange(n) '←この選択されたシェイプの名前を変更
        
        Debug.Print objShape.Id, objShape.Name, objShape.Type

        objShape.Name = strNewName & n  '連番にする
        '頭0を付けたい時は = strNewName & Format(n, "000") などアレンジしてね
        DoEvents
    Next

    MsgBox "処理終了、配置 表示 から シェイプの名前を確認してください"
    DoEvents

End Sub

3.1 気になること、同じ名前でエラーにならないの?

勘のいい視聴者:「連番処理、たまたま、動作してるでしょ?」
objShape.Name = strNewName & n '連番にする
で、
選択ミスなどで、同じ名前が残っていて、
エラーにならないの?

私も、気になっていたので、テストしてみます。

実は、同じ 画像1とか文字列1など、名称が同じでも認識する。
※嘘みたいなホントの話なので・・・

3.2 名称変更後と変更前のデフォルト コピペの違い?

あと、操作していて、気になったのが、

ア.デフォルトで、図形やテキストボックスを追加して、コピー貼り付けで増やした時

イ.名称変更後にコピー、貼り付けしたとき

この違いを実演して見せる。

ここも探らないとなぁ(内部的にはShape.Idで区別されているんだろうけど)
Shape.Nameが同じ・・・う~ん。。。

4.終わりの挨拶

いろいろ、脱線しましたが、
大量のオブジェクトに名前を付けてと言われたら、
このサンプルコードをアレンジして使ってみてください。

※対話式AI「Copilot」副操縦士のコパイロット様がパワーポイントに導入されたら、
 こんなマクロや作業は用済みなんだけど、
 あと数週間、数か月?待てないので使ってみてね。

おまけ:
画像をシャッフルするマクロ
作成中のマクロで遊ぶ。

次回の動画:
実験動画 マクロ パワポ スライド内 画像表示位置を入れ替えたい 単純に.Left .Topを入れ替えただけのテスト動画です
https://youtu.be/nrEzOnGEsZk

↑この動画で、大量の図形・画像オブジェクトの名前を変更したかったので、
今回の動画を作成しました。
次の動画も合わせてみてください。

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)