2007年9月25日火曜日

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

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


 シートの移動です。
 今回はシートを後ろに動かす場合です。

 n_new(i)《=更新後の順番》 > n_gen(i)《=現在の順番》 が後ろに動かす場合です。
 この場合、
 1.n_gen(i)-1までのシートの順番は変わりません
 2.n_gen(i)を含めてn_new(i)-1までのシートの順番は-1となります
 3.n_gen(i)のシートの順番はn_new(i)となります
 4.n_new(i)+1からのシートの順番は変わりません
 となります。
 ・各条件を単純に書いていきます。
  1.       n_gen(j) <= n_gen(i)-1    変わりません
  4.n_new(i)+1 <= n_gen(j)           変わりません
  2.n_gen(i)+1 <= n_gen(j) <= n_new(i)   -1となります
  3.       n_gen(j) = n_gen(i)       n_new(i)となります

 ・1または4の条件の反対(2または3である条件)を書きます。
  if (n_gen(j) > n_gen(i)-1) and (n_new(i)+1 > n_gen(j)) then
   :
  end if
 ・2の条件を書きます。
 if (n_gen(i)+1 <= n_gen(j)) and (n_gen(j) <= n_new(i)) then
   2の処理
 else
   3の処理
 end if

 まとめると、
 if (n_gen(j) > n_gen(i)-1) and (n_new(i)+1 > n_gen(j)) then
  if (n_gen(i)+1 <= n_gen(j)) and (n_gen(j) <= n_new(i)) then
     2の処理
   else
     3の処理
   end if
  end if

 また、別の書き方としては、3の処理がただ一つの番号だけであることに注目して、for の外に出してしまうのです。
   For j = 0 To gyo_cnt - 1
     2の処理だけを書く(if文で2に限定する)
   next j
   3の処理(n_new(i) = n_gen(i))(if文で3に限定する)

 こちらのほうが、場合の手としてですが簡潔ですね。


 全体的に整理しました。

 'シートの移動
 For i = 0 To gyo_cnt - 1
'前に移動
  If n_new(i) <>
   省略
  Else
'後ろに移動
   If n_new(i) > n_gen(i) Then
    Sheets(n_gen(i)).Move after:=Sheets(n_new(i))
    For j = 0 To gyo_cnt - 1
     If n_gen(i) + 1 <= n_gen(j) And n_gen(j) <= n_new(i) Then
       n_gen(j) = n_gen(j) - 1
     End If
    Next
    n_gen(i) = n_new(i)
   End If
  End If
 Next

 最後はおまじないのシートの削除です。シート削除了解の確認のメッセージはだしません。無条件削除となります。
'マジナイのシートを削除。確認メッセージを出さない
  Application.DisplayAlerts = False
  Sheets(1).Delete
  Application.DisplayAlerts = True  '元の状態に戻しておく

 これでシートの移動は完成です。

 ※更なる改良。
  新しい順番を考える時、最初から位置からの順番が決まるわけではありません。
  これとこれはこっちが前だなとか、色々考えて順番の大小関係を決めて、それをもとに1からの順番が出来るのです。そこで、その大小関係を記述した段階のものでマクロを動かすというものです。
  マクロの中では、それぞれのシートの数値の大小をソートして、1からの連番を求めます。後は現在のマクロの機能でシートを移動させるということです。この処理を追加してみてはいかがでしょうか。
  更には、現在のシートの順番が入っていると思われるD列もそうなっているかわかりません。単なる大小関係で記述されているかもしれません(例えば、四桁の数値の大小関係で順番を決めている)。
  この点も考慮すると完成度があがります。

 "エクセルのファイルを分析する"のテーマについては一応終了です。
 ひとこと
 このテーマは、日々更新していくことが必要ですね。
 特にシートの中の分析は、色々と試行錯誤を繰り返すべきでしょう。その中で出てきた必要な機能をマクロで組んでみる、という繰り返しをし完成度を高くしていくものと思います。

0 件のコメント: