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

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

Powerpoint VBA 基本② オブジェクトの取得

基本の②です。最低限抑えたほうがいいオブジェクトについて説明をします。
オブジェクトという言葉の説明は素人のわたしでは難しいですが,文字や数値のように単純なものではなく,いろいろな要素を含むもの,という感じです。無理に日本語に訳すのではなく,いろいろなオブジェクトに触れ,その概念を自分の頭に作り上げるのがいいかと思います。

パワーポイントはスライド単位で構成されていて,だいたい表でもテキストボックスでも絵でもシェイプの仲間のようなイメージでアクセスしていきます。
ですから,スライドの指定,シェイプの指定の仕方を最低限抑える必要があります。シェイプは図形みたいなイメージでいいかと思います。

スライドの指定は ActivePresentation.Slides (1) のように指定します。
1はIDですがスライド番号と考えてもらって差し支えないことがほとんどです。ExcelVBAをしていた人だと,Excelではシートの順序という考え方をあまりしないのでIDで指定するのに抵抗はあるかもしれません。スライド名の把握は面倒なので("Slide1"とか単純ではありますが),スライド番号=スライドのIDと考えて制御してさしつかえないと思います。

マクロ記録が無いPowerpointではインテリセンス(コード入力候補を自動的に表示してくれる機能です。)は強力な味方なので,コードの早いうちに操作するオブジェクトを変数に入れてしまいましょう。スライドはオブジェクトの仲間なのでSet を使って変数に代入します。インテリセンスを働かせるためには,スライドはSlideとして宣言します。


例)

Dim Slide1 As Slide
Set Slide1 = ActivePresentation.Slides(1)

スライド番号が決まって動かない場合はこんな感じでも宣言できます。私はスライド番号がころころ変わるので 対象のスライドという意味を込めて TargetSlideとかTSldとかをよく使います。自分がしっくり来て,あまり長くなりすぎない変数名を決めていくといいかと。


次にシェイプの指定です。
さきほどの宣言したスライド変数を利用したらコードが短く,インテリセンスも利用しやすくなります。
多数のシェイプを扱うことになるので,IDで制御するのは難しいから名前で制御するのがいいと思いますが,
パワーポイントが勝手につける名前は長い上にスペース等を含むので扱いが大変。

ですから,扱う対象の名前を自分好みに変えましょう。
[ホーム]→[オブジェクトの選択と表示]→右側にシェイプの名前一覧が出て,これは編集が可能です。
f:id:chemiphys:20170108221406p:plain
扱いやすく判別しやすい名前に変えてしまいましょう。同じ名前を使うと困ったことになるので同じスライド内では重複しないように気を付けましょう。

この例では,free1という名前に変えています。free1というシェイプは次のように書きます。
ActivePresentation.Slides(1).Shapes("free1")
またはさきほどのスライドのオブジェクト変数を使って
Slide1.Shapes("free1")
と書けます。

次はよく制御することになるであろう,テキストボックスの制御
ほとんどのシェイプは文字を持たせられると思います。全部かどうかは知りません。
そのテキストボックスのいろいろな設定については TextFrameとTextRangeの二つのオブジェクトのどちらかを制御することが多いです。
ActivePresentation.Slides(1).Shapes("free1").TextFrame.TextRange.Text="入れたい文字"

先ほどまでのシェイプの指定に続けてTextFrame→TextRangeと続きます。
例えば右寄せや左寄せなどの指定は TextFrameのほう
細かい文字の設定などはTextRangeのほう みたいな感じです。
TextRangeの後のTextは省略可能なので,省略されていることも多いです。

最後に表です。
表もShapeの仲間です。なので,今までと同じようにまずは扱いやすい名前をつけることを勧めます。ここではTable1とつけました。
f:id:chemiphys:20170108223330p:plain
表は
ActivePresentation.Slides(1).Shapes("Table1").Table
と指定します。表を扱う場合はまずここまでをオブジェクト変数に入れた方が後の処理がしやすいので,

Dim Table1 As Table
Set Table1 = ActivePresentation.Slides(1).Shapes("Table1").Table

みたいに書けばいいです。Table1かぶせたのはあまりよくなかったですね(;´▽`A``

図のように,各セルはCell(行,列)という形で指定するんですが,そのそれぞれのセルの値へのアクセスが大変。

Table1.Cell(2, 1).Shape.TextFrame.TextRange.Text="入れたい文字"

こんな感じでCell()の後に結構長く書いてあげないと中の文字は扱えません。

とりあえず②はここまでにしておきます。数限りなくオブジェクト等がありますが,主に使うのはこの辺だと思います。