2010年2月20日土曜日

第136回目 計算式を複数回コピー

○第136回目 計算式を複数回コピー

 複数コピーはもうでてきました。その際にもう一つ、シート間のコピーもありました。これを合体させたものです。
 シート数が多くなる複雑なエクセルの場合、あるシートのその1、その2…という形式になるのがあります。その場合、シート内の計算式式はほとんど同じ可能性が高くなります。
 ある計算式をつくりました。それをシート内で複数回コピーします。また、複数シートにもコピーします。これを一気に行なうマクロです。

 これが意外と気持ちがいいです。
 既存のマクロを使うと2つのマクロによる処理になります。かつ、シート間は大ブロックでのコピーとなります。つまり不要なものまでをも含めてコピーすることになる可能性がでてきます。
 大体は大丈夫なのですが、不要なもののコピーがでてくると、操作が簡単にはいかなくなります。(データを入れていない時は、全面的なコピーでいいのですが、いったんデータを入れてしまうと、そのデータの部分はコピーしたくないということが起こります)

 これを一気に解消。1回の操作で完了です。
 必要なもののみを必要な場所にコピーします。
 コピー元を指定して実行です。
 1.指定範囲の情報を取得
 2.はじめに貼付けたい先頭のセルを指定(シート間を考えると、通常はコピーもとの先頭を指定することになる)
S 3.次に貼付けたい先頭のセルの指定
 4.貼付け回数を指定
 5.貼付けたいシート数を指定(現在のシートを含みます)
 シート内のコピーのループの外側に、シートを動かすというループを入れればよいのです。とても簡単です。
 
 何で、最初からこの機能にしなかったのでしょうかね。
  最初の段階では考える余裕がなかった。
  通常の操作をベースにしていたので、気がつかなかった。
  少しでも前進すれば満足であった。
 このコピーでは、計算式のみをコピーするものですが、それとは別に全部コピーのものを作っておくといいと思います。このマクロも簡単です。ペースト条件を変えればいいだけです。一つのマクロで中で調整してもいいでしょう。
 両方同じ頻度であればいいのですが、一方に偏っていると、かえって指定が面倒になってきます。
 いい方法がありました。パブリック変数を持って、通常は計算式のみという指示にしておいて、全部コピーの指定をした場合、そのパブリック変数を変えるのです。するとマクロは一つですみ、最初の入り口の操作だけで可能となります。処理後パブリック変数をクリアしておいてください。
 通常は入り口が同一モジュールにあるので、モジュール変数でも大丈夫ですね。

 質問があります。前回を含めて、コピーの方向はどう判断するのでしょうか。
=⇒欠落していました。コピーの方向は自動的に判定しています。
  今回の場合は、最初に指定されたセルと次に指定されたセルの行情報と列情報によって判定します。行が同じであれば、横方向のコピー、列が同じであれば縦方向のコピーです。でもこのロジックには穴があります。行・列とも同じでなかったらどうなるということです。この指定が有効の場合は別物となりますので、今回は決め打ちして判定してください。
 前回の場合も同様です。
 
 ところで、行も列も異なる場合というのはどういう事例なんでしょうね。
 まっすぐにあるものを斜めにコピーする。
 斜めにあるものをまっすぐにコピーする。これは計算式が違ってしまいますので文字化して移植でしょう。
 
 何のために? まっすぐで考えると…。
 まっすぐなものを斜めにしたい。まっすぐなものを桂馬飛びにしたい。
 
 次に、斜めにある値をまっすぐにとりたいケース。すなわち、斜めに並んでいる同一コーホートを見やすいようにまっすぐに表示したい、という感じですね。(この場合は、コピーもとの指定に一工夫が必要です。また、コピーなのか移植なのかを十分に考える必要がりますね。)
 コピー機能ではなく移植機能の場合は、昔やった、セルの階段挿入の目的と同じですね。
 セルの挿入よりは、こちらのほうがスマートですね。

 まずは、コピー先の斜めコピーを考えたらどうでしょうか。


 【頭の体操】
 b30=sum(b3:b$29)
 c30=sum(c3:c$29)
 d30=sum(d3:d$29)
 e30=sum(e3:e$29)
 という計算式がありました。
 これを、次のような計算式にします。
 b30=sum(b3:b$29)
 c30=sum(c4:c$29)
 d30=sum(d5:d$29)
 e30=sum(e6:e$29)
 
 1.まずもとの計算式群を、下3セルの範囲にコピーします。
 すると計算式は次のとおりとなります。
 b31=sum(b4:b$29)
 c31=sum(c4:c$29) =⇒○
 d31=sum(d4:d$29)
 e31=sum(e4:e$29)
 b32=sum(b5:b$29)
 c32=sum(c5:c$29)
 d32=sum(d5:d$29) =⇒○
 e32=sum(e5:e$29)
 b33=sum(b6:b$29)
 c33=sum(c6:c$29)
 d33=sum(d6:d$29)
 e33=sum(e6:e$29) =⇒○
 ○のところが求める計算式となります。
 これらの箇所を一行にする必要がありますが、どうやったらいいのでしょうか。

 これを行うための機能は移植となりますが、移植もとの2セルをそれぞれ指定する。そして移植先のセルを2つ、それぞれ指定することで、お互いのセルの関係が分かりますので、後は移植回数を指定すればできそうです。
 ただし、移植もとの指定が一つ多くなるので、通常の場合は、操作がめんどくさくなっていまいます。
 ニーズがどれほどあるかですが、やめておいたほうがいいでしょうね。この機能は別の形で対応したほうがいいかもしれません。
 ちょっとした頭の体操でした。

0 件のコメント: