PowerPoint で表の列幅や行の高さが不揃いだと、見た目が悪く資料の品質が下がります。本記事では、1 クリックで均等化する UI 操作と複数表を一気に整える VBA、結合セル対応マクロを実機検証つきで解説します。
「Word は 2 列だけ選択して均等化できるのに PowerPoint はできない」と誤解されがちですが、実際にはどちらも複数セル選択で部分的に均等化できます。ただし均等化の単位は異なり、PowerPoint は選択列の全行が、Word は選択セルだけが平均化されます。
配布のマクロ有効ファイル(pptm)で実際の動作を確認しながら学べる構成です。実機検証範囲は Windows 11 Pro 25H2 と PowerPoint 2024 build 19929 です(日本語 UI、標準表、Windows 版のみ)。
サンプルファイル(.pptm)
本記事の操作と VBA をそのまま試せる配布用のマクロ有効 PowerPoint ファイルです。9 スライド構成で、不揃いの表・結合セル混在表・複数表配置・大規模表・行高検証データを収録しています。標準モジュール 4 個(基本マクロ・一括処理・結合セル検出・結合除外版)と、Slide 1 の「表を均等化」ボタン 4 個も同梱です。
配布 .pptm を開くときの 3 つの注意
- Windows ではインターネットから取得した .pptm はマクロがブロックされることがあります(「Mark of the Web」のため)。エクスプローラーでファイルを右クリック→「プロパティ」→「ブロックの解除」にチェックを入れて OK、または「セキュリティセンター」の「信頼できる場所」にダウンロードフォルダーを登録すると有効になります。
- 配布 .pptm のマクロは本文で紹介している表サイズ調整用のコードと同じ内容です。マクロを実行する前にコードを確認したい場合は、PowerPoint で開いてから
Alt + F11で VBE を開くとModule1_Basic〜Module4_SafeForMergesの中身が見えます。本記事の VBA コードを自分のファイルに直接貼り付けて実行することもできます。 - 業務ファイルに使う前に、必ずコピーしたうえで試してください。配布ファイルは入力用のサンプル表で動作確認することを想定しています。
表のセル幅を均等にする操作手順(最短解)
もっとも速いのは、表内のセルを 1 か所クリックしてからリボンに現れる「テーブル レイアウト」タブを使う方法です。表を選択した状態でないと、このタブは現れません。

「テーブル レイアウト」タブを開くと、中央に「セル サイズ」グループがあります。ここに「幅を揃える」「高さを揃える」のボタンが並んでいて、クリック 1 回で選択した表の全列幅または全行高が均等化されます。Microsoft Support の日本語ヘルプも同じタブ・グループ名で操作を案内しています。

