【入門編】図形内テキストの高度な段落制御:ParagraphおよびTabsセルのVBAダイレクト操作 – Visio VBA解析バイブル

スポンサーリンク

こんにちは!Visioの自動化の世界へようこそ。
マクロの記録ボタンを押して生成されたコードを眺めて、「なんだかよく分からないけれど動くぞ……」とホッとしたのも束の間、少し複雑なレイアウトを組もうとした途端に手が止まってしまった経験はありませんか?

特に、図形の中にあるテキストの「インデント」「行間」「タブ位置(タブストップ)」を綺麗に揃えようとした時、GUI操作なら簡単なのに、VBAから制御しようと途端に壁にぶつかる方が非常に多いです。

今回は、Visioの心臓部である「ShapeSheet(シェイプシート)」のParagraph(段落)セクションとTabs(タブ)セクションをVBAからダイレクトに叩き、テキストのレイアウトを意のままに操る極限の知見を授けましょう。

ここをクリアすれば、あなたも単なる「マクロの記録ユーザー」から、Visio VBAを完全に掌握したエンジニアへとステップアップできますよ。それでは、一緒に本質に迫っていきましょう!

1. なぜVisioのテキスト制御は難しいのか?(オブジェクトモデルの正体)

ExcelやWordであれば、`Range.ParagraphFormat` のような直感的なオブジェクトが用意されています。しかし、Visioは「図形描画エンジン」です。すべての情報は、図形が持つ内部データベース「ShapeSheet」というスプレッドシート形式のセルの集まりによって管理されています。

テキストの段落設定も例外ではありません。
Visio VBAでテキストを制御するということは、Excelのセルに数値を書き込むように、ShapeSheetの特定の行・列(Cell)の値をVBAから直接書き換えるという作業を意味します。

段落とタブの基礎知識

  • Paragraphセクション: インデント(左・右・1行目)、行間、段落前後のスペースなどを管理します。
  • Tabsセクション: 「どこで文字を右揃え・中央揃え・左揃えにするか」というタブ位置の座標を管理します。

これらをコードから自由自在に操れるようになると、仕様書や複雑な表形式の図形を、プログラム一発で美しく整列させることが可能になります。

2. 現場で即戦力になる!Paragraph(段落)セクションの操作

まずは、図形内のテキストに対して「左インデント」と「行間」を設定する基本的なコードを見てみましょう。

以下のコードは、選択中の図形に対して、段落の1行目インデントを深くし、行間を少し広げる処理を行うものです。

Sub FormatShapeParagraph()
Dim shp As Visio.Shape

‘ 選択されている図形があるかチェック
If ActiveWindow.Selection.Count = 0 Then
MsgBox “対象となる図形を選択してください。”, vbExclamation
Exit Sub
End If

Set shp = ActiveWindow.Selection(1)

‘ テキストが含まれているか確認
If shp.CellExistsU(“LineCount”, False) = False Then
MsgBox “選択された図形にはテキストが含まれていません。”, vbExclamation
Exit Sub
End If

‘ —————————————————-
‘ ShapeSheetのParagraphセクションを操作する
‘ —————————————————-
On Error GoTo ErrorHandler

‘ 1. 左インデントを設定 (例: 5mm)
‘ 第2引数(インデックス)は 0 から始まります(0行目/0番目の段落)
shp.CellsU(“Paragraph[0].LeftIndent”).FormulaU = “5 mm”

‘ 2. 1行目のインデントを設定 (例: -3mm でぶら下げインデントに)
shp.CellsU(“Paragraph[0].FirstLineInd”).FormulaU = “-3 mm”

‘ 3. 行間を設定 (例: 120% に設定。単位なしの数値またはパーセンテージ)
shp.CellsU(“Paragraph[0].LineSpacing”).FormulaU = “120%”

MsgBox “段落の書式設定が完了しました!”, vbInformation
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub

コードのポイント解説

  • `Paragraph[0]`: ShapeSheetにおける「0番目の段落(先頭の段落)」を指定しています。Visioでは複数の段落が存在する場合、`Paragraph[1]`, `Paragraph[2]` とインデックスが増えていきます。
  • `FormulaU` プロパティ: Visio VBAでは、セルに値を代入する際、`Value` ではなく `FormulaU`(または `Formula`)を使います。単位(`mm` や `%`)を文字列としてそのまま渡せるのがVisioの強力な特徴です。

3. さらに高度に!Tabs(タブ)セクションで文字位置を完全に揃える

仕様書やパーツリストのような「項目名 と 値」を綺麗に縦に揃えたい時、スペースキーで調整していませんか? それは絶対にNGです。フォントが変わった瞬間にレイアウトが崩壊します。

ここで使うのがTabsセクションです。VBAからタブ位置(Tab Stops)をミリ単位で正確に配置しましょう。

以下のコードは、図形内のテキストに「20mmの地点に中央揃えタブ」「50mmの地点に右揃えタブ」を設定する実用的なサンプルです。

Sub SetCustomTabStops()
Dim shp As Visio.Shape
Dim tabRowIndex As Integer

If ActiveWindow.Selection.Count = 0 Then Exit Sub
Set shp = ActiveWindow.Selection(1)

‘ セルが存在するか、あるいは確実に追加するためにセクション操作を行う
‘ VisioのTabsセクションは、存在しない行を追加する場合 AddRow を使います

On Error GoTo ErrorHandler

‘ —————————————————-
‘ 1つ目のタブ位置を設定 (20mm地点、中央揃え)
‘ —————————————————-
‘ Tabsセクションに行を追加 (visSectionTab = -4 またはセクション定数)
‘ すでに存在する場合はエラーになることがあるため、行の存在確認をするのが安全ですが、
‘ 今回はシンプルにダイレクトセル参照の挙動を解説します。

‘ すでにTabsの行がある前提で、0行目を操作する場合:
‘ タブ位置 (Tab[0].Position)
shp.CellsU(“Tabs[0].Position”).FormulaU = “20 mm”

‘ タブの種類 (Tab[0].Align): 0=左揃え, 1=中央揃え, 2=右揃え, 3=小数点揃え
shp.CellsU(“Tabs[0].Align”).FormulaU = “1” ‘ 中央揃え

‘ —————————————————-
‘ 2つ目のタブ位置を追加・設定 (50mm地点、右揃え)
‘ —————————————————-
‘ 2つ目のタブ(Tabs[1])が存在するか確認し、なければ行を追加する実務的なアプローチ
Dim cellName As String
cellName = “Tabs[1].Position”

If shp.CellExistsU(cellName, False) = False Then
‘ 行が存在しない場合は、Tabsセクションに行を追加
‘ visSectionTabs = -14 (Visioのセクション定数)
shp.AddRow visSectionTabs, visRowLast, visTagDefault
End If

shp.CellsU(“Tabs[1].Position”).FormulaU = “50 mm”
shp.CellsU(“Tabs[1].Align”).FormulaU = “2” ‘ 右揃え

MsgBox “タブ位置の設定が完了しました!”, vbInformation
Exit Sub

ErrorHandler:
MsgBox “タブ設定中にエラーが発生しました: ” & Err.Description, vbCritical
End Sub

ここで知っておくべき「プロの知見」

VisioのShapeSheetにおいて、`Paragraph` や `Tabs` のような動的セクション(行数が可変のセクション)を操作する際、「まだ存在しない行のセルを直接叩こうとすると実行時エラーになる」という罠があります。

そのため、実務で堅牢なツールを作る際は、以下のようなステップを踏むのがプロの流儀です:
1. `shp.CellExistsU(“Tabs[1].Position”, False)` でセルの存在を確認する。
2. 存在しなければ `shp.AddRow` メソッドで確実に行を生成してから値を書き込む。

この一手間を知っているだけで、現場で「突然マクロが止まった!」という不具合を防ぐことができます。

4. 陥りやすいエラーと対策

1. 「指定されたセルが見つかりません」というエラー(Error 1004など)

  • 原因: 該当する行(例: `Paragraph[1]` や `Tabs[2]`)がまだ図形側に作られていない状態でアクセスしています。
  • 対策: `AddRow` を使ってあらかじめ行を追加するか、存在するインデックス(基本は `[0]`)に対して処理を行ってください。

2. 単位のエラー(数字がおかしくなる)

  • 原因: `FormulaU` に数値をそのまま代入した際、Visioのドキュメント単位(インチなど)と意図がズレることがあります。
  • 対策: `”20 mm”` や `”120%”` のように、単位を明示的に文字列として渡すのが最も安全で確実です。`FormulaU` は「ShapeSheetに書き込む数式そのもの」を指定するプロパティだからです。

まとめ:Visio VBAマスターへの道

今回は、図形内テキストの高度な段落制御として、`Paragraph` セルと `Tabs` セルをVBAから直接操作する方法を解説しました。

  • ShapeSheetは怖くない! Excelのセルと同じように、インデックスを指定して数式(`FormulaU`)を流し込むだけ。
  • 動的セクションには `AddRow` が必須。存在確認と組み合わせることで、エラーの無い強靭なマクロが書ける。

ここをクリアしたあなたなら、もう「マクロの記録」の枠に縛られる必要はありません。自動化の可能性は無限大に広がっています。ぜひ、日々の業務や図面生成の効率化にこの知見を役立ててくださいね。「ここもっと詳しく知りたい!」というリクエストがあれば、いつでも先輩エンジニアにお声がけください!

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