パワポvbオブジェクト(その2)



オブジェクト

各クラス,メソッド,プロパティは,オブジェクトブラウザ (ctrl cmd b)で調べられます.

グレーの四角いのはプロパティ.
緑が飛んでるアイコンはメソッド.

いくつかのクラスのプロパティ,メソッドは,グローバルで呼び出せる.

オブジェクトの代入

Setが必要なことに注意.

Set obj = Object


オブジェクトブラウザ

オブジェクトの簡易辞書みたいなもの.
リボンでは段ボールのやつ.
引数における列挙型の確認はこれで十分.

ヘルプ(人間作成)と違っていたら,こちらを優先した方がいいかも.

アイコンについて:

赤青黄の点:オブジェクト
グレーの手:プロパティ (ver. 2013では青い四角)
飛んでる緑:メソッド
青:オブジェクトの規定メンバ
生ゴミ:モジュール
黄色い四角x2:列挙型
灰色の四角:定数










図形オブジェクト Shape

追加する関係はShapesにて説明する。

書式をコピー&ペーストする

Slide.Shapes(1).PickUp
Slide.Shapes(2).Apply


図形を削除する

Shape.Delete

returns:

Null?

選択する

Shape.Select(Replace=msoTrue)

Replace:

msoTriState.
選択範囲に追加する:msoFalse
選択範囲を置き換える:msoTrue

拡大・縮小する

Shape.ScaleWidth(Factor, RelativeToOrginalSize, fScale=msoScaleFromTopLeft)
Shape.ScaleHeight(Factor, RelativeToOrginalSize, fScale=msoScaleFromTopLeft)

Factor As Single:

倍率.10%なら1.1を指定.

RelativeToOrginalSize As MsoTriState:

元のサイズに対して拡大・縮小するか.
現在のサイズをもとにする場合はmsoFalseを指定.

fScale As MsoScaleFrom:

どこを固定するか.
右下:msoScaleFromBottomRight
中央:msoScaleFromMiddle
左上:msoScaleFromTopLeft

前後関係を移動させる

Shape.ZOrder(ZOrderCmd)


ZOrderCmd

msoZOrderCmd
msoBringToFront (= 0)
msoSendToBack (= 1)
msoBringForward (= 2)
msoSendBackward (= 3)
msoBringInFrontOfText (= 4) (wordのみ)
msoSendBehindText (= 5) (wordのみ)

例:最背面から3個目にする

Set myDocument = ActivePresentation.Slides(1)
With myDocument.Shapes.AddShape(msoShapeOval, 100, 100, 100, 300)
    While .ZOrderPosition > 4
        .ZOrder msoSendBackward
    Wend
End With


位置と大きさ

位置はスライドの上/左からの値。ポイント単位。

Shape.Top
Shape.Left
Shape.Width
Shape.Height


戻り値

Single

ポイントについて

Excelなら、ApplicationオブジェクトにCentimetersToPoints(arg)が使えるかもしれない。パワポはない。
https://www.ddc.co.jp/words/archives/20090701114500.htmlによると、印刷物を扱うソフト(Desktop Publishing; DTP)では、1 pt. = 1 inch/72と定義されることが多い。
JISやアメリカ式ポイントだと、1 pt. = 0.3514 mmと定義される。
なお、



Shapeの種類

Shape.Type As msoShapeType

ブレースホルダー
・図形(挿入するやつ):msoAutoShape (1)
吹き出し??図形の吹き出しは図形カテゴリ:msoCallout (2)
グラフ:msoChart (3)
コメント:msoComment (4)
・フリーフォーム,頂点変更した場合:msoFreeform (5)
・グループ:msoGroup (6)
埋め込み OLE オブジェクト:msoEmbeddedOLEObject (7)
フォーム コントロール:msoFormControl (8)
・直線:msoLine (9)←矢印で挿入した場合はこれではなく、図形(:msoAutoShpae (1))判定。直線を矢印にした場合はこれ。
リンク OLE オブジェクト:msoLinkedOLEObject (10)
リンク画像:msoLinkedPicture (11)
OLE コントロール オブジェクト:msoOLEControlObject (12)
・画像:msoPicture (13)
プレースホルダー:msoPlaceholder (14)
テキスト効果:msoTextEffect (15)
メディア:msoMedia (16)
・テキスト ボックス:msoTextBox (17)
スクリプト アンカー:msoScriptAnchor (18)
・表:msoTable (19)
Canvas:msoCanvas (20)
ダイアグラム:msoDiagram (21)
インク:msoInk (22)
インク コメント:msoInkComment (23)
SmartArt グラフィック:msoIgxGraphic (24)
Slicer:msoSlicer (25)
Web ビデオ:msoWebVideo (26)
コンテンツ Office アドイン:msoContentApp (27)
グラフィック:msoGraphic (28)
リンクされたグラフィック:msoLinkedGraphic (29)
3D モデル:mso3DModel (30)
リンクされた 3D モデル:msoLinked3DModel (31)
図形の種類の組み合わせ:msoShapeTypeMixed (-2)

例:テキストボックスかを判定する

If Shape.Type = msoTextBox


図形の種類

Shape.AutoShapeType

184種類.https://learn.microsoft.com/en-us/office/vba/api/office.msoautoshapetype
その他の図形(-2)があるが,これを代入すると無限ループ.
なお,挿入方法によって,値が異なる場合がある.
プレースホルダー(スライドのスタイルのコンテンツ部分のアイコンから挿入できる)から挿入する場合と挿入タブから挿入する場合で異なる.

代表的なやつ:

直線:msoShapeMixed (-2) (その他の状態)
四角形,テキストボックス,画像:msoSHapeRectangle (1)
右矢印:msoShapeRightArrow (33)
下矢印:msoShapeDownArrow (36)

頂点編集したもの (Not supported):msoShapeNotPrimitive (138)

グループの要素

Shape.GroupItems

グループ内の最小要素群を得られる。
グループをグループ化した場合、グループとしての要素は得られない。

テキスト関係

Shape.TextFrame
Shape.TextFrame2 (マスターテキストを含まないread only)

二つあって,違いはよくわからない.

戻り値:

TextFrameオブジェクト
TextFrame2オブジェクト(2は2007から,少し優位)

名前

Shape.Name

戻り値:

String

アスペクト比

Shape.LockAspectRratio

returns As MsoTriState:

固定する:msoTrue
固定しない:msoFalse

角度

Shape.Rotation

returns:

Single
0 ≤ shp.Rotation < 360の値.


値の入力ができるはずだけど,一度Shape.Rotaionの形式で代入しないと無理だった.

shp.rotation = shp.rotation
shp.rotatoin = 45

入力は負の値でも360以上でも可能.

反転(直線,矢印の向き)

Shpae.HorizontalFlip
Shpae.VerticalFlip

読み取り専用.

returns:

msoTriState
左上 -> 右下の方向が正になっている.
そうでない場合は反転になっている:msoTrue.

頂点

Shape.Nodes

returns:

ShapeNodesコレクション

各コンテンツの種類

Shape.HasChart    ' グラフ
Shape.HasTable    ' 表
Shape.HasSmartArt
Shape.HasTextFrame    ' テキストの入力が可能
Shape.Connector    ' コネクタ (Has要らず)

returns As MsoTriState:

真:msoTrue
偽:msoFalse
グループ内にグラフがある状態でも そのグループのHasChartの値はFalse.
Hasではなく,Isの方が適していると考えれらる.

コネクタの判定と関する設定

Shape.Connector
shape.ConnectorFormat

戻り値

msoTriState,ConnectorFormatオブジェクトが返ってくる

図形の枠線に関する設定

Shape.Line

戻り値: LineFormat

LineFormatオブジェクトを取得できる.

図形の塗りつぶしに関する設定

Shape.Fill

戻り値

FillFormatオブジェクト。
例:塗りつぶし無し

Shape.Fill.Visible = msoFalse


線に関する設定

Shpae.Line

returns:

LineFormatオブジェクト.

影に関する設定

Shape.Shadow

戻り値