列幅が [80, 440, 120, 160] のように不揃いだった 4 列の表を例に挙げます。「幅を揃える」を 1 回押すと全列が同じ幅 [200, 200, 200, 200] に並び直ります。行の高さは同じ場所の「高さを揃える」で全行が同じ値になります。
![均等化前のサンプル表(4 列、列幅 [80, 440, 120, 160] で大きく不揃い)](https://www.helpaso.net/wp-content/uploads/2026/05/helpaso-powerpoint-table-distribute-columns-rows-s3.webp)
![均等化後のサンプル表(4 列、列幅 [200, 200, 200, 200] にそろった状態)](https://www.helpaso.net/wp-content/uploads/2026/05/helpaso-powerpoint-table-distribute-columns-rows-s4.webp)
PowerPoint 内部のリボン定義では「幅を揃える」「高さを揃える」のラベル文字列に、表示用の見えない制御文字(U+200B、ゼロ幅スペース)が 2 個ずつ挟まっています。ただしユーザー画面上は通常の「幅を揃える」「高さを揃える」と同じに見えるため、コピー検索や OCR で照合する場合だけ注意してください。
「選択した列だけ均等化」する正しい方法(複数セル選択と VBA の制限)
「特定の列だけ均等化したい」場合は、表内の複数セルをマウスでドラッグ選択するか、Shift+矢印キーで選択範囲を広げてから「幅を揃える」を押します。表内のどこか 1 セルだけクリックした状態で実行すると、選択範囲は単一セルとして扱われ全列が均等化されます。
![単一セル選択時の Before(列幅 [80, 440, 120, 160] の不揃い表、セル 1 つだけ選択中)](https://www.helpaso.net/wp-content/uploads/2026/05/helpaso-powerpoint-table-distribute-columns-rows-s5a-before.webp)
![単一セル選択時の After(全列が均等化されて [200, 200, 200, 200] になった状態)](https://www.helpaso.net/wp-content/uploads/2026/05/helpaso-powerpoint-table-distribute-columns-rows-s5a-after.webp)
一方、複数セルを選択した状態で「幅を揃える」を実行すると、選択範囲に含まれる列のみが均等化され、それ以外の列は元の幅を保ちます。次の例は同じ初期幅 [80, 440, 120, 160] の表で、列 2 と列 3 にまたがる 2 セルを Shift+Right で選択してから「幅を揃える」を押した結果です。
![2 セル選択時の Before(列 2 と列 3 にまたがる 2 セルを選択した状態、列幅は [80, 440, 120, 160])](https://www.helpaso.net/wp-content/uploads/2026/05/helpaso-powerpoint-table-distribute-columns-rows-s5b-before.webp)
![2 セル選択時の After(列 2 と列 3 だけが平均化されて [80, 280, 280, 160] になった状態)](https://www.helpaso.net/wp-content/uploads/2026/05/helpaso-powerpoint-table-distribute-columns-rows-s5b-after.webp)
初期列幅 [40, 220, 120, 220] の 4 列表で、選択開始セルと Shift+Right の回数を変えて 6 ケース検証した結果は次のとおりです。
| ケース | 開始セル | Shift+Right 回数 | 結果(4 列の幅) | 解釈 |
|---|---|---|---|---|
| 1 | (1,1) | 0(単一セル) | [150, 150, 150, 150] | 全列均等化 |
| 2 | (1,2) | 0(単一セル) | [150, 150, 150, 150] | 全列均等化 |
| 3 | (1,1) | 1(2 セル) | [130, 130, 120, 220] | 選択列 1-2 のみ均等化 |
| 4 | (1,2) | 1(2 セル) | [40, 170, 170, 220] | 選択列 2-3 のみ均等化 |
| 5 | (1,1) | 2(3 セル) | [126.67, 126.67, 126.67, 220] | 選択列 1-3 のみ均等化 |
| 6 | (1,1) | 3(4 セル = 全選択) | [150, 150, 150, 150] | 全列均等化 |
VBA から同じ操作を自動化したい場合は注意点があります。PowerPoint VBA の Cell.Select() メソッドは単一セル選択しかできないため、コードから複数セル選択を直接再現できません。複数列のみを均等化したい場合は、後述の Table.Columns(i).Width = avg を対象列だけループする書き方で代替します。SendInput で Shift+Right を送る方法も検証では成功しましたが、ウィンドウのフォーカス状態に依存するため業務マクロでは推奨しません。
VBA でループ均等化する(基本マクロ)
表をクリックして「幅を揃える」ボタンを押す操作と同じ結果を、VBA でも数行で書けます。Table.Columns(i).Width を全列の平均値で書き換えるループ均等化マクロです。
' === Module1_Basic: 表 1 つを均等化する基本マクロ ===
Public Sub EqualizeTableColumns(ByVal tbl As Table)
Dim totalW As Single, eachW As Single, i As Long, n As Long
n = tbl.Columns.Count
totalW = 0
For i = 1 To n
totalW = totalW + tbl.Columns(i).Width
Next i
eachW = totalW / n
For i = 1 To n
tbl.Columns(i).Width = eachW
Next i
End Sub
Public Sub EqualizeTableRows(ByVal tbl As Table)
Dim totalH As Single, eachH As Single, j As Long, m As Long
m = tbl.Rows.Count
totalH = 0
For j = 1 To m
totalH = totalH + tbl.Rows(j).Height
Next j
eachH = totalH / m
For j = 1 To m
tbl.Rows(j).Height = eachH
Next j
End Sub
Public Sub EqualizeSelectedTable()
Dim shp As Shape
On Error Resume Next
Set shp = ActiveWindow.Selection.ShapeRange(1)
On Error GoTo 0
If shp Is Nothing Then
MsgBox "表を含む図形が選択されていません。表の枠線をクリックしてから実行してください。", vbExclamation
Exit Sub
End If
If shp.HasTable <> msoTrue Then
MsgBox "選択中の図形は表ではありません。", vbExclamation
Exit Sub
End If
EqualizeTableColumns shp.Table
EqualizeTableRows shp.Table
End SubAlt + F11 で VBE(Visual Basic Editor)を開き、「挿入」→「標準モジュール」で新しいモジュールを追加し、上のコードを貼り付けます。PowerPoint に戻って表を選択し「表示」タブ→「マクロ」→EqualizeSelectedTable を実行すれば、選択中の表の列幅・行高がそろいます。

プレゼン内のすべての表を一括処理したい場合は、Module1 を呼び出す上位マクロを Module2 として用意します。配布マクロ有効ファイルの Module2_BatchAll には全表の「列と行」一括均等化、列のみ均等化、行のみ均等化の 3 種類を収録しています。用途に応じて使い分けてください。
割り切れない列幅(たとえば 220 を 3 列に分けるなど)では浮動小数の端数が出ますが、本検証では誤差は 0.0001pt 以下で、見た目には影響しません。なお PowerPoint には Excel の Application.ScreenUpdating のような速度最適化プロパティが存在しません。そのため Excel VBA で定番の「処理中だけ画面更新を止めて高速化する」テクニックは PowerPoint VBA では使えません。日常規模の表ではほとんど気になりませんが、25 列 50 行クラスの巨大表では H2-7 で触れるように十数秒かかることがあります。
結合セルがある表で VBA 均等化する
結合セルが混在している表でも、Module1 の EqualizeTableColumns はそのまま実行できます。Columns(i).Width への代入は結合(merge)を壊さず、結合セルの幅は「均等化後の列幅 × 結合した列数」になります。次の例は、1 行目 1〜2 列と 1 行目 3〜4 列にそれぞれ横結合がある 4 列 4 行表で、Module1 で全列均等化したものです。


このように Module1 をそのまま使う「結合保持版」が最も簡単です。一方、「結合セルがある表は触りたくない、見つけたらスキップしたい」という慎重派ユーザー向けには、結合を検出して該当表だけ均等化対象から除外する「除外版」も用意できます。
ここで問題になるのが、PowerPoint VBA の Cell オブジェクトには結合判定プロパティが存在しないことです。Microsoft Learn の公式仕様でも Cell のメンバは Application / Borders / Parent / Selected / Shape の 5 つのみです。Word VBA のような HorizontalMerge / VerticalMerge プロパティはありません。代わりに、結合されたセルでは Cell.Shape.Width が「結合した列数 × 単列の幅」になる挙動を使って幾何的に判定します。
' === Module3_MergeHelpers: 結合セル検出ヘルパー ===
Public Function IsCellHorizontallyMerged(ByVal cellRef As Cell, ByVal colWidth As Single) As Boolean
IsCellHorizontallyMerged = (cellRef.Shape.Width > colWidth + 0.5)
End Function
Public Function IsCellVerticallyMerged(ByVal cellRef As Cell, ByVal rowHeight As Single) As Boolean
IsCellVerticallyMerged = (cellRef.Shape.Height > rowHeight + 0.5)
End Function' === Module4_SafeForMerges: 結合セル「除外版」===
' Module1 と Module3 の関数を呼び出します
Public Sub EqualizeTablesSkippingMerged()
Dim sld As Slide, shp As Shape, tbl As Table
Dim hasMergedCell As Boolean, r As Long, c As Long
Dim equalizedCount As Long, skippedCount As Long
equalizedCount = 0 : skippedCount = 0
For Each sld In ActivePresentation.Slides
For Each shp In sld.Shapes
If shp.HasTable = msoTrue Then
Set tbl = shp.Table
hasMergedCell = False
For r = 1 To tbl.Rows.Count
For c = 1 To tbl.Columns.Count
If IsCellHorizontallyMerged(tbl.Cell(r, c), tbl.Columns(c).Width) Then
hasMergedCell = True
Exit For
End If
If IsCellVerticallyMerged(tbl.Cell(r, c), tbl.Rows(r).Height) Then
hasMergedCell = True
Exit For
End If
Next c
If hasMergedCell Then Exit For
Next r
If hasMergedCell Then
skippedCount = skippedCount + 1
Else
EqualizeTableColumns tbl
EqualizeTableRows tbl
equalizedCount = equalizedCount + 1
End If
End If
Next shp
Next sld
MsgBox "均等化: " & equalizedCount & " 個 / 結合セル含み skip: " & skippedCount & " 個", vbInformation
End SubModule4 は Module1(列幅と行高の均等化)と Module3(結合セル検出)の両方を呼び出します。配布マクロ有効ファイルから取り込むときは Module1 → Module3 → Module4 の順でセットにしてください。
行の高さを小さくしたのに変わらない理由(フォントサイズ依存の下限)
Rows(j).Height = 10 のように行の高さを小さく指定しても、実際の行は変わらないことがあります。これは PowerPoint の「最小行高」仕様で、下限値はセル内のフォントサイズに依存します。エラーや警告は出ないまま、指定値が下限値まで silent に引き上げられる挙動です。

本記事の実機検証(既定フォント游ゴシック相当、6 サイズ × 8 段階の指定値で測定)では、次のように下限値が変化しました。
| セル内フォント | 5〜18pt 指定時の戻り値 | 20pt | 25pt | 30pt | 36pt 以上 |
|---|---|---|---|---|---|
| 10pt | 19.2pt | 20.0pt | 25.0pt | 30.0pt | 指定値どおり |
| 12pt | 21.6pt | 21.6pt | 25.0pt | 30.0pt | 指定値どおり |
| 14pt | 24.0pt | 24.0pt | 25.0pt | 30.0pt | 指定値どおり |
| 18pt(既定) | 28.8pt | 28.8pt | 28.8pt | 30.0pt | 指定値どおり |
| 24pt | 36.0pt | 36.0pt | 36.0pt | 36.0pt | 指定値どおり |
| 32pt | 45.6pt | 45.6pt | 45.6pt | 45.6pt | 45.6pt〜 |
「下限値 ÷ フォントサイズ」は単純な定数にはならず、10pt では 1.92、18pt では 1.60、32pt では 1.425 と縮まっていきます。下限値はフォント本体の高さに上下マージンと leading(行送り)が加わった合算と整合しますが、PowerPoint 側は内訳を公開していないため、フォントサイズごとに比率を実測するしかありません。「行高の下限は 28.8pt」と書かれた解説を見かけますが、それは既定フォントサイズ 18pt のセルでの実測値で、文字サイズを変えれば下限も変わります。
行高をどうしても小さくしたい場合は、セル内のテキストフォントをまず小さくする必要があります。テキストが空のセルでも、セル属性に保持されているフォントサイズで下限が決まるため、見た目には文字がなくても下限値は同じです。
Excel・Word の表との違い
同じ「均等化」操作でも Office 3 アプリで挙動が違います。PowerPoint と Word は内部的に同じ TableColumnsDistribute というコマンドを使いますが、VBA API の差と「均等化」の単位の違いで、書き方や読み取り方が変わります。Excel には PowerPoint / Word と同じ「表の列を均等化」ボタンはありません。列幅は AutoFit、数値指定、列幅コピーなどで調整します。
| 軸 | PowerPoint | Word | Excel |
|---|---|---|---|
| UI ボタン位置 | テーブル レイアウト → セル サイズ → 幅を揃える / 高さを揃える | テーブル レイアウト → セル サイズ → 幅を揃える / 高さを揃える | 同名の均等化ボタンなし(AutoFit / 数値指定で調整) |
| 内部 idMso | TableColumnsDistribute / TableRowsDistribute | 同名 | 該当なし |
| 単一セル選択時 | 全列均等化 | 本記事では未検証 | 該当なし |
| 複数セル選択時 | 選択列全体(全行)が均等化 | 選択セルだけが均等化(同列の他行は不変) | 該当なし |
| 列内の幅一貫性 | 列内は必ず一様(column-level) | 列内が不均一になりうる(cell-level) | 該当なし |
| 列幅取得 VBA | tbl.Columns(i).Width で常に読める | 列内不均一なら tbl.Cell(r,c).Width 経由必須 | Range.ColumnWidth(文字幅単位) |
| VBA 複数セル選択 | Cell.Select() は単一セルのみ | doc.Range(Start=, End=).Select() で範囲指定可 | 該当なし |
Cell.Merged プロパティ | 存在しない(Module3 で幾何判定) | あり(HorizontalMerge / VerticalMerge) | 該当なし |
PowerPoint と Word の決定的な差は、複数セル選択時の「均等化の単位」です。同じ TableColumnsDistribute でも、PowerPoint は 列全体(column-level)を均等化するのに対し、Word は 選択されたセルだけ(cell-level)を均等化します。Word では同じ列でも行ごとに違う幅になりうる、ということです。
![Word の表で 1 行目の 2 セルだけを選択した Before(初期セル幅 [48.3, 198.6, 72.7, 80])](https://www.helpaso.net/wp-content/uploads/2026/05/helpaso-powerpoint-table-distribute-columns-rows-s10-word-before.webp)
![Word の表で「幅を揃える」を実行した After(1 行目だけ [48.3, 135.65, 135.65, 80] に変化、2-3 行目は元のまま)](https://www.helpaso.net/wp-content/uploads/2026/05/helpaso-powerpoint-table-distribute-columns-rows-s10-word-after.webp)
具体的にはこうです。初期セル幅が [48.3 / 198.6 / 72.7 / 80] の 4 列 3 行 Word 表で、1 行目の 2 列目と 3 列目の 2 セルを選択して「幅を揃える」を実行します。すると 1 行目は [48.3 / 135.65 / 135.65 / 80] に変化しますが、2 行目と 3 行目は初期セル幅のまま変わりません。PowerPoint で同じ操作をすると全行で列 2 と列 3 が平均化されるので、Word 利用者が PowerPoint に来ると違和感を感じることがあります。
Word の挙動差はもう 1 つあります。TableColumnsDistribute を部分適用後に tbl.Columns(i).Width を読むと、「列幅がすべて同一ではないためアクセスできない」という COM エラーが出ます。Word VBA で列幅を読むときは tbl.Cell(r, c).Width を行ごとに取得するのが安全です。PowerPoint では列単位で常に同じ値なので tbl.Columns(i).Width をそのまま使えます。
うまくいかないときの確認ポイント
「幅を揃える」「高さを揃える」がうまく動かないときに、まず確認したい 3 パターンを整理します。
(a) 「テーブル レイアウト」タブが現れない
選択しているのが表ではなくテキストボックスや図形の可能性があります。VBA で確認するなら Shape.HasTable = msoTrue を返すかをチェックします。表の Shape.Type は 19(msoTable)です。Module1 の EqualizeSelectedTable でも、先に HasTable をチェックして「表ではない図形」をはじいています。
(b) 行の高さが指定値にならない
セル内フォントの下限値に当たっている可能性があります。前節の表で確認したとおり、フォント 18pt なら下限 28.8pt、24pt なら 36.0pt です。本当に小さい行が必要なら、まずセル内テキストのフォントサイズを 12pt や 10pt に下げてから行高を指定し直してください。
(c) VBA で ExecuteMso "TableColumnsDistribute" が空振りする
表の選択状態が間違っている可能性があります。Shape.Select または Cell(r, c).Select 後なら ExecuteMso が発火しますが、Columns(i).Select 後は GetEnabledMso=True でも実質空振りします。確実に列幅を書き換えるなら Table.Columns(i).Width = avg を直接代入する方法(Module1 のループ)が安定します。
大きな表での速度について、本検証では 25 列 50 行クラスの大規模表に対して Module1 のループ均等化で 17〜20 秒程度かかりました。日常の数列規模の表では気になりません。巨大な表を一括処理する場合は待ち時間が出るので注意してください(26 列以上は本記事の検証対象外です)。
まとめ
PowerPoint の表で列幅・行の高さを均等化するもっとも速い手順は、表をクリックして「テーブル レイアウト → セル サイズ → 幅を揃える / 高さを揃える」の 1 クリックです。複数列だけを均等化したい場合は、複数セルを選択してから同じボタンを押せば選択列のみが平均化されます。複数表を一括処理したい場合や結合セルを保持したまま処理したい場合や、結合セルを含む表を除外して処理したい場合は、配布のマクロ有効ファイルの Module1〜Module4 をそのままコピペで使えます。「行高が変わらない」のはバグではなくフォント依存の下限値が効いているため、フォントを小さくすれば下限も下がります。
本記事の検証範囲: Windows 11 Pro 25H2 / PowerPoint 2024 build 19929(Office Home & Business 2024 Retail、永続版)/ 日本語 UI / 標準表です。標準表は AddTable で作成したもので、SmartArt や OLE 経由の埋め込み表は対象外です。
未検証: 以下の環境は本検証の対象外です。
- Mac 版 PowerPoint / Web 版 PowerPoint
- Microsoft 365 最新チャネル
- PowerPoint 2019 / PowerPoint 2021
- 中国語・英語・韓国語 UI
- 画面 DPI スケーリング 100% 以外
これらの環境では UI ラベル・VBA API・行高下限値などが異なる可能性があります。お使いの環境で本記事の手順を試す前に、サンプルファイルのコピー上で動作を確認することをおすすめします。
コメント