【入門編】ページ設定セルへの直接アクセス:Page.PageSheetのVBA操作と特殊アスペクト比の適用 – Visio VBA解析バイブル

スポンサーリンク

こんにちは!Visio VBAの自動化の世界へようこそ。
マクロの記録ボタンを押して、生成されたコードを眺めてみたものの、「なんだか冗長だな」「本当に動かしたいサイズや設定がうまく変えられないな」とモヤモヤしていませんか?

今回は、Visio VBAの真骨頂であり、多くの開発者がつまずく「PageSheet(ページシート)」の扉を開きます。

通常のプロパティ操作では手の届かない、ページの「裏側」に隠された数式セルを直接書き換えることで、変則的なサイズや特殊なアスペクト比のダイアグラムを自由自在に操る方法を伝授しましょう。ここをクリアすれば、あなたのVisio VBAスキルは確実に「初学者」の領域を抜け出します。一緒にマスターしていきましょう!

1. Visioの「裏側」を知る:PageSheetとは何か?

Visioの画面上で行うすべての設定(図形の大きさ、位置、そしてページ自体のサイズなど)は、実はすべて「Sheet(シート)」と呼ばれる数式管理テーブルのデータとして保持されています。

  • 図形の裏側:Shape.CellsU / CellsSRC
  • ページの裏側:Page.PageSheet

そう、「ページそのものも、ひとつの巨大な図形(のようなもの)として裏で管理されている」というのがVisioのアーキテクチャの核心です。

画面の「ページ設定」ダイアログで数値をポチポチ入力する代わりに、VBAからこの `Page.PageSheet` を経由して、用紙幅(`PageWidth`)や用紙高さ(`PageHeight`)のセルに直接アプローチすれば、ダイアログでは表現しきれない極端なサイズや、特殊なアスペクト比のキャンバスを秒速で構築できるようになります。

2. なぜ通常のプロパティではダメなのか?

Visio VBAを書き始めると、次のようなコードを試したくなるはずです。

‘ 【よくある誤ったアプローチ】
ActivePage.PageWidth = 10 ‘ エラーになるか、無視されることがある

Visioのオブジェクトモデルにおいて、ページのサイズは単なる数値変数ではありません。Excelのように「数式(Formula)」として保持されています(例: `”210mm”` や `”8.5in”` など)。そのため、値を代入するだけでは単位の競合やガード(保護)に阻まれ、意図通りに動かないことが多々あります。

ここで登場するのが、`CellsU` プロパティセル名(文字列)の直叩きです。

3. 実践コード:特殊アスペクト比のページを動的生成する

それでは、実際に動くコードを見てみましょう。
今回は、パノラマ写真のような極端な横長(例: 幅 1000mm × 高さ 200mm)の特殊サイズページを、VBAが一瞬で構築するサンプルコードを用意しました。

開発環境(VBE)の標準モジュールに貼り付けて実行してみてください。

Sub CreateCustomAspectPage()
Dim vsoPage As Visio.Page
Dim vsoPageSheet As Visio.Shape

‘ 1. 新規ドキュメントの「空白の図面」から新しいページを追加
Set vsoPage = ActiveDocument.Pages.Add

‘ 2. ページの裏側(PageSheet)のオブジェクトを取得
‘ ※ここが今回の最重要ポイントです!
Set vsoPageSheet = vsoPage.PageSheet

‘ 3. エラーハンドリング:単位系や保護を無視して強制書き込みの準備
On Error GoTo ErrorHandler

‘ 4. ページ幅(PageWidth)とページ高さ(PageHeight)のセルに直接数式を代入
‘ 単位として “mm” を文字列に含めることで、Visioが自動的に内部換算してくれます
vsoPageSheet.CellsU(“PageWidth”).FormulaU = “1000 mm”
vsoPageSheet.CellsU(“PageHeight”).FormulaU = “200 mm”

‘ 5. ついでに図面尺度(PageScale)も1:1に固定する
vsoPageSheet.CellsU(“PageScale”).FormulaU = “1”
vsoPageSheet.CellsU(“DrawingScale”).FormulaU = “1”

MsgBox “特殊アスペクト比(1000mm × 200mm)のページを作成しました!”, vbInformation, “成功”
Exit Sub

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

コードの解説

1. `Set vsoPageSheet = vsoPage.PageSheet`
これでページの裏側にある心臓部(PageSheet)を掴みました。
2. `CellsU(“PageWidth”).FormulaU = “1000 mm”`
`CellsU` は、言語に依存しないユニバーサル名でセルを指定するメソッドです。さらに `FormulaU` を使うことで、ロケール(日本語版や英語版など)の違いによるエラーを防ぎつつ、文字列として数式(値と単位)をダイレクトに流し込むことができます。

4. 現場で陥りやすい罠とエラー回避の知恵

この `PageSheet` 操作をマスターすると一気に自動化の幅が広がりますが、現場のエンジニアがつまずきやすい「罠」がいくつかあります。あらかじめ知っておきましょう。

罠①:単位を省略して数値だけを放り込む

‘ 駄目な例
vsoPageSheet.CellsU(“PageWidth”).FormulaU = “500”

Visioはドキュメントのデフォルト単位(インチやメートル法など)を基準に動いています。単位(`mm`, `cm`, `in` など)を省略すると、意図しないミクロなサイズや巨大なキャンバスになってしまうことがあります。必ず単位の文字列をセットで渡すのがプロの作法です。

罠②:図面尺度(DrawingScale)との戦い

Visioには「ページ上のサイズ(PageWidth)」と「現実世界の縮尺(DrawingScale)」という概念があります。
地図や図面作成のテンプレートだと、この縮尺が邪魔をして「コードで100mmに設定したはずなのに、図面上のスケールで縮小されてしまう」という現象が起き上がります。
特殊なダイアグラムを作る際は、上記のサンプルコードのように `PageScale` と `DrawingScale` の両方を `1`(つまり1:1)に固定する 癖をつけておくと、計算違いによるトラブルを完全に防げます。

まとめ:ここをクリアすれば、Visio VBAの基本はバッチリです!

お疲れ様でした!今回は少しディープな `Page.PageSheet` の世界を覗いてみました。

  • Visioのページや図面の設定は、すべて裏側の「シート(Cell)」で数式として管理されている。
  • 通常のプロパティでダメなときは、`PageSheet.CellsU(“セル名”).FormulaU` で直接ねじ込む。
  • 単位(`mm` など)を明示し、縮尺(Scale)にも気を配る。

この基本原則さえ押さえておけば、どんなに変則的なサイズ要求のドキュメント作成であっても、あなたのVBAスクリプトが完璧に、そして一瞬で形にしてくれます。

ここをクリアできれば、もう「マクロの記録の奴隷」ではありません。自信を持って、あなたの業務をどんどん自動化していってくださいね。それでは、次のステップでお会いしましょう!

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