ShadowFormatオブジェクト

文字を入力できるフラグ

Shape.HasTextFrame


最背面からの位置

Shape.ZOrderPosition

読み取り専用。

戻り値

Long
最背面のものが1、最前面がShapes.Count。




図形オブジェクトのコレクション Shapes

https://learn.microsoft.com/ja-jp/office/vba/api/powerpoint.shapes
スライドの下側にあるものから格納されてる.
現在のスライドのshapesを取得するには、ActiveWindow.View.Slide.Shapes

プレースホルダーコレクション

Shapes.Placeholders

プレースホルダーのShapeが集められてる.
タイトルが欲しい場合,Shapesコレクションにタイトルプロパティがあるのでそちらを使う.
なお,フッターに関してはプレースホルダーであるがこのコレクションではなく,HeadersFootersオブジェクトがある.

タイトルの有無(プレースホルダー)

Shapes.HasTitle

returns:

msoTriState

タイトル(プレースホルダー)

Shapes.Title

タイトルがない場合エラーになる.

returns:

タイトルのShapeオブジェクト.


ShapeRangeオブジェクトを取得する

Shapse.Range (index)
Shapes.Range(Array(1,3))  '図形1と図形3

index

図形のインデックス (Integer),図形の名前 (String),いずれかの行列 (Array).
省略した場合,全ての図形のShapeRangeオブジェクトを返却.

なお,一つの図形に関して扱う場合は,このメソッド(Shapes.Range(1) etc.)を使わずに,Shapes(1)とすれば良い。

指定したNameをもつShapeを取得する

メソッドではないが、よく使いそうなので記載。

Dim shp_tmp As shape, shp As shape
For Each shp_tmp In ActiveWindow.Presentation.SlideMaster.Shapes
  If shp_tmp.Name = "hoge" Then
    Set shp = shp_tmp
    Exit For
  End If
Next shp_tmp

If shp Is Nothing Exit Sub

Debug.print shp.Name




テキストボックスを追加する

Shpaes.AddTextbox(Orientation, Left, Top, Width, Height)

Orientation As msoTextOrientation:

テキストの方向.
横方向:msoTextOrientationHorizontal (1)
上向き:msoTextOrientationUpward (2)
下向き:msoTextOrientationDownward (3)
縦:msoTextOrientationVertical (5)
アジア用の縦方向もある.
https://learn.microsoft.com/en-us/office/vba/api/office.msotextorientation

Lef, Topt AS Single:

位置 (pt).

Width, Height As Single:

幅,高さ (pt).

returns:

Shape

例:

Sub AddTextbox()
    Dim textbox As Shape
    Set textbox = ActiveWindow.Selection.SlideRange(1).Shapes.AddTextbox( _
                    msoTextOrientationHorizontal, _
                    ActiveWindow.Presentation.PageSetup.SlideWidth / 2, _
                    ActiveWindow.Presentation.PageSetup.SlideHeight / 2, 0, 0)

    textbox.TextFrame.DeleteText
    textbox.TextFrame.TextRange.Select
    textbox.textframe.TextRange.Font.Size = 16
End Sub


線を追加する

Shapes.AddLine(BeginX, BeginY, EndX, EndY)

BeginX, BeginY, EndX, EndY

始点の左・上からの距離、終点の左・上からの距離 (pt)。

戻り値

Shape


図形を追加する

Shapes.AddShape(Type, Left, Top, Width, Height)


Type

MsoAutoShapeType。図形の種類。下記に各図形と名称を記載。
184種類.https://learn.microsoft.com/en-us/office/vba/api/office.msoautoshapetype

Left, Top, Width, Height

左,上からの距離 (pt).幅,長さの距離.{pt}

例:
四角:
円:
8-point星:msoShape8pointStar (= 93)










折れ線を追加する

Shapes.AddPolyline(SafeArrayOfPoints)

SafeArrayOfPoints As Variant:

折線の頂点の座標値(左からの距離,上からの距離)の配列.
閉じた多角形にするには,始点と終点を同じ座標軸にする.(塗りつぶされる)

returns:

Shape

