※マクロはエクセル2007でのものです。2003でも動きました。
これまでよく簡単極まりないといっていますが、今回は何が難しいのですか。
=⇒整列のコマンドは簡単なのですが、基本的なところが違うのです。今までは、複数の図形を対象としていますが、いって見れば、他の図形との関係はまったくありません。他の図形と独立なのです。しかし、今回の場合は、他の図形の情報が必要なのです。一遍で関連する図形を指定しなければなりません。図形の数がいつも変わってしまい、図形の指定の命令文も変わってしまうということです。
今、処理できるのは、ある特定の条件に絞られてしまいます。その範囲を広げれば広げるほど、冗長的に命令文が増えてしまうのです。
例えば、普通のワークシート上で、繋がっていない複数の範囲を指定する場合は、Ctrlを押しながらクリックします。するとマクロはどうなるというと、
"Range("A1:C3,B5:D7,…").Select" というようになります。
カッコの中が増えていくのです。
これを文字列としてつくり(変数化する)、カッコの中に入れてやれば、うまくいくと思ったのですが、エラーになりこの手が使えないのです。
ActiveSheet.Shapes.Range(Array("角丸四角形 186", "角丸四角形 187", "角丸四角形 188", "角丸四角形 189", "角丸四角形 190")).Select
とか
ActiveSheet..Shapes.Range(Array(1, 2, 3)) …
と記述する必要があるのですが、カッコ内の文字列が出来ないのです。
後者の例で、単純に、a="1, 2, 3"として、…Array(a)…とするとエラーになってしまうのです。また、(z_no(1),z_no(2),z_no(3),z_no(4),z_no(5),z_no(6),z_no(7))として、有効数以降はヌルをいれるという手もエラーになってしまいます。
ということで、二つの場合は、三つの場合は、四つの場合は、…と、それぞれの場合を記述していかなければならないのです。そのために冗長的になってしまうのです。
と書いたところであるアイデアが生まれました。
この手で、冗長さを解消できるかどうかやって見ます。その結果は、次回に。
今回は冗長的なものを紹介します。
1.対象とする図形の範囲を入力する
2.処理区分を入力する
3.整列処理の前処理
4.整列処理
1.はいつものように省略です。本当によく使われますね。
2.
kubun = InputBox("処理区分を入力してください。 " & vbCrLf & _
"1=⇒水平に整列" & vbCrLf & _
"2=⇒垂直に整列" & vbCrLf & _
"3=⇒水平に均等配置" & vbCrLf & _
"4=⇒垂直に均等配置" & vbCrLf & _
" " & vbCrLf _
, xpos:=2000, ypos:=3000, Default:=1)
処理区分1と3の違いは何ですか?
=⇒1.は横軸が統一されます。横一線になります。しかし、横の位置は変わりません。すなわち、垂直の位置だけが統一されるということです。
3.は横一線にはなりませんが、横の位置が均等化されるのです。すなわち、垂直の位置は変わらないのですが、水平の位置が均等な間隔に配置されるのです。
二つを掛け合わせれば、均整のとれた横一線ということになります。
【原図】

【"水平に整列"の処理後】

【"水平に均等配置"の処理後】

3.整列させる図形範囲の記述
j = no1
z_no = no9 - no1 + 1
Select Case z_no
'1
Case 1
ActiveSheet.Shapes.Range(Array(j)).Select
'2
Case 2
ActiveSheet.Shapes.Range(Array(j, j + 1)).Select
'3
Case 3
ActiveSheet.Shapes.Range(Array(j, j + 1, j + 2)).Select
:
というように、続けていきます。これが冗長的の正体です。
現時点では最大10個までの記述としています。これを増やしていけば、100個でも可能です。が、気持ちが悪いのです。
4.図形の整列
これは単純です(文末のFalseの意味はわかりません)。
Select Case kubun
'水平に整列
Case "1"
Selection.ShapeRange.Align msoAlignMiddles, False
'垂直に整列
Case "2"
Selection.ShapeRange.Align msoAlignCenters, False
'水平に均等配置
Case "3"
Selection.ShapeRange.Distribute msoDistributeHorizontally, False
'垂直に均等配置
Case "4"
Selection.ShapeRange.Distribute msoDistributeVertically, False
Case Else
Exit Sub
End Select
おしまい。

0 件のコメント:
コメントを投稿