和風スパゲティのレシピ

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

テキストを図形からはみ出して表示する

図形内のテキストが変な位置で改行されてしまうのを防ぐために、

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

この2つをセットする方法が便利です。

テキストを図形からはみ出して表示する

これをVBAから設定する場合は、以下のコードを実行します。
 

ソースコード

Sub 指定のShapeオブジェクトに改行制御を設定をする()

    Dim 設定Shape As Shape
    Set 設定Shape = ActiveSheet.Shapes("TextBox 1")

    ' 「テキストを図形からはみ出して表示する」
    ' 垂直方向
    設定Shape.TextFrame.VerticalOverflow = xlOartVerticalOverflowOverflow
    ' 水平方向
    設定Shape.TextFrame.HorizontalOverflow = xlOartHorizontalOverflowOverflow

    ' 「図形内でテキストを折り返す」
    設定Shape.TextFrame2.WordWrap = msoFalse

End Sub

コードの解説

「テキストを図形からはみ出して表示する」はExcelでは1つの設定なのですが、
コードを見るとわかる通り、VBAでは水平/垂直別々に設定ができます。


それぞれの設定値(xl~~で始まる列挙型定数)を調べると、

◇ 水平方向

名前 説明
xlOartHorizontalOverflowClip 1 水平方向のレイアウト枠に収まらないテキストを非表示にします。
xlOartHorizontalOverflowOverflow 0 テキストはレイアウト枠からはみ出すことができます。

◇ 垂直方向

名前 説明
xlOartVerticalOverflowClip 1 垂直方向のレイアウト枠内に収まらないテキストを非表示にします。
xlOartVerticalOverflowEllipsis 2 垂直方向のレイアウト枠内に収まらないテキストを非表示にし、表示されるテキストの終わりに省略記号 (...) を追加します。
xlOartVerticalOverflowOverflow 0 テキストはレイアウト枠を垂直方向にはみ出すことができます (テキストの配置によって、上、下、または両方からはみ出します)。

 
となっており、垂直方向では「はみ出しのON/OFF」に加えて、
はみ出したら省略記号 (...)を表示する
という設定ができるのがわかります。


実際に設定してみるとこんな感じ。

はみ出した場合は省略記号を表示する

え、便利じゃんなんでExcelじゃできないの??


これは昔のExcelなら画面から設定できたようで、
1つのチェックボックスになってしまった今はできないようです。

VBAからであれば今も出来てしまうので、
気に入ったらこっちも使ってみてください。


ちなみにこの機能が昔のものであるためか、
「はみ出し表示」の方は古いプロパティ「TextFrame」にしかなく、
「TextFrame2」には対応するプロパティがありませんでした。


そのせいもあってマクロ記録では記録されないコードであるため、
それに困って本記事にたどり着いた方もいるかもしれません。

シート内のすべての図形に設定するコード

今回の設定をシート内のすべての図形に設定する場合は、
以下のコードを実行してください。

Sub シート内のすべてのShapeオブジェクトに改行制御を設定をする()

    ' シート内のすべてのShapeをループ
    Dim 設定Shape As Shape
    For Each 設定Shape In Worksheets("○○").Shapes

        ' テキストのある図形のみを処理
        If 設定Shape.TextFrame2.HasText Then

            ' 「テキストを図形からはみ出して表示する」
            ' 垂直方向
            設定Shape.TextFrame.VerticalOverflow = xlOartVerticalOverflowOverflow
            ' 水平方向
            設定Shape.TextFrame.HorizontalOverflow = xlOartHorizontalOverflowOverflow
        
            ' 「図形内でテキストを折り返す」
            設定Shape.TextFrame2.WordWrap = msoFalse
            
        End If
        
    Next

End Sub

 
今回のコードをすべてShapeに対して実行しようとすると、
写真(picture)などでエラーとなってしまいます。

それを回避するためにHasTextプロパティを判定し、
図形内テキストが設定できるShapeにのみ実行しています。

Shapeでない変数に実行する場合のコード

Selectionのうちの1つに対して実行するときなど、
取得した変数がShapeではない場合は以下のコードを実行します。

Sub 選択しているすべての図形に改行制御を設定をする()

    ' 選択している図形の数を取得
    On Error Resume Next
    Dim 図形数 As Long
    図形数 = Selection.ShapeRange.Count
    On Error GoTo 0
    
    ' 選択しているのが図形でなければ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

End Sub

Selectionをループしたときなど
図形なんだけどAs Shapeではないもの」を取得していることがあります。

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


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


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

便利なプロパティですのでついでに覚えておいてください。