三流君 ken3のmemo置き場

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

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

パワポ マクロ 図形の配置 整列を探る PowerPoint VBA ShapeRangeに対してAlign Distribute メソッドを使用

知恵袋の質問に、PowerPointで図形を左揃え、上揃え、均等の質問があったので、
パワポ VBA ユーザフォームで図形の配置 整列を探ってみました。

知恵袋の質問
detail.chiebukuro.yahoo.co.jp
↑に回答してみました。

下記、いつもの あのあの そのその イライラ解説動画・・・
youtu.be
https://youtu.be/46MBczsYmww
目次
00:00 挨拶、処理内容
00:59 0.テスト実行
02:00 1.コードの説明
04:48 2.便利なユーザフォームのモードレス モード
07:32 3.簡単なエラーチェック
09:51 均等の時は選択数をチェック
12:50 4.蛇足で他のプレゼンでテスト

0.テスト実行
はじめにテスト結果を見せる。

作成したと言っても、選択されたオブジェクトにメソッドを一行実行しただけです。

1.選択されているオブジェクト
ActiveWindow.Selection
で、選択されたオブジェクトが取得できるので、

選択されたシェイプ 図形・テキストボックス
ActiveWindow.Selection.ShapeRange
に対して、

1.1 .Align メソッドで位置指定

ShapeRange.Align メソッド (PowerPoint)
https://docs.microsoft.com/ja-jp/office/vba/api/powerpoint.shaperange.align
を参考に
'単純に選択シェイプに対して.Alignメソッドで左寄せ
ActiveWindow.Selection.ShapeRange.Align msoAlignLefts, msoFalse

https://docs.microsoft.com/ja-jp/office/vba/api/office.msoaligncmd

名前 値 説明
msoAlignBottoms 5 指定されたオブジェクトを下揃えにします。
msoAlignCenters 1 指定されたオブジェクトを左右中央揃えにします。
msoAlignLefts 0 指定されたオブジェクトを左揃えにします。
msoAlignMiddles 4 指定されたオブジェクトを上下中央揃えにします。
msoAlignRights 2 指定されたオブジェクトを右揃えにします。
msoAlignTops 3 指定されたオブジェクトを上揃えにします。

1.2 .Distribute メソッドで均等 整列
ShapeRange.Distribute メソッド (PowerPoint)
https://docs.microsoft.com/ja-jp/office/vba/api/powerpoint.shaperange.distribute
を参考に
'単純に選択シェイプに対して.Distributeメソッドで 左右均等
ActiveWindow.Selection.ShapeRange.Distribute msoDistributeHorizontally, msoFalse

https://docs.microsoft.com/ja-jp/office/vba/api/office.msodistributecmd

名前 値 説明
msoDistributeHorizontally 0 左右に整列させます。
msoDistributeVertically 1 上下に整列させます。


2.便利なユーザフォームのモードレス モード
上記コードで、コマンドっぽく、VBAで処理ができたので、
あとは、
ユーザーフォームを開くときに、

Sub テストフォームを開く()

    UserForm1.Show vbModeless  'vbModelessで開き、操作テスト

End Sub


.Show vbModeless モードレス モードで開くと、
UserFormを開いたまま、パワポを操作できるので、連続作業の時、便利かなぁ。

3.簡単なエラーチェックしかしていませんが

3.1 Selection.Type 選択されたオブジェクトは何?
ActiveWindow.Selection.Type で選択されているオブジェクトのタイプがわかります
シェイプ 図形やテキストボックス を未選択で処理を走らせるとエラーが起こるので、
チェックしてみました。

    If ActiveWindow.Selection.Type <> ppSelectionShapes Then
        MsgBox "Shape図形やテキストボックスを選択してね"
        Exit Sub
    End If

3.2 .ShapeRange.Count 選択されたシェイプの数
均等割り付けには、3つ以上のオブジェクトが必要なので、
.ShapeRange.Countでチェックしてみました。

    '均等には3つ以上オブジェクトが必要なので.Count < 3でチェック
    If ActiveWindow.Selection.ShapeRange.Count < 3 Then
        MsgBox "3つ以上Shape図形やテキストボックスを選択してね", vbInformation
        Exit Sub
    End If

作成したソースコード

'標準モジュール
Sub テストフォームを開く()
    UserForm1.Show vbModeless  'vbModelessで開き、操作テスト
End Sub

'UserForm1に4つボタンを作りテストしました
Option Explicit

Private Sub CommandButton1_Click()
    If ActiveWindow.Selection.Type <> ppSelectionShapes Then
        MsgBox "Shape図形やテキストボックスを選択してね"
        Exit Sub
    End If
    
    '単純に選択シェイプに対して.Alignメソッドで左寄せ
    ActiveWindow.Selection.ShapeRange.Align msoAlignLefts, msoFalse

End Sub

Private Sub CommandButton2_Click()
    If ActiveWindow.Selection.Type <> ppSelectionShapes Then
        MsgBox "Shape図形やテキストボックスを選択してね"
        Exit Sub
    End If
    
    '単純に選択シェイプに対して.Alignメソッドで上そろえ
    ActiveWindow.Selection.ShapeRange.Align msoAlignTops, msoFalse
    
End Sub

Private Sub CommandButton3_Click()
    If ActiveWindow.Selection.Type <> ppSelectionShapes Then
        MsgBox "Shape図形やテキストボックスを選択してね"
        Exit Sub
    End If
    
    '均等には3つ以上オブジェクトが必要なので.Count < 3でチェック
    If ActiveWindow.Selection.ShapeRange.Count < 3 Then
        MsgBox "3つ以上Shape図形やテキストボックスを選択してね", vbInformation
        Exit Sub
    End If
    
    '単純に選択シェイプに対して.Distributeメソッドで 左右均等
    ActiveWindow.Selection.ShapeRange.Distribute msoDistributeHorizontally, msoFalse
 
End Sub

Private Sub CommandButton4_Click()
    If ActiveWindow.Selection.Type <> ppSelectionShapes Then
        MsgBox "Shape図形やテキストボックスを選択してね"
        Exit Sub
    End If

    '均等には3つ以上オブジェクトが必要なので.Count < 3でチェック
    If ActiveWindow.Selection.ShapeRange.Count < 3 Then
        MsgBox "3つ以上Shape図形やテキストボックスを選択してね", vbInformation
        Exit Sub
    End If

    '単純に選択シェイプに対して.Distributeメソッドで 上下均等
    ActiveWindow.Selection.ShapeRange.Distribute msoDistributeVertically, msoFalse

End Sub

参考URL:

ShapeRange.Align メソッド (PowerPoint)
https://docs.microsoft.com/ja-jp/office/vba/api/powerpoint.shaperange.align

ShapeRange.Distribute メソッド (PowerPoint)
https://docs.microsoft.com/ja-jp/office/vba/api/powerpoint.shaperange.distribute

などを参考にするとよいのでは?

処理のヒント・参考となれば幸いです。

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。
・[Excel/Access VBA]の解説
・[ASP(Active Server Pages)]の解説。
・[元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
・[プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
三流君を踏み台にする
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



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