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

2010年2月6日土曜日

第135回目 計算式を複雑形式へコピー

○第135回目 計算式を複雑形式へコピー

 複雑形式といっても、単純なコピーではないといった軽い意味です。
 一群の計算式を作りました。これを文字化してコピー(移植)します。
 しかし、貼付け先が、単純ではありません。既存の式の間にコピーしなければなりません。例えば、一つ飛びにとか二つ飛びにとかです(間のセルには何の影響を与えられません)。

 このような場合に対応するマクロです。さらに、コピー元も単につながっていると限りませんので、こちらも飛びを考慮することにします。
 コピー元全体(例えば、一行複数列)を指定し、そのコピー元の中でコピーしたい計算式はいくつ飛びにあるかを指定します(通常は連続ですね)。
 範囲全体の情報と飛び数を元に計算式の移植回数がわかります。

 次に、貼付け先にいき、最初に貼付けるセルと次に貼り付けるセルを指定します。これで飛び数を把握します。(用途はないと思いますが、次のセルとして行列とも違う場所を指定すると、斜めに計算式が移植されます)
 
 そして、文字化した計算式を文字化を解いて貼付けします。(実際は、計算式という内容のデータを、違うセルに代入するという操作です)。
 このマクロは、今までのものを加工することによってたやすくできます。
 文字化した計算式のコピーあたりが参考になります。
 (第51回目 ちょっとした小物、計算式を文字化してコピー編)

 流れです。
 1.指定範囲の情報をとる(例 1行9列を指定)
 2.コピーもとの最初のセルにカーソルを移す
 3.コピーもとの次のセルを指定(例 先頭から1列空けたセルを指定。移植回数は5回となります。(9-1)/2+1=5)
 4.計算式を文字化して変数に格納する(頭に***をつけます)
 5.(ブック及びシートを変えることが可能)貼付け先を指定
 6.次ぎの貼付け先を指定(列の飛び数と行の飛び数が求まります)
 7.計算式を移植する(コピーより移植という感覚)。文字化を解除したものを計算式として代入する(配列変数の添え字で貼付け場所を結びつける)

 これが利用できる事例に出会ったら、感激のあまり目から涙が出ますよ。

 もう少し改善して、もとの計算式が複数のセット(複数行複数列)になっている場合もできるようにするといいでしょう。

 
Q.飛び飛びコピーに似ていますね。
A.そうでもないんですよ。コピーの場合は計算式の式の中の座標の関係がそのまま維持されます。それではダメなケースがあります。今回のマクロは、コピーではなく移植となっていますので、計算式がそっくりそのまま貼付けられます。
Q.例としてはどんなものがありますか。
A.単純な例では、通常のコピーをしてしまうと、コピー先が2列先であるために列が2列ずれてしまいます。しかし、求めたいのは、1列だけ動かした計算式であるというケースはどうでしょうか。間に何もなければ単純なコピーで可能なのですが、すでに間にも計算式を作ってしまっているので、それはそのままにしておきたい。
Q.それは困りますね。どうやるのですか。
A.別なところに計算式を作ります。この例の場合は、一つの計算式を作っておいて、次の列にその計算式をコピーすればいいのですから、単純ですね。そこでこのマクロで、元の計算式は連続ですが、貼付け先はひとつ飛びにするという指示にすれば、計算式が移植されます。ここで、コピーではなく移植ということが大きな意味をもってくるのです。
 おわかりでしょうか。
Q.わかりました。自分にもそんな事例が出てくるといいですね。