和風スパゲティのレシピ

日本語でコーディングするExcelVBA

図形内テキストの不要な改行を制御するマクロ

図形内のテキストが変な位置で改行されてしまうことがよくあります。

不要な改行

「もうちょっと余白あるじゃん!!」

って思ってしまうやつですね(´∀`;)


実はこの改行は割と簡単に制御でき、

  • 「テキストを図形からはみ出して表示する」をチェック
  • 「図形内でテキストを折り返す」のチェックを外す

この2つの設定を行うことで不要な改行をある程度抑えることができます。

 
不要な改行を抑制する設定


余白をギリギリまで使うとなると上下左右の余白を0にしたくなりますが、
「はみ出して表示」の方が本当にギリギリまで使ってくれます。
(というか余白が足りなくても設定どおりはみ出します)


また「テキストを折り返す」設定についても、
これを外してもEnterで入れた本当の改行はちゃんと表示されます。


この2つの設定は便利ですので知らなかった方はこの機会に覚えてしまってください。


さてこの設定、もう全部の図形がデフォルトでこうなっていてほしいくらいなので、
これを一括で設定するマクロを作ってしまいましょう。


本マクロはExcel起動時に裏で開かれる「個人用マクロブック」などに搭載して使ってください。

リボンやツールバーに登録すれば1クリックになりますし、
ショートカットキーへの登録も便利です。

ソースコード

Sub 選択中の図形に改行制御を設定をする()

    On Error Resume Next
    
    ' 選択中の図形数をカウント
    Dim 図形数 As Long
    図形数 = Selection.ShapeRange.Count
    
    ' 選択しているのが図形でなければExit
    If 図形数 = 0 Then Exit Sub
    
    ' 選択している図形数が1ならその図形に処理
    If 図形数 = 1 Then
        With Selection.ShapeRange
            .TextFrame.VerticalOverflow = xlOartVerticalOverflowOverflow
            .TextFrame.HorizontalOverflow = xlOartHorizontalOverflowOverflow
            .TextFrame2.WordWrap = msoFalse
        End With
    
    ' 図形数が2以上ならSelectionをForEachでループして各個設定
    Else
    
        Dim 図形オブジェクト
        For Each 図形オブジェクト In Selection
        
            With 図形オブジェクト.ShapeRange
                If .TextFrame2.HasText Then
                    .TextFrame.VerticalOverflow = xlOartVerticalOverflowOverflow
                    .TextFrame.HorizontalOverflow = xlOartHorizontalOverflowOverflow
                    .TextFrame2.WordWrap = msoFalse
                End If
            End With
        
        Next
    End If

解説

「テキストを図形からはみ出して表示する」の設定は、
TextFrameオブジェクトのVerticalOverflow/HorizontalOverflowプロパティ

「図形内でテキストを折り返す」の設定は、
TextFrame2オブジェクトの.WordWrapプロパティで設定できます。


「はみ出して表示」の方は、Excelでは単体の設定ですが、
VBAでは水平・垂直の2つの設定ができる面白い仕様ですね。


これらのプロパティに関する詳しい解説はこちらをご覧ください。
www.limecode.jp


こういった汎用マクロはエラーで止まられても困るので、
全体にOn Error Resume Nextをかけています。

なのでグラフや写真を選択していてもエラーの心配はないのですが、
一応「HasTextプロパティ」でテキストが設定可能な図形だけに実行しています。


今回のように図形オブジェクトを操作するVBAコードを調べると、
Shapeオブジェクトに対するコードが良く出てくると思います。

しかし今回のようにSelectionをループしたときなどで、
「図形だけどShape型ではない変数」を取得していることがたまに起きます。

※ 今回のSelectionの場合はDrawingObject型が入っているようです。


そんな時は「ShapeRangeプロパティ」を指定することで、
Shape型の変数と同じように処理をすることができます。


Shapeに実行するコードがSelectionに対してはエラーになってしまう場合は、
.ShapeRangeをつけるだけで解消することも多いので覚えておきましょう。


コード冒頭にあるように「ShapeRangeがエラーかどうか」で、
Selectionが図形か(セルではないか)を判定するのにも使える便利なプロパティです。

あわせて使用すると便利なマクロ

今回のマクロは「選択した図形に対して実行」するものですので、
複数の図形を選択する機能と組み合わせて使うと便利です。


ひとまず「すべての図形にこの設定をしたい」場合は、
「どれか1つ図形を選択してCtrl+A」で全図形を選択できます。

知らなかった方はこの機会に覚えてしまってください。


前述の通り写真やグラフが混じっていてもエラーにはなりませんので、
このマクロは適当にすべての図形を選んで実行しても大丈夫です。



全図形ではなく特定の図形群にのみ実行したい場合は、
選択中のセル範囲と被っている図形をすべて選択するマクロ
と併用するのが便利です。


以下の記事で紹介していますので、
もしよければご一緒にお持ち帰りください。
www.limecode.jp