図形内のテキストが変な位置で改行されてしまうのを防ぐために、
- 「テキストを図形からはみ出して表示する」をチェック
- 「図形内でテキストを折り返す」のチェックを外す
この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が図形か(セルではないか)を判定するのにも使えます。
便利なプロパティですのでついでに覚えておいてください。