Zオーダーとは?
Excelでオートシェイプや画像などの図形を複数扱う場合、重なりあう部分が出てきます。このときに、あとから配置した方が最前面(全て見える状態)で表示されます。
このような状態のときに、図形を選択して「図形の書式」タブ → 配置 → 「前面へ移動」や「背面へ移動」を操作することで重なりの順序を入れ替えることが出来ます。
Zオーダーとは、このような図形の重なり順序を指します。Excelのシートの列(X軸)と行(Y軸)に対して、深さを表すため、Z軸の順序=Z order(オーダー)と命名されています。
Photoshopなどの画像ソフトでの「レイヤー」の重なり順序、というとイメージしやすい方もいると思います。
「Zオーダー」という言葉は普段Excelを使っているときに使うことはまずありません。VBAで深さの操作を行う際に出てきます。
ZOderメソッド
図形はShapeRangeオブジェクトを使って操作します。
そして、これらの図形の重なり順序を変更するには、ShapeRangeオブジェクトのZOderメソッドを利用します。
Sub ZOrder(ZOrderCmd As MsoZOrderCmd)
ZOrderCmd | 指定した図形の配置をMsoZOrderCmd列挙型で設定します。 |
MsoZOrderCmd列挙型
定数 | 値 | 内容 |
---|---|---|
msoBringForward | 2 | 図形を今の位置から1つ前面に移動させる。 |
msoBringInFrontOfText | 4 | Wordでのみ利用可能。図形をテキストの前面に移動させる。Excelの場合は指定しても無視される。 |
msoBringToFront | 0 | 図形を最前面に移動させる。 |
msoSendBackward | 3 | 図形を今の位置から1つ背面に移動させる。 |
msoSendBehindText | 5 | Wordでのみ利用可能。図形をテキストの背面に移動させる。Excelの場合は指定しても無視される。 |
msoSendToBack | 1 | 図形を最背面に移動させる。 |
ZOder用の関数
Excelで指定できるのは、前面、背面、最前面、最背面の4つです。選択図形のZオーダーを頻繁に変える場合はそれぞれの関数を用意しておいた方がいいでしょう。
というのも、VBAで図形の処理を行う場合、図形が選択されていない場合や引数で指定されていない場合にShapeRangeオブジェクト変数として扱おうとしても対象図形を参照できない場合があります。その場合はエラーになってしまいます。
ZOrderメソッドを使う箇所ごとにエラー処理を入れるのは面倒なので、関数にしておいて関数側でエラー処理を入れておいた方が使い勝手がよくなります。以下はエラー処理を入れた場合の参考コードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
'// 図形を今の位置から1つ前面に移動させる Sub ZOrder_msoBringForward() On Error GoTo ERROR_EXIT Dim shp As ShapeRange Set shp = Selection.ShapeRange '// 図形を今の位置から1つ前面に移動させる Call shp.ZOrder(msoBringForward) ERROR_EXIT: End Sub '// 図形を最前面に移動させる Sub ZOrder_msoBringToFront() On Error GoTo ERROR_EXIT Dim shp As ShapeRange Set shp = Selection.ShapeRange '// 図形を最前面に移動させる Call shp.ZOrder(msoBringToFront) ERROR_EXIT: End Sub '// 図形を今の位置から1つ背面に移動させる Sub ZOrder_msoSendBackward() On Error GoTo ERROR_EXIT Dim shp As ShapeRange Set shp = Selection.ShapeRange '// 図形を今の位置から1つ背面に移動させる Call shp.ZOrder(msoSendBackward) ERROR_EXIT: End Sub '// 図形を最背面に移動させる Sub ZOrder_msoSendToBack() On Error GoTo ERROR_EXIT Dim shp As ShapeRange Set shp = Selection.ShapeRange '// 図形を最背面に移動させる Call shp.ZOrder(msoSendToBack) ERROR_EXIT: End Sub |
ZOrderPositionプロパティ
図形の重なり順序がどの位置にあるかを知りたい場合には、ShapeRangeオブジェクトのZOrderPositionプロパティを利用します。
ZOrderPositionプロパティは読み取り専用のため、調べたい対象の画像などの重なり順序を知ることはできますが、重なり順序を変更することはできません。
Property ZOrderPosition As Long
戻り値 | 図形の重なり順序を返します。最背面は1になります。 |
例えば、図形が10個あれば最前面の図形のZOrderPositionプロパティは10を返します。図形が重なっていなくてもシートにあるそれぞれの図形にはZオーダーが設定されているため、図形それぞれでZOrderPositionプロパティが同じなることはありません。
また、グループ化している図形の場合は、グループ化したあとの図形と、グループ化する前の個別の図形にはそれぞれZOrderPositionプロパティが設定されます。
以下はZOrderPositionプロパティの値を出力する関数です。1つ目の関数が選択図形のZOrderPositionプロパティ値を取得し、2つ目の関数が1つ目の関数を呼び出しているZOrderPositionプロパティ結果を出力しているテスト関数です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Function GetZOrderPosition() On Error GoTo ERROR_EXIT Dim shp As ShapeRange Set shp = Selection.ShapeRange GetZOrderPosition = shp.ZOrderPosition Exit Function ERROR_EXIT: GetZOrderPosition = 0 End Function Sub GetZOrderPositionTest() Dim i i = GetZOrderPosition Debug.Print i End Sub |