○第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 件のコメント:
コメントを投稿