ショートプログラム
ページ間の複写  

以前公開していたVBAネタですが需要がありそうなので再度紹介します。(2007.9.21)
Visioを使ってドキュメントを作成していると、別なページにシェイプをコピーしたいことがあります。このときプルダウンメニューの「編集/ページ全体をコピー」して「編集/貼付け」ではコピー元と違う場所に貼り付けられてしまいます。
ガイドやグリッドを駆使して位置を合わせたり、用紙枠を作ってグループ化してから貼り付けたりと色々な工夫をしている方が多いようです。
私宛ての質問メールで一番多いのがこの手の質問です。
私自身は複数ページで作業することがほとんどないので、必要を感じなかったんですが不便に感じている方が多いようなのでVBAでシェイプを同じ位置にコピーするプログラムを作ってみました。
テンプレートファイルはsample.lzh(15kb)からダウンロードしてください。
ダウンロードした圧縮ファイルは解凍し、適当なフォルダへ入れて下さい。
既存の図面に適用させる場合はVBAコードをコピー&ペーストしてください。
ダウンロードしたテンプレート(sample1.vst)をVisioで開くと、「ページのコピー」と「ページの貼付け」というショーットカット(マウス右クリックで出てくるメニュー)ができます。テンプレートの元は「空白の図面.VST」です。
操作は、別のページにコピーしたいシェイプを選択してからマウス右クリックで「ページのコピー」を実行します。

ページを切り替えたらマウス右クリックで「ページの貼付け」を実行すると前のページと同じ所にシェイプが貼り付けられます。

左がVBAを使ったページの複写の結果、右が普通にコピー&ペーストした例です。
中央のコピー元と比較してみてください。
注意として、異なる縮尺、異なる原点間でのコピー/貼付けは正しい結果が得られません。
また、プログラムの動作結果については責任を負いません。
※本機能は、Visio2010では標準で装備されています。
Visio2010では、貼り付けのオペレーションによって、他ページへの貼り付け位置が決まります。
| ・ | 「ホーム」タブの「貼り付け」またはキー操作で[Ctrl]+[V]キー →コピー元のページ上の位置と同じ位置に貼り付けられます。 |
| ・ | マウス右クリックの「貼り付け」 →ページ上で右クリックした位置に貼り付けられます。 |
マクロの概要
ThisDocumentのDocumentCreatedイベントは「テンプレートの複製を開いた時」、DocumentOpenedイベントは「テンプレートのオリジナルを開いた時」に起こります。
この二つのプロシージャから呼ばれるCreateShortCutMenuでは、マウスの右クリックででるショーットカットに「ページのコピー」と「ページの貼付け」といった二つのメニューと、それぞれで呼ぶべきプロシージャを定義しています。
ショートカットには、自分で作ったプロシージャの他にCmdNumを使いVisioの機能を呼び出すことが可能です。
例えば
Set menuItemObj = menuObj.MenuItems.AddAt(0) menuItemObj.Caption = "カスタムプロパティ" menuItemObj.CmdNum = 1312 menuItemObj.AddOnName = "" menuItemObj.MiniHelp = ""
とするとショートカットに「カスタムプロパティ」が追加され、実行するとカスタムプロパティのダイアログが表示されます。
1312がVisioの機能番号になっており、VBAではVisio.visCmdFormatCustPropEditで現されます。
シェイプを選択して「ページのコピー」を実行すると、CopyPageが呼び出されます。
CopyPageは選択された図形をグループ化し、グループのピン座標をグローバル変数に記録します。
記録が出来たら、グループをクリップボードに転送し、グループ解除を行います。
この状態で、普通の「貼り付け」を行うと図面ページの中心にグループ図形が貼付きます。
新しいページに切り替えて「ページの貼付け」を行うと、PastePageが呼び出されます。
PastePageはクリップボードの内容を一旦図面ページに貼付けてから、貼り付けた内容がVisioのグループ図形かどうかを確認します。
グループ図形ならば、CopyPageで記録したピン座標をグループ図形に与えて、コピー元と同じ位置にグループを移動します。
グループ図形の移動が終わったら、グループを解除します。
気づいた方もいらっしゃると思いますが、ページ間の縮尺や原点が異なっている場合は正しい結果が得られません。
異なる縮尺/原点間のコピーに対応するのは難しくないので挑戦してみて下さい。
