2010年9月18日土曜日

第157回目 範囲に名前を付ける。その名前を使った処理

○第157回目 範囲に名前を付ける。その名前を使った処理

 印刷関係のマクロはよく使います。なかでも一、二を争うのが、範囲印刷とページ指定印刷です。
 このうちの範囲印刷での話し
 
 エクセルでは行列をいろいろと挿入して、表のかたちを修正していきます。最初に最終形ができていなくても、この機能があるので、後で修正がききます。このためやりながら考えていくということができます。
 これはいいのですが、範囲印刷で座標で場所のなかで列・行の挿入・削除などがおきると、印刷範囲が狂ってしまい、印刷範囲の座標をもう一度求めなおさなければならなくなります。
 あれこれ考えていたのですが、あるとき、ひらめいて、名前を付けていると、その後の列行の挿入・削除でどうなるのかな…。
 やってみたところ、名前を付けられた範囲が、列行の挿入削除に伴い変わるのです。
 これです。
 操作のイメージです。
 0.範囲を指定して、そこに名前をつけ、その名前を、その範囲のそばのセルに入れておきます。
 ・名前があるセルを指定して、範囲印刷をします。
 範囲印刷のマクロに若干修正が必要ですが、この機能は、便利です。

 別にふたつの機能も考えてみました(これまでの機能を1として加えた)。
 1.指定した範囲を、指定したセルに名前として書き込む
 2.名前のあるセルを指定して、その範囲を選択する。
 3.名前を全部表示させて、その中から選択した場所に飛ぶ。
 
 まずは、1.から
 名前をいちいち考えるのは面倒なので、自動的に決めます。PR_先頭座標としました。これなら、ほとんど重複しないでしょう。
 どう書くのかというと、これは知っているかいないかだけのことです。
 まず選択された範囲の座標を取得します。
 Rng = Selection.Address(ReferenceStyle:=xlR1C1)
 名前を設定します。
  ActiveWorkbook.Names.Add Name:="PR_" & AAA1, RefersToR1C1:="='" & _
  shname0 & "'!" & Rng
  AAA1には範囲の先頭セルの座標が入っています
  shname0 には当該シート名が入っています。
  座標は、R1C1形式でなければいけないようでした。

 2.名前のあるセルを指定して、その範囲を選択する。
 これは簡単です。
 bbb = Selection.Value
 Range(bbb).Select

 3.名前を全部表示させて、その中から選択した場所に飛ぶ。
 まずは範囲を取得しなければなりません。どう書くのかというと、これも知っているかいないかだけのことです。
 i = 1
 For Each MyName In ActiveWorkbook.Names
  cell_name1(i) = MyName.Name '定義された名前の名称
  cell_name2(i) = MyName 'セル範囲の座標であり、頭に = がついている。シート名+座標
  cell_name2(i) = Mid$(cell_name2(i), 2)
  cell_name0(i) = cell_name1(i) & "--" & cell_name2(i)
  i = i + 1
 Next
 あとは、インプットボックスにcell_name0(i)を表示し選択するだけです。
 選択した場所の名前は、cell_name1(i) となります。

 指定した番号の名前に飛ぶのは、2.でやったとおりです。
 
 おまけです。
 指定した名前の削除をします。
 番号指定は、*をつけることにして飛ぶ場合と区別します。
  Range(cell_name1(name_no)).Select
  ActiveWorkbook.Names(cell_name1(name_no)).Delete
 ※入力値から、*をとることを忘れないように。