Shapeをスライドの中央に配置するPowerPointマクロをご紹介したところ、Microsoft MVPのきぬあささんから
「ShapeRangeのAlignメソッドを使っていないのは何か理由が!」
というツッコミをいただきました。
ありがとうございます!!
完全に失念していました(汗)
何かを中央に配置する
何かを中央に配置したい、という要望は、いろいろな場面でいただきます。
前回の記事は、PowerPointの画像をスライドの中央に配置したいという要望がキッカケだったわけですが、その他の物でも、中央に配置したいという要望をよくいただきます。
例えば、
「ブラウザを最大化しないで開いて画面の中央に配置したい」
というのが、昔よくいただいた、中央に配置したい要望の代表例です。
こんな要望をいただいたときに、全体のサイズを半分にした値から、中央に配置したいもののサイズを半分にした値を引き算して、得られた値を、左上の位置指定に利用する、というのはどんな場合でも使える定番の処理です。
この考え方が、
「パワーポイント マクロ 画像 中央」
という検索キーワードを見たときに、私の頭の中には真っ先に浮かんだため、他の可能性を一切考えずに、前回の記事を書きました。
ShapeRangeオブジェクトのAlignメソッドで中央に配置するサンプルマクロ
きぬあささんのご指摘どおり、PowerPointでShapeをスライドの中央に配置するという目的であれば、ShapeRangeオブジェクトのAlignメソッドを利用するほうが、シンプルなコードになります。
Dim msg As String
With ActiveWindow.Selection
''Shapeが選択されていない場合はマクロを終了
If .Type = ppSelectionNone _
Or .Type = ppSelectionSlides Then
msg = "中央に配置したいShapeを選択してください。"
MsgBox msg
Exit Sub
End If
With .ShapeRange
''左右中央に配置
.Align _
AlignCmd:=msoAlignCenters, _
RelativeTo:=msoTrue
''上下中央に配置
.Align _
AlignCmd:=msoAlignMiddles, _
RelativeTo:=msoTrue
End With
End With
End SubShapeRangeオブジェクトのRangeメソッドの引数を、
AlignCmd:=msoAlignCenters, _
RelativeTo:=msoTrue
と指定することで、そのShapeRangeはスライドの左右中央に配置され、
同じくShapeRangeオブジェクトのRangeメソッドの引数を、
AlignCmd:=msoAlignMiddles, _
RelativeTo:=msoTrue
と指定することで、そのShapeRangeはスライドの上下方向の中央に配置されます。
ShapeRange.Alignの引数・AlignCmdでShapeRangeをどう配置するのかを指定し、引数・RelativeTo:=msoTrueでスライドの端からを基準にしています。
第1引数については、AlignCmdという名前がイマイチであること、指定する定数msoAlignCenters・msoAlignMiddlesなどから引数の意味がわかることから、名前付き引数を使わないほうがいいと感じるのですが、、第2引数・RelativeToのほうは名前付き引数にしておかないとmsoTrueだけでは意味がわからなくなってしまうため、なんだかモヤモヤした気持ちを抱えつつ、ここでは名前付き引数を使ったコードにしています。
算数をするかShapeRange.Alignを使うか
マクロ初心者の方に、前回ご紹介した全体から対象を引いて半分にするという算数をする手法と、今回のShapeRange.Alignのどちらをおすすめするかと問われれば、やっぱり前回の方法を、まずはご紹介します。
これは、英会話ができることを目指して英語の学習をはじめた初心者に、動詞をたくさん覚えることをすすめるか、まずhave・take・getの用法を覚えることをすすめるか、に近いと考えています。
フランクな日常英会話ができることを目指して学習している初心者の場合、たくさんのあまり使わない動詞を覚えるよりは、まずはhave・take・getのような、いろいろな使いかたのできる便利な動詞の、さまざまな用法を覚えるほうが、応用が効いて実用的なはずです。
ShapeRange.Alignメソッドを知っていれば、今回のようにコードを短くするというメリットはありますが、全体から対象を引いて半分にするという算数をする考え方のほうが、いろいろなケースで応用が効きますから、先にご紹介するのは、やっぱり算数のほうだと私は感じます。
今回のケースでは、全体のサイズから対象のサイズを引いて半分にするという算数を、すぐに理解できない方もいらっしゃるはずです。そのときに是非、紙と鉛筆を使って自分で考えるということをやっていただきたいのです。この自分で考えるということが、プログラミングをする上では絶対に必要ですから。
算数を使った手法を知り、納得していただいて上で、今回のShapeRange.Alignを紹介する、という流れを私はやっぱり採ります。
自然言語でも人工言語でも、使える語彙の多いことは基本的にはいいことですから、算数を使った手法を理解した上でShapeRange.Alignを使うことは勿論OKです。
私自身の課題としては、ShapeRangeオブジェクトのRangeメソッドのことを完全に失念して前回の記事を書いたことは、大きな反省点です。。
きぬあささん、ツッコミをありがとうございました!!
Home » パワーポイントマクロ・PowerPoint VBAの使い方 » Shapesコレクション・Shapeオブジェクト » ShapeRangeのAlingnメソッドで図形を中央に配置するパワポマクロ