2010年3月27日土曜日

第139回目 列・行の操作、若干の余興も含む(その1)

○第139回目 列・行の操作、若干の余興も含む(その1)

列・行の操作とは何でしょうか。
列・行という言葉の中には、表の中での列・行という意味も含んでいます。違いは、シートの中の列・行と表の中の列・行ということになります。
列・行の操作ですから、まずは削除・追加ということが思い浮かびます。
さらに、このテーマでは、列・行の逆転及び並べ替えということを扱います。
列・行の逆転って…
左右の列・上下の行を入れ替えるということです。
並べ替えって…
指定する順番に列・行を入れ替えてしまうことです。
=⇒とすると、逆転はこれに含まれるのではないでしょうか。
 ・そのとおりです。操作のスムーズさの点で分けべきかどうかを考えてください。
=⇒ちょっと待った。逆転でも並べ替えでもいいのですが、計算式はどうなるのですか。
 ・ニーズとしては、逆転でも並べ替えでも、元にあった数値がそのままの値で移動するということが第一ではないでしょうか。ですから、計算式もまったく変わらずに移動します。
=⇒既存のコマンドではそういうのはないのですか。
・調べてみましが、ありませんでした。調べ方が足らないかもしれません。
=⇒通常の操作との差は。メリットはいかに。
 ・列・行の削除・追加は、もしかしたら通常の操作のほうがいいかもしれません。しかし、全体的に指示して一気に変えるとなるとメリットが出てくると思います。つまり、この列(または行)は削除、ここに3列追加するとか、複数にわたって指定をしてから、一気に処理する場合ということです。表の中の列・行を削除・追加するという時は、よりメリットが出てくるでしょう。
  逆転・並べ替えは、その事例があるとしたら、その効果のほどは知れません。
=⇒"この列(または行)は削除、ここに3列追加するとか、複数にわたって指定をしてから"ってどういう意味ですか。
 ・表の外側に余分な行と列を一つ作ります。そこに、削除は99、追加は10*追加したい数を入れていき、その部分を含めて表全体を指定して、一気に処理をするというものです。イメージはつきましたでしょうか。
=⇒"若干の余興"とはどういう意味ですか。
 ・純粋な列・行の削除・追加は通常の操作が早いと思うこと、また、今回の処理が出てくる頻度がまれかもしれないことを、考えて、そのような言葉にしました。
=⇒わかりました。では、進めてください。

 列・行の削除・追加について
 表の左と上に大体は空白の部分があるのでそれを利用します。ない場合は、通常の操作で追加してください。
 その部分に、削除したい場合は99、その部分の前に追加したい場合は、追加したい数かける10(10の倍数)を入れてください。また、一番左端の一番上には、本当の列・行単位での処理か、表における列・行単位の処理(セル単位の処理)かの区分の入れてください。前者はなにもなし、後者は999を入れます(これはニーズによって逆でもいいです)。
 処理情報を含めた表の範囲を指定した後実行します。
 1.一列目、一行目の情報を取得します。
 2.情報を一つ一つ見ていきながら削除・追加をします。本当の列・行の場合と表における列・行の場合で、削除・追加処理の場所情報のパラメータが変わります。
 3.処理は、削除・追加で列番号等が変わってしまうので、後ろからしていきます。

 今回の基本的な機能は、列・行の削除・追加です。どう書くのでしょうか。
【セル単位の場合】
 行関係の削除
Range(Cells(gyo1+i,retu1), Cells(gyo1+i,retu9)).Delete Shift:=xlShiftUp
 行関係の追加
Range(Cells(gyo1 + i, retu1), Cells(gyo1 + i, retu9)).Insert Shift:=xlDown
 列関係の削除
Range(Cells(gyo1,retu1+i), Cells(gyo9,retu1+i)).Delete Shift:=xlShiftToLeft
 列関係の追加
Range(Cells(gyo1,retu1 + i), Cells(gyo9, retu1 + i)).Insert Shift:=xlToRight
【列・行単位の場合】
 行の削除
 Rows(gyo1 + i).Delete
 行関係の追加
Rows(gyo1 + i).EntireRow.Insert
 列関係の削除
Columns(retu1 + i).Delete
 列関係の追加
Columns(retu1 + i).EntireColumn.Insert

 注意点は2つあります。
 処理の順番としては、削除を行なって、それから追加をします。すると、追加のときに、処理対象となる列数(または行数)が変わってしまうことです。これが一つです。
 これは削除した列数(または行数)をカウントして、追加処理の際に、列数(または行数)及び終わりの列(または行)を更新しておきます。
 もう一つは、追加の場合の判断と追加する数の判断です。
 ここでは、10の倍数を入れるとしていますので、10で割り切れるということを、追加と判断します。追加する数は、10で割った商となります。30であれば、3列(または行)追加と判断します。
 セル単位か本来の列・行単位化で、ロジックは二つできますが、順番にくみ上げていけばそれほどの大変さはありません。しかし、注意事項の1に十分気をつけてください。


2010年3月21日日曜日

第138回目 複数個所を一箇所にコピーする(その2)

○第138回目 複数個所を一箇所にコピーする(その2)

 今回は指定された範囲のデータを貼付けるという処理です。
 場所の3情報(プラス、それぞれの場所の列数と場所の数)はすでにパブリック変数にあります。
 今回の眼目はコピー・ペーストの繰り返しです。
 コピーもとの場所は独立していますが、貼付け先の場所は順次移動していきます。データ、一列あき、データ、一列あき…という形式で貼付けましょう。
 今回のマクロの実行前には、貼付ける先の座標にカーソルがあるという前提です。
 貼付先の座標は、"コピーもとの列数+1"で移動していきますので、ちょっと気をつけてください。
 貼付け処理のメイン部分は次のようになります。
mm = 0
'貼付け処理
For i = 1 To p_m_cnt
Windows(p_m_bkname(i)).Activate
Sheets(p_m_shname(i)).Select
Range(p_m_xy(i)).Copy
Windows(bkname9).Activate
Sheets(shname9).Select
Cells(gyo1, retu1 + mm).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
mm = mm + p_r_cnt(i) + 1 '間に一列あけるため
Next
 貼付けた後の印刷は、すでにできている"範囲印刷"となります。

 前に、"計算式の中にある場所に飛ぶ"というのがありました(場所とは計算式の中に記述されている座標ということです)。
 これに合体させることを考えるのがいいと思います。
 場所に飛んでいったら、その周囲のデータを取得するかどうか、取得する場合はその範囲の座標を指定します。
 情報が得られたら、今回の貼付けマクロです。
 これでデバックがやりやすくなること請け合いです。

2010年3月6日土曜日

第137回目 複数個所を一箇所にコピーする(その1)

○第137回目 複数個所を一箇所にコピーする(その1)

 コピーというのは、コピー元と貼付け先の二つが必要です。
 コピーをしているとき、こことあそこと、それらをまとめて貼付けたいということがあると思います。
 つまり、あるシートのここと、違うシートのあそこと、また違うシートのあそこを、一つの場所に貼り付けたい、というニーズです。これは、計算式などをデバックするときによく使います。
 通常は、
 1.該当箇所の大事な数字をメモしてからデバックする。
 2.該当箇所をそれぞれプリントして、それらをつき合わせながらデバックする。
 ということではないでしょうか。言うでもなく簡単なものは、外にださず、すべて自分の頭の中の記憶で大丈夫です。
 ある程度にいくと、数値を書き出す、印刷するということが必要となってきます。
 このためのものと考えていいでしょう。

 一覧表になるので(必ずしもそうではないが)、その後の作業が非常に楽になります。
 1.(最初の場所を指定してから実行)指定された場所の情報を取得する。
 2.次の場所に移動し、範囲を指定する。
  この繰り返し。
  次の場所とは、ブック、シートの移動を含みます。
  場所の情報とは、ブック名、シート名、範囲の座標の三つとなります。なお、貼付けの際に必要になるので、それぞれの列数をも取得しておきます。
  ブックの移動、シートの移動、範囲の指定はこれまで何回もやってきたものですので、そのブロックをコピーしてつなぎ合わせるとできてしまいます(実際は、"つなぎ合わせ"というのが難しいのですが…)。

 違うマクロで使うこととなるために、パブリック変数にしておいてください。さらに個数も取得しておいてください。
 パブリック変数名
p_m_bkname(i)
p_m_shname(i)
p_m_xy(i)  範囲の座標
p_r_cnt(i) 範囲の列数
p_m_cnt   指定した範囲の数  

 次に、別のマクロで、3情報(ブック名、シート名、座標)をセルに書き込んで表示させてみてください。
 また、別のマクロとすることになるため、セルに書き込んだ3情報を取得してパブリック変数に格納してみてください。

 これらをまとめると、
 1.場所を指定し場所の3情報を取得する
 2.場所の3情報をセルに表示する
 3.セルに書き込まれている3情報を取得する
 ということになります。
 このうち、1.はブックの移動、シートの移動と機能が多いのでちょっと大変ですね。

 このあとは、取得した3情報を元に、それらの情報を一箇所に貼付けます。