【エクセルVBA】図形をキレイに揃えるテクニック3選をご紹介

大量の図形を手作業で1つずつ揃えていませんか?
エクセルで図形(丸・四角・矢印など)を使った資料を作るとき、「この図形の位置がちょっとズレている」「大きさがバラバラで見た目が悪い」という場面、経験したことがある方は多いと思います。
私もかつては、図形をマウスでドラッグしながら「なんとなく揃っているかな?」という感覚で作業していました。
しかしこれが意外と時間がかかるうえ、見た目が整っているようで実は数ピクセルずれていたりして、印刷すると微妙に揃っていない……という仕上がりになりがちです。
VBAを使えば、こうした図形の位置・サイズの調整をボタン1クリックで完璧に揃えることができます。
この記事では、Shapeオブジェクト・Topプロパティ・Leftプロパティの基本的な使い方から、「縦に揃える」「横に揃える」「サイズを統一する」という実務直結の3つのテクニックを、プログラミング初心者の方にもわかるように丁寧に解説していきます。
読み終えるころには、「このVBAをそのまま自分の資料作りに使える!」と感じてもらえるはずです。
手作業の図形編集が引き起こす3つの問題
まず、手作業で図形を揃えようとすると、どれだけ非効率かを整理しておきましょう。
VBAによる自動化を導入する前に、現状の問題点を把握することが大切です。
問題①:図形の位置がいつも「なんとなく揃っている」状態になる
マウスドラッグで図形を動かしていると、ピクセル単位で正確に揃えることがほぼ不可能です。
「揃えた!」と思ってよく見ると、微妙にズレている……という経験をした方は多いのではないでしょうか。
資料の見た目はちょっとしたズレでも印象が大きく変わってしまう。。。
特に、上司やお客様への提出資料では、図形の整列具合が「きちんと作られた資料かどうか」の判断材料になることもあります。
VBAを使えば、座標をコード上で正確に指定できるため、ピクセル単位で完璧に揃えた資料を毎回再現することができます。
問題②:図形の数が増えるほど作業時間が比例して増える
図形が5個なら手作業でもなんとかなります。
しかし、20個・30個と数が増えてくると、1つずつ位置を調整するだけで30分・1時間があっという間に消えていきます。
報告書や点検表、プレゼン資料など、図形を多用するドキュメントを定期的に更新している場合、その時間コストは積み重なっていきます。
VBAなら図形が100個あっても処理時間はほぼゼロです。
ループ処理で一括揃えができるため、作業時間を大幅に短縮することができます。
問題③:テンプレートを使いまわすたびに揃え直しが発生する
一度きれいに作った資料を、翌月・翌週に使い回すとき、前回のデータを消して新しいデータを入れる作業をしていると、図形の位置が少しずつずれていくことがあります。
「なんでズレたんだろう?」と原因を探しながら揃え直す作業は、本来の業務とはまったく関係のない時間です。
マクロを登録しておけば、ボタン1クリックで図形を元通りの位置に整列させることができます。
VBAで図形を操作するための基礎知識
図形を揃えるテクニックを学ぶ前に、VBAで図形を操作するための基本的な概念を押さえておきましょう。
ここを理解していると、後半のコードがスッと読めるようになります。
ShapeオブジェクトとShapesコレクションとは?
エクセルのシート上に配置されている図形(丸・四角・矢印・テキストボックスなど)は、VBAでは「Shape(シェイプ)オブジェクト」として扱われます。
シート上のすべての図形は「Shapes(シェイプス)コレクション」にまとめられており、VBAからアクセスするときは次のように書きます。
' シート上の図形に名前でアクセスする場合
Dim shp As Shape
Set shp = ActiveSheet.Shapes("楕円 1")
' シート上の図形をインデックス番号でアクセスする場合
Set shp = ActiveSheet.Shapes(1)
' シート上のすべての図形をFor Eachでループする場合
Dim s As Shape
For Each s In ActiveSheet.Shapes
Debug.Print s.Name ' 図形の名前をイミディエイトウィンドウに出力
Next s
コードの流れを解説します。
ActiveSheet.Shapes(“図形名") で図形を名前指定で取得し、ActiveSheet.Shapes(1) でインデックス番号指定で取得できます。
For Each ループを使えば、シート上のすべての図形を1つずつ処理することが可能です。
図形の名前は、図形を選択したときにエクセル画面左上の「名前ボックス」(セルアドレスが表示されるところ)に表示されています。
Top・Left・Width・Heightプロパティとは?
図形の位置やサイズを制御するために使う主なプロパティは次の4つです。
Top:図形の上端がシートの上端からどれだけ離れているか(単位:ポイント)
Left:図形の左端がシートの左端からどれだけ離れているか(単位:ポイント)
Width:図形の横幅(単位:ポイント)
Height:図形の高さ(単位:ポイント)
エクセルの1ポイントは約0.035cmです。
これらのプロパティを読み書きすることで、図形の位置とサイズを自在にコントロールできます。
Sub 図形のプロパティ確認()
Dim shp As Shape
Set shp = ActiveSheet.Shapes(1) ' シート上の1番目の図形
' 現在の値を確認する
MsgBox "Top(上端): " & shp.Top & vbCrLf & _
"Left(左端): " & shp.Left & vbCrLf & _
"Width(横幅): " & shp.Width & vbCrLf & _
"Height(高さ): " & shp.Height, vbInformation
End Sub
コードの流れを解説します。
shp.Top・shp.Left・shp.Width・shp.Height でそれぞれの現在値を取得し、MsgBox でメッセージとして表示しています。
このコードを使えば「今この図形はどの位置にあるのか?」を数値で確認することができます。
図形をキレイに揃えるテクニック3選
基礎を押さえたところで、いよいよ本題に入ります。
実務でよく使う「縦に揃える」「横に揃える」「サイズを統一する」の3つのテクニックを、それぞれ具体的なコードと一緒に解説していきます。
テクニック①:複数の図形をLeft(左端)で縦に揃えるVBA
複数の図形を縦に並べたいとき、それぞれのLeft(左端の位置)を同じ値に揃えることで、ピッタリと左端が揃います。
「基準になる図形のLeft値に、他の図形を合わせる」というシンプルな考え方です。
Sub 図形を左端で縦揃え()
Dim ws As Worksheet
Set ws = ActiveSheet
' 図形が2個以上ないと揃えられないためチェック
If ws.Shapes.Count < 2 Then
MsgBox "図形が2個以上必要です。", vbExclamation
Exit Sub
End If
' 1番目の図形を基準にする
Dim baseLeft As Double
baseLeft = ws.Shapes(1).Left
' 2番目以降のすべての図形のLeftを基準値に合わせる
Dim i As Integer
For i = 2 To ws.Shapes.Count
ws.Shapes(i).Left = baseLeft
Next i
MsgBox "左端で縦揃えが完了しました!", vbInformation
End Sub
コードの流れを解説します。
ws.Shapes(1).Left で1番目の図形のLeft値(左端の位置)を取得し、それを baseLeft という変数に保存。
その後、For ループで2番目以降のすべての図形の Left を baseLeft と同じ値に書き換えていきます。
これだけで、シート上のすべての図形の左端が1番目の図形の左端に揃います。
「基準にしたい図形」を選び直したい場合は、ws.Shapes(1) の番号を変えるだけ。
たとえば3番目の図形を基準にしたければ、ws.Shapes(3).Left に変更すれば完了です。
テクニック②:複数の図形をTop(上端)で横に揃えるVBA
図形を横に並べたいとき、それぞれのTop(上端の位置)を同じ値に揃えることで、横方向にキレイに整列します。
考え方はテクニック①と同じで、「基準になる図形のTop値に、他の図形を合わせる」だけです。
Sub 図形を上端で横揃え()
Dim ws As Worksheet
Set ws = ActiveSheet
' 図形が2個以上ないと揃えられないためチェック
If ws.Shapes.Count < 2 Then
MsgBox "図形が2個以上必要です。", vbExclamation
Exit Sub
End If
' 1番目の図形を基準にする
Dim baseTop As Double
baseTop = ws.Shapes(1).Top
' 2番目以降のすべての図形のTopを基準値に合わせる
Dim i As Integer
For i = 2 To ws.Shapes.Count
ws.Shapes(i).Top = baseTop
Next i
MsgBox "上端で横揃えが完了しました!", vbInformation
End Sub
コードの流れを解説します。
ws.Shapes(1).Top で1番目の図形のTop値を取得し、それを baseTop に保存。
For ループで2番目以降の図形のTopをすべて baseTop に揃えていくことで、図形が横一直線に並びます。
このテクニックが特に役立つのは、フロー図や工程表の作成時です。
「各工程を表すボックスを横に並べたい」というシーンで、手作業では難しいピッタリの横揃えが一瞬で完成します。
テクニック③:複数の図形のサイズ(Width・Height)を統一するVBA
図形の位置を揃えるだけでなく、「大きさもバラバラになっている」という問題を解決するのがこのテクニックです。
Width(横幅)とHeight(高さ)を基準の図形に合わせることで、すべての図形が同じサイズになります。
Sub 図形のサイズを統一()
Dim ws As Worksheet
Set ws = ActiveSheet
' 図形が2個以上ないと揃えられないためチェック
If ws.Shapes.Count < 2 Then
MsgBox "図形が2個以上必要です。", vbExclamation
Exit Sub
End If
' 1番目の図形のサイズを基準にする
Dim baseWidth As Double
Dim baseHeight As Double
baseWidth = ws.Shapes(1).Width
baseHeight = ws.Shapes(1).Height
' 2番目以降のすべての図形のサイズを基準値に合わせる
Dim i As Integer
For i = 2 To ws.Shapes.Count
ws.Shapes(i).Width = baseWidth
ws.Shapes(i).Height = baseHeight
Next i
MsgBox "サイズの統一が完了しました!", vbInformation
End Sub
コードの流れを解説します。
ws.Shapes(1).Width と ws.Shapes(1).Height で1番目の図形の横幅と高さを取得し、それぞれ baseWidth・baseHeight に保存。
For ループで2番目以降の図形のWidthとHeightをすべて基準値に書き換えていきます。
これにより、シート上の図形がすべて同じサイズになります。
写真を貼り付けて大きさを揃えたいシーンにも応用できます。
応用編:3つのテクニックを組み合わせた一括整列マクロ
ここまで学んだ「左端揃え」「上端揃え」「サイズ統一」を一度に実行するマクロを紹介します。
「1クリックですべての図形をキレイに整列させたい」という要望にそのまま使えるコードです。
以下のサンプルは、「図形を横一列に並べたうえで、サイズも統一する」という実際の資料作りでよく使うシーンを想定しています。
Sub 図形を一括整列()
Dim ws As Worksheet
Set ws = ActiveSheet
' 図形が2個以上ないと揃えられないためチェック
If ws.Shapes.Count < 2 Then
MsgBox "図形が2個以上必要です。", vbExclamation
Exit Sub
End If
'-------------------------------
' STEP 1:1番目の図形を基準として取得
'-------------------------------
Dim baseShape As Shape
Set baseShape = ws.Shapes(1)
Dim baseTop As Double
Dim baseLeft As Double
Dim baseWidth As Double
Dim baseHeight As Double
baseTop = baseShape.Top
baseLeft = baseShape.Left
baseWidth = baseShape.Width
baseHeight = baseShape.Height
'-------------------------------
' STEP 2:図形間の水平方向の間隔を設定(ポイント単位)
'-------------------------------
Dim spacing As Double
spacing = 10 ' 図形と図形の間を10ポイントあける
'-------------------------------
' STEP 3:2番目以降の図形を横一列に並べる
'-------------------------------
Dim i As Integer
For i = 2 To ws.Shapes.Count
With ws.Shapes(i)
' Topを基準の図形に揃える(横一列)
.Top = baseTop
' Leftを「前の図形のLeft + 前の図形のWidth + 間隔」で計算
.Left = ws.Shapes(i - 1).Left + ws.Shapes(i - 1).Width + spacing
' Width・Heightを基準の図形に揃える
.Width = baseWidth
.Height = baseHeight
End With
Next i
MsgBox "図形の一括整列が完了しました!", vbInformation
End Sub
コードの流れを解説します。
まず STEP 1 で1番目の図形の位置・サイズをすべて変数に取得。
STEP 2 で spacing(図形と図形の間のスペース)を設定。
10ポイントにしていますが、資料に合わせて自由に変更してください。
STEP 3 の For ループで、2番目以降の図形を1つずつ処理をする。
.Left = ws.Shapes(i – 1).Left + ws.Shapes(i – 1).Width + spacing という計算式が重要なポイントです。
これは「ひとつ前の図形の左端 + ひとつ前の図形の横幅 + 間隔」という計算で、図形を等間隔に横並びさせることができます。
Withステートメントを使うことで、同じオブジェクト(ws.Shapes(i))に対する複数のプロパティ設定をすっきりと書けるのもポイントです。
→ → → 「Withステートメントの使い方」解説記事はこちら
VBAで図形を操作する際の注意点
コードを実行する前に、いくつかの注意点を押さえておきましょう。
これを知っておくだけで、「なんで動かないんだろう?」という無駄な時間を省くことができます。
注意点①:図形の名前は自動でつけられるが変更もできる
エクセルに図形を挿入すると、「楕円 1」「四角形 2」のように自動的に名前がつきます。
VBAで名前指定アクセスをする場合(Shapes(“楕円 1") など)は、この名前を正確に入力する必要があります。
名前を確認するには、図形を選択して左上の名前ボックスを見るか、先ほど紹介した Debug.Print s.Name のコードでイミディエイトウィンドウに出力するのがおすすめです。
注意点②:テキストボックスや写真もShapesに含まれる
実はエクセルのテキストボックスや挿入した写真(画像)も、VBAでは Shape オブジェクトとして扱われます。
そのため、「図形だけ揃えたい」のにテキストボックスや写真も一緒に動いてしまう……という問題が起きることがあります。
これを防ぐには、ループの中で図形の種類(ShapeType)を確認して条件分岐する方法が有効です。
Sub 図形の種類を確認して処理()
Dim s As Shape
For Each s In ActiveSheet.Shapes
' msoAutoShape(オートシェイプ)だけを処理する場合
If s.ShapeType = msoAutoShape Then
' 処理を書く
Debug.Print s.Name & " はオートシェイプです。"
End If
Next s
End Sub
コードの流れを解説します。
s.ShapeType で図形の種類を取得し、msoAutoShape(オートシェイプ)かどうかを確認しています。
写真(画像)は msoPicture、テキストボックスは msoTextBox という定数で判別できます。
注意点③:マクロ実行前に上書き確認ダイアログを入れておくと安全
図形を大量に動かすマクロを誤って実行すると、元の位置を戻すのが大変なことがあります。
特に「元に戻す(Ctrl+Z)」はVBAの操作には効かないため、実行前に確認ダイアログを表示しておくのがプロとしての習慣です。
' 実行前に確認する
Dim answer As Integer
answer = MsgBox("図形を整列します。実行してよいですか?", vbYesNo + vbQuestion, "確認")
If answer = vbNo Then Exit Sub
このたった4行を冒頭に入れておくだけで、誤操作によるトラブルを防ぐことができます。
VBAスキルを収益化するなら早めに行動を
ここまで図形を揃えるVBAのテクニックを解説してきました。
「このスキル、副収入につなげられないかな?」と感じた方も多いのではないでしょうか。
私も同じように感じて、実際に行動に移した経験があります。
最初はスキルを販売できるプラットフォーム「ココナラ」に登録しました。
登録直後は実績がゼロで信頼度もないため、なかなか仕事を獲得できません。
そこで自己紹介文とポートフォリオを丁寧に作り込み、単価が低くても作業量をこなして実績を積み上げていきました。
登録から1年ほど経ったとき、マクロ開発の依頼を継続的に受注できるようになり、月に2万〜3万円の副収入を得ることに成功。
リピートしてくれる依頼者も現れ、「VBAスキルで継続的に収入を得る」という状態を実現できたのです。
さらにその後、エクセルVBAのブログを運営して情報を発信するようになってから、ブログ経由で直接マクロ開発の依頼を受注することに。
ブログ経由の直接受注は、プラットフォームへの手数料がかからず、打ち合わせ方法も自分で決められる(オンライン通話・メール・通話)というメリットがあります。
さらにステップアップを目指したい方は、クラウドワークス テックへの登録も検討してみてください。
私の場合は「本業以外の時間(1日4時間稼働・完全リモート)」という条件で案件を紹介してもらいました。
担当者のサポートが手厚く、「どのような仕事なのか」「自分に務まるのか」を事前に詳しく教えてもらえるため、安心して副業をスタートできます。
私の場合、月に10万円程度の報酬を受け取ることができましたが本業との掛け持ちがきつくなったので現在は利用していません。
報酬金額だけでなく「自分に務まるか」「作業時間をしっかり確保できるか」を冷静に検討してから進むことが重要です。
関連記事「【体験談あり】VBAスキルで副収入を得る方法|未経験から案件獲得まで」では、私がゼロから副収入を得るまでの具体的なステップをまとめていますので、ぜひ合わせて読んでみてください。
まとめ ~ 図形の整列はVBAで完全自動化しよう ~
この記事では、エクセルVBAで図形をキレイに揃える3つのテクニックを解説してきました。
- 「Left(左端)を揃えて縦に整列する」は、縦並びの図形をピッタリ左端で揃えたいときに使う
- 「Top(上端)を揃えて横に整列する」は、横並びの図形を上端で揃えたいときに使う
- 「Width・Heightを揃えてサイズを統一する」は、サイズがバラバラになった図形を基準の大きさに統一したいときに使う
そして応用編の「一括整列マクロ」は、位置もサイズも間隔も、すべてを一気に整える実務直結のコードです。
手作業で1つずつ揃えていたあの時間が、VBAを使えばボタン1クリックで完了します。
最初は基本コードをそのままコピペして、自分のシートで動かしてみるところから始めてみましょう。
「あ、動いた!」という感覚が、VBAへの理解をどんどん深めてくれます。
もし「自分の業務に合わせた複雑なチェック処理を実装したい」「既存のマクロを改良したい」といったご要望がありましたら、マメBlogのエクセルマクロ開発依頼にご相談ください。
業務内容に合わせたオーダーメイドマクロを設定させていただきます。
最後まで読んでいただきありがとうございました。
エクセルVBAを使って面倒なルーティーン作業を自動化しちゃいましょう。