例:三形を作る

Dim triArray(1 To 4, 1 To 2) As Single

    triArray(1, 1) = 25
    triArray(1, 2) = 100
    triArray(2, 1) = 100
    triArray(2, 2) = 150
    triArray(3, 1) = 150
    triArray(3, 2) = 50
    triArray(4, 1) = 25   
    triArray(4, 2) = 100

Set myDocument = ActivePresentation.Slides(1).Shapes.AddPolyline SafeArrayOfPoints:=triArray

Arrayの頂点の指定はもっと簡単な方法があるかも.

コネクタを追加する

Shape.AddConnector(Type, BeginX, BeginY, EndX, EndY)

Type As MsoConnectorType:

直線コネクタ:msoConnectorStraight (1)
エルボ コネクタ:msoConnectorElbow (2)
曲線コネクタ:msoConnectorCurve (3)
その他:msoConnectorTypeMixed (-2)

BeginX, BeginY, EndX, EndY As Single:

コネクタの始点の左,上から距離,コネクタの終点の左,上からの距離 (pt).

returns:

Shape

画像を追加する

Shape.AddPicture(FileName, LinkToFile, SaveWithDocument, Left, Top, Width, Height)

FileName As String:

ファイル名.絶対パスじゃないとダメかも.

LinkToFile As MsoTriState, SaveWithDocument:

画像がファイル内に保存されるかだと思う.
どちらもmsoTrueでいいと思う.

Left, Top:

左,上からの距離.

Width, Height:

幅,高さ.縮小,拡大される.

returns:

Shape

表を追加する

Shpaes.AddTable(NumRows, NumColumns, Left, Top, Width, Height)

NumRows, NumColumns As Long:

表の行・列数.

Left, Top As Single:

左,上からの位置 (pt).

Width, Height As Single:

表の幅,高さ (pt).

returns:

Shapeオブジェクト.




複数の図形を扱うオブジェクト ShapeRange

https://learn.microsoft.com/ja-jp/office/vba/api/powerpoint.shaperange

選択中のオブジェクト

ActiveWindow.Selection.ShapeRange



整列する

ShapeRange.Align(AlignCmd, RelativeTo)

AlignCmd As msoAlignCmd:

整列の種類.
左揃え:msoAlignLefts (0)
左右中央揃え:msoAlignCenters (1)
右揃え:msoAlignRights (2)
上揃え:msoAlignTops (3)
上下中央揃え:msoAlignMiddles (4)
下揃え:msoAlignBottoms (5)

RelativeTo As msoState:

図形でなく,スライドに揃える.

削除する

ShapeRange.Delete


グループにする

ShapeRange.Group


例:選択中の図形をグループにする

ActiveWindow.Selection.ShapeRange.Group.select



要素

ShapeRange.Item(index)

index

取り出すShapeオブジェクトののインデックス。1基底。
既定メンバ。
格納されるのは選択した(クリックした)順。
同時に複数を選択した(ドラッグで選択した)場合は下にある順で格納されている。

オブジェクトの数

ShapeRange.Count

返却値:

Long

回転角度

ShapeRange.Rotation


返却値:

Single






枠線の書式設定オブジェクト LineFormat

https://learn.microsoft.com/en-us/office/vba/api/powerpoint.lineformat (2022年9月)
Shape.Lineで取得できる。

線無し

LineFormat.Visible

msoFalse/msoTrueで指定する。

LineFormat.ForeColor

背景色もあるみたい(?)

戻り値

ColorFormatオブジェクト.

LineFormat.Weight


矢印

LineFormat.BeginArrowheadLength
LineFormat.BeginArrowheadWidth
LineFormat.BeginArrowheadStyle
LineFormat.EndArrowheadLength
LineFormat.EndArrowheadWidth
LineFormat.EndArrowheadStyle


実線・点線/一重線・多重線

LineFormat.DashStyle
LineFormat.Style

returns:

MsoLineDashStyle:
msoLineSolid (= 1)
msoLineSquareDot (= 2)
msoLineRoundDot (= 3)
msoLineDash (= 4)
msoLineDashDot (= 5)
msoLineDashDotDot (= 6)
msoLineLongDash (= 7)
msoLineLongDashDot (= 8)
msoLineLongDashDotDot (= 9)
msoLineSysDot (= 10)
msoLineSysDash (= 11)
msoLineSysDashDot (= 12)


LineFormat.ForeColor
LineFormat.Pattern


戻り値

ColorFormat

例:アクセント 5
msoThemeColorAccent5 (= 9)

透明度

LineFormat.Transparency


太さ

LineFormat.Weight

戻り値

Single




影の書式設定オブジェクト ShadowFormat

影の種類

ShadowFormat.Type


戻り値






テキストフレームオブジェクト TextFrame

(公式ドキュメント:TextFrame2 オブジェクト (PowerPoint) | Microsoft Learn
テキストのレイアウトに関するオブジェクト。
2007年からTextFrame2が導入された。2の方が上位互換?
以降の説明では、基本的にTextFrame2の説明とする。

垂直方向の配置(上/中央/下揃え)

TextFrame.VerticalAnchor



文字列の方向(水平/垂直)

TextFrame.Orientation


自動調整(なし,はみ出しの場合のみ,テキストに合わせる)

TextFrame.AutoSize


余白

TextFrame.MarginLeft
TextFrame.MarginRight
TextFrame.MarginTop
TextFrame.MarginBottom


図形内でテキストの折り返し

TextFrame.WordWrap

返却値

msoFlase: 折り返ししない
msoTrue: 折り返す

フレーム内のテキストのオブジェクト

TextFrame.TextRange

戻り値

TextRangeオブジェクト

テキスト削除

TextFrame.DeleteText


文字列の有無

TextRange.HasTextFrame


戻り値

MsoTriState (msoFalse/msoTrue)





テキストを処理するオブジェクト TextRange

https://learn.microsoft.com/ja-jp/office/vba/api/powerpoint.textrange

テキスト

TextRange.Text

戻り値

String

文字数

TextRange.Length

x

フォント

TextRange.Font

戻り値

Fontオブジェクト

段落書式

TextRange.ParagraphFormat

戻り値

ParagraphFormatオブジェクト

文字の高さ/幅・位置

TextRange.BoundHeight
TextRange.BoundWidth
TextRange.BoundLeft
TextRange.BoundTop

読み取り専用.
テキストボックスの大きさではなく,余白=0地点と思われる.
余白0であっても若干の余白がある.大体フォントサイズ * 0.01 cmくらい.
これテキストボックスが回転した場合,回転後の位置を示す(Shape.Top等は回転しても回転前が適用される).

戻り値

Single
ポイント単位.

文字の位置

TextRange.BoundLeft
TextRange.BoundTop

読み取り専用.
テキストボックスではなく,純粋に文字との距離.

戻り値

Single.
ポイント単位.

文字列の選択

TextRange.Select


文字列のコピー/ペースト

TextRange.Copy
TextRange.Paste

クリップボードにコピーされる.

テキストを削除する

TextRange.Delete


テキストを前/後に挿入する

TextRange.InsertBefore(new_text)
TextRange.InsertAfter(new_text)


スライド番号を追加する

TextRange.InsertSlideNumber

スライドマスターでおこなうと、スライド番号を表す<#> を挿入できる。
TextRange.Textに、ただ"<#>"の文字列を代入するだけだと、スライド番号に変更されず<#>のまま表示されてしまうので、このメソッドが必要。
なお、既に文字があるTextRangeに挿入する場合は、末尾に挿入される。

文字列の検索

TextRange.Find


文字列の置換

TextRange.Replace


前後の空白を削除する

TextRange.TrimText


戻り値

TextRange

With Application.ActivePresentation.Slides(1).Shapes(2) _
        .TextFrame.TextRange
    With .InsertBefore("   Text to trim   ")
        MsgBox "Untrimmed: " & """" & .Text & """"
        MsgBox "Trimmed: " & """" & .TrimText.Text & """"
    End With
End With

??機能していない??

Trim関数が用意されているのでそれを使うとよい。