【VBAリファレンス】【Excel VBA】行の高さや列幅を変えても図形が崩れない!オブジェクトの配置を完全に制御するテクニック

スポンサーリンク

こんにちは。Excel VBAの講師を務めている者です。皆さんは、Excelで資料を作成している際に、こんな経験はありませんか?

「せっかく綺麗に配置した図形や画像が、後から列幅を調整した途端に歪んでしまった」
「行の高さを変えたら、ボタンやグラフの位置がバラバラになってしまった」

Excelのシート上に配置したオブジェクト(図形、画像、ボタンなど)は、デフォルトの設定では「セルに合わせて移動やサイズ変更をする」というプロパティが有効になっています。これにより、作業中に少し列幅を広げただけで、図形が横に伸びたり、意図しない場所に移動したりしてしまいます。

今回は、この厄介な現象を解決するための「プロパティ設定」と、それをVBAで一括制御する方法について、プロの視点から解説します。

なぜオブジェクトは勝手にサイズが変わってしまうのか?

Excelのオブジェクトには、実は「配置プロパティ」という設定項目が存在します。この設定には大きく分けて3つの種類があります。

1. **セルに合わせて移動やサイズ変更をする**(デフォルト)
2. **セルに合わせて移動するがサイズ変更はしない**
3. **セルに合わせて移動もサイズ変更もしない**

多くの場合、図形や画像は「3」の設定、つまり「セルの変更に一切影響されない」状態にしておくのが、レイアウトを崩さないための最適解です。しかし、手動でひとつひとつの図形を選択し、プロパティを開いて設定を変更するのは非常に手間がかかります。特に、数百個のオブジェクトがある場合は絶望的です。

手動での設定方法(基本の確認)

まずは、VBAを使わずに手動で設定する方法を確認しておきましょう。

1. 図形を右クリックし、「図形の書式設定」を選択します。
2. 作業ウィンドウ内の「サイズとプロパティ」(アイコンは四角形の中に矢印があるもの)をクリックします。
3. 「プロパティ」という項目を展開します。
4. ここで「セルに合わせて移動やサイズ変更をしない」を選択します。

たったこれだけですが、オブジェクトの数が多いと現実的ではありません。ここからがVBAの出番です。

VBAでオブジェクトのプロパティを一括制御する

VBAを使えば、シート上のすべてのオブジェクトに対して、一瞬で「セルの変更に影響されない」設定を適用できます。以下のコードを標準モジュールに貼り付けて実行してみてください。

Sub FixObjectProperties()
Dim shp As Shape
Dim ws As Worksheet

‘ アクティブシートを対象にする
Set ws = ActiveSheet

‘ エラー回避用の設定
On Error Resume Next

‘ シート上のすべての図形をループ処理
For Each shp In ws.Shapes
‘ プロパティを変更
‘ xlFreeFloating: セルに合わせて移動もサイズ変更もしない
‘ xlMove: セルに合わせて移動するがサイズ変更はしない
‘ xlMoveAndSize: セルに合わせて移動・サイズ変更する(デフォルト)

shp.Placement = xlFreeFloating
Next shp

MsgBox “すべてのオブジェクトのプロパティを「移動もサイズ変更もしない」に設定しました。”, vbInformation
End Sub

コードの詳細解説:なぜこれが最強なのか

このコードの肝は、`shp.Placement` プロパティです。

* **xlFreeFloating**: セルに対して完全に独立した状態にします。列幅を変えても、行の高さを変えても、図形はピクリとも動きません。
* **xlMove**: 「移動はするがサイズは変えない」という設定です。例えば、特定の行の上に行を挿入した際に、図形を一緒に下にずらしたい場合にはこちらが有効です。

用途に合わせて使い分けることが重要ですが、レイアウトの固定を最優先するなら `xlFreeFloating` が間違いなく最強です。

さらに一歩進んだプロのTips:特定のオブジェクトだけ除外する

実務では、「ボタンだけはセルと一緒に移動してほしい」といったケースもあります。そんな時は、コードに条件分岐を加えるのがプロのテクニックです。

Sub FixObjectProperties_Selective()
Dim shp As Shape

For Each shp In ActiveSheet.Shapes
‘ 名前が”Btn_”で始まるもの以外を固定する
If Not shp.Name Like “Btn_*” Then
shp.Placement = xlFreeFloating
End If
Next shp
End Sub

このように、`shp.Name` を活用して特定の図形を除外するロジックを組めば、より柔軟な運用が可能になります。

オブジェクト管理を制する者がExcelレイアウトを制する

多くのユーザーは、Excelの「セルとオブジェクトの依存関係」に振り回されています。しかし、今回紹介したVBAを活用することで、あなたは「レイアウトの奴隷」から「レイアウトの支配者」に変わることができます。

特に、配布用のテンプレートや、複雑なダッシュボードを作成する際には、この設定を初期段階で組み込んでおくことを強くおすすめします。

最後に一つだけ注意点です。`xlFreeFloating` に設定すると、セルを削除した際にも図形がその場に留まり、重なってしまうことがあります。その点だけは注意が必要ですが、列幅や行高の調整による「勝手なレイアウト崩れ」を完全に防げるメリットは計り知れません。

ぜひ皆さんの業務でもこのVBAを導入して、ストレスフリーなExcelライフを送ってください。何か不明点があれば、またいつでもご相談くださいね。

それでは、次回の記事もお楽しみに!

タイトルとURLをコピーしました