2007年9月22日土曜日

第44回目 エクセルのファイルを分析する(その6)

○第44回目 エクセルのファイルを分析する(その6)

 "エクセルのファイルの分析"の最後に、一つのシート名等の追記及びシートの並べ替えを考えます。

 シートを追加しました。その際、シートの目次を更新する必要があります。その対応です。
 手動で、行を挿入します。そこに、該当するシート番号のシート名等を追記するものです。基本は、第35回(第36回で改修した後のもの)のものを原形として作成します。
 "すべてのシートのシート名等"であるものを"指定するシート名等"に変更すればいいのです。
 シートの指定は、シート番号で行なうのがいいでしょう。
 ・該当するシート番号の入力
 ・そのシート名、リンク、コメントを貼り付ける
 となります。
 Sheets(i).selectでシートを特定してから、シート名等を取得し、貼り付けてください。

 次のテーマです。
 色々作業を行なっていると、シートの順番を変えたほうが整理上いいということが起こります。
 それに対応するものですが、与えるデータは単純なものを考えます。
 それは、シートごとに、現シートの順番(1から)と新しいシートの順番の対応させたデータです。
 1=⇒1、2=⇒2、3=⇒6、4=⇒3、5=⇒4、6=⇒5というようにです。(シート数6個の場合)
 いままでの処理では、D列はシートの番号、E列は作業域となっていますので、そのE列に新しい順番を入れていきます。この2列を指定します。
 指定した後からマクロを動かすとします。
 指定範囲の座標の取得は毎度おなじみですね。

'座標の取得
AAA = Selection.Address
p1 = InStr(AAA, ":")
AAA1 = Left(AAA, p1 - 1)
AAA9 = Mid(AAA, p1 + 1)
retu1 = Range(AAA1).Column
gyo1 = Range(AAA1).Row
retu9 = Range(AAA9).Column
gyo9 = Range(AAA9).Row

gyo_cnt = gyo9 - gyo1 + 1
retu_cnt = retu9 - retu1 + 1

 シートの番号の対応を取得します。
For i = 0 To gyo_cnt - 1
n_gen(i) = cells(gyo1+i,retu1) + 1   '現在のシート番号
n_new(i) = cells(gyo1+i,retu2) + 1  '新しいシート番号
Next i
 プラス1はおまじないです。

'おマジナイのシートを追加。一番最初に追加されます。
Sheets(1).Select
Sheets.Add.Name = "Dummy"

 これからが眼目です。
 シートの移動は、
Sheets(2).Move after:=Sheets(4) です。
これを動かすとシートの内容は、
1.2.3.4.5.6から、1.3.4.2.5.6となります

また、元に戻してから
Sheets(6).Move after:=Sheets(4) を動かすと、
1.2.3.4.5.6から、1.2.3.4.6.5となります。動き方がちょこっと違います。

 また、一番先頭にシートを動かすには、この構文では無理です。
 そこで、おまじないのシートを先頭に追加しました。
Sheets(6).Move after:=Sheets(1) を動かすと、
1.2.3.4.5.6.7から、1.6.2.3.4.5.7となります。同じ構文で可能になります。
そして、おまじないのシートは一番最後に跡形もなく消します。

 具体的な処理は、一つのシートを置き換えていき、その他のシートの番号を新しい順番に更新していきます。そして、次ぎの置換えを行います、という繰り返しとなります。繰り返しの回数はgyo_cnt回となります。
 考えていると頭がこんがらがってきます。
 処理をシートを前に動かす場合、後ろに動かす場合とに分けて考えます。
Sheets(2).Move after:=Sheets(4)は、前者の例で、
Sheets(6).Move after:=Sheets(4)は、後者の例です。

n_new(i)《=更新後の順番》 < j =" 0">、< ⇒ =>、>= ⇒ <、> ⇒ <=、= ⇒ <> 、<> ⇒ =

  "1でない"、かつ、"4でない"
  if (n_gen(j) > n_new(i)-1) and (n_gen(i)+1 > n_gen(j)) then
:
  end if

 ・2を逆にしてみましょう。
 もとの条件は
  (n_new(i) <= n_gen(j)) and (n_gen(j) <= n_gen(i)-1)  となっています。これを単純に変えて、かつ、andの処理をすればいいのです。  and と orはお互いに反対になっていますので、and は or へ、or は andとなります。  したがって、   (n_new(i) > n_gen(j)) or (n_gen(j) > n_gen(i)-1)
 となります。
 これを使うと、次のようになります。
 if (n_new(i) > n_gen(j)) or (n_gen(j) > n_gen(i)-1) then
  3の処理
 else
   2の処理
 end if

 しかし、普通の書き方は次ぎのようになります。
 if (n_new(i) <= n_gen(j)) and (n_gen(j) <= n_gen(i)-1) then   2の処理  else    3の処理  end if  まとめると、   if (n_gen(j) > n_new(i)-1) or (n_gen(i)+1 > n_gen(j)) then '1と4の場合は末尾のend ifに飛び、ここでは何の処理もされない
    if (n_new(i) <= n_gen(j)) and (n_gen(j) <= n_gen(i)-1) then
    2の処理
    else
     3の処理
    end if
 end if

 頭を酷使しましたので、ここまでとします。

0 件のコメント: