○第141回目 列・行の操作、若干の余興も含む(その3)
列・行の並べ替えです。
こういう事例があります。
すでに、年度別(3年度)にみたグループ別(3グループで合計を入れて4グループ)の数値を列記した表があります。これらは横に展開されていて、下には項目(20項目ほど)が展開されています。
これはそのままとして、これから、グループ別にみた年度別の表にしたというニーズです。
16年度 …
A B C 合計 …
↓
A …
16 17 18年度 …
このような事例を一瞬(パラメータの設定を除く)で処理してしまおうというものです。
パラメータの設定はそれほど難しくありません。表の上及び左に行、列をつくり、そこに順番を示すパラメータを入れるのです。入らない列は並べ替えの対象外です。
(記述を簡単にするために列の並べ替えを前提とします)
眼目は二つ。
一つ目は、今回は2列ではないので、並べ替えたい列の計算式情報をすべて配列変数に格納します。
二つ目は、パラメータを並べ替えることです。
一つ目は前回の機能を複数繰り返すことになりますので、問題はありません。ただし、複数列対象なので、配列変数を二次元のものにしてください。パラメータが入っている列のみを対象として、計算式情報を取得していきます。
パラメータを含めた表全体を指定してから実行
1.指定範囲の場所情報を取得する
2.列のパラメータを取得する。1以上99999以下を対象とする(文字が入っている列は対象外)
3.パラメータをソートする
4.一番目のパラメータを持つ列を探し、その列の計算式情報を配列変数の一番目に格納する。
二番目以降繰り返す。
5.物理にみて最初の並べ替え対象列に、配列変数の一番目の計算式情報を移植する。
二番目以降繰り返す。
(6.行でも同じことを繰り返す)
2.列のパラメータを取得する。
1から99999までの数値が入っている列を対象とします。
対象となる列数(retu_cnt9)を求めます。
If 0 <>
ww(j) = Cells(gyo1, retu1 + i)
j = j + 1
End If
3.パラメータをソートする
パラメータはww(i)に入っています。
対象列の数は、retu_cnt9となります。
4.一番目のパラメータを持つ列を探し、その列の計算式情報を配列変数の一番目に格納する。二番目以降繰り返す。
For i = 1 To retu_cnt9 '処理対象列数だけ繰り替えす
For j = 0 To retu_cnt - 1 'i番目に該当する列かどうか
If Cells(gyo1, retu1 + j) = ww(i) Then Exit For
Next
For k = 1 To gyo_cnt - 1 '処理対象列の計算式情報を取得する
shiki(i, k) = Cells(gyo1 + k, retu1 + j).Formula
Next
Next i
5.物理にみて最初の並べ替え対象列に、配列変数の一番目の計算式情報を移植する。
二番目以降繰り返す。
j = 1
For i = 0 To retu_cnt - 1 '表の列数分繰り返す
If 0 <>
For k = 1 To gyo_cnt - 1 '計算式情報の移植
Cells(gyo1 + k, retu1 + i) = shiki(j, k)
Next
j = j + 1
End If
Next
同様に行についても処理してください。直列に処理すればいいです。
上記の例では、次のようにパラメータを設定します。
11 21 31 41 12 22 32 42 13 23 33 43
16年度 17年度 18年度
A B C 合計 A B C 合計 A B C 合計
見出しが結合セルになっている場合は、結合を解除してから処理してください。そのほうが無難です。
見出し等の修正は処理後にしてください。
【処理直後のイメージ】
16年度17年度18年度
A A A B B B C C C 合計 合計 合計
※B以降の年度見出しはもともとないので、でてこないと思います。
見出し部分に関して行の並べ替えのパラメータを入れておくと、その後の処理が一手間なくなります。
A A A B B B C C C 合計 合計 合計
16年度17年度18年度
となります。
注意点
このマクロは指定したエリアのセルを移動させてしまいますので、そのエリアの中のセルを参照する計算式がおかしくなって、意図しない計算結果となってしまいます。
表の中での計算式、表の外での計算式で、表の中のセルを参照しているものについては、あとで修正する必要がありますので注意してください。
上の例では、移動後の合計の計算式は、表内のセルを使用していると当てになりません。
2010年4月10日土曜日
登録:
コメントの投稿 (Atom)

0 件のコメント:
コメントを投稿