項目A,項目B,項目C,項目D,単価A,単価B,単価C,単価D,数量A,数量B,数量C,数量D,金額A,金額B,金額C,金額D
項目X,項目Y,項目Z,単価X,単価Y,単価Z,数量X,数量Y,数量Z,金額X,金額Y,金額Z
・
・
・
これを、
項目A 単価A 数量A 金額A
項目B 単価B 数量B 金額B
項目C 単価C 数量C 金額C
項目D 単価D 数量D 金額D
項目X 単価X 数量X 金額X
項目Y 単価Y 数量Y 金額Y
項目Z 単価Z 数量Z 金額Z
・
・
・
のように並び替える方法はありませんか?
※VBAは後々メンテナンスできる人がいなくなるのが嫌なので使いたくありません
項目数は20くらいを上限に変動する前提です。
考え方は、
・1行に何個変数があるのか
#1行目は4、2行目は3
#=COUNTIF(test!1:1,"項目*") で判断
・必ず 項目×n,単価×n,数量×n,金額×n の形式
・これを 1つのセル内で 項目A,単価A,数量A,金額A の形に変換
・並び替えたものを、テキストエディタに 貼り付ける。
・セルの区切りが タブ(スペース??)になるので、それを 改行(ニューライン, キャリッジリターン ???)に変換する。
・それをexcelに読み込ます
これで完成となります。
http://investment.up.seesaa.net/files/test_w.xls
まぁ、xlsを参照下さい。
[test]に変換前のcsvデータを貼り付け、その大きさに合わせて、
・・・というかひたすらでかくてもよく・・・
[check]を修正(領域拡大)すると、前準備修正完了です。
http://www.shuiren.org/chuden/teach/hidemaru/seiki/01.htm
そしたら、エスケープシーケンスで置換できるエディタにC列以降のデータを貼り付けて、セル区切りに相当する文字を改行コードに置換、これをexcelに読み込ませれば、目的の物が得られるかと思います。
http://q-apr25.ne.jp/ (dummy)
項目、単価、数量、金額毎に編集のコピー、形式を選択して貼り付けで行列を入れ替えて貼り付ければよいのでは。ブックやシートは読み込んだブックやシートと異なっていても可能です。
項目Aから始まる1件の請求書、項目Xから始まる1件の請求書・・・のように全体で500件ほど存在します。
これを手動ではなく自動で上記のような並び替えをしたいです。
gawkを使った並べ替え
----------------------------------
gawk
http://www.vector.co.jp/soft/win95/util/se015007.html
----------------------------------
ファイル:csvconv.awk
BEGIN { # 区切り文字 FS=","; # 各項目は4つのデータより項目+単価+数量+金額 # なる。 ITEM=4; } # 並び替え { # カラムがITEMより少ない場合は無視 if( NF < ITEM ) next; # 項目数がITEMの倍数ではない倍無視 if( (NF % ITEM)!=0 ) next; # 項目数を数える カラム数/項目 ITEMS=NF/ITEM; # 先頭は項目 for( i=1; i<= ITEMS;i++ ) { printf("%s",$i); # 各項目は繰り返し for( j=ITEMS+1; j<= NF; j+= ITEM ) { printf(",%s",$j); }; printf("\n"); }; }
DOSのコマンドラインで
gawk -f csvconv.awk xxx.csv
とすると画面変換されたものが
表示される
保存する場合は
gawk -f csvconv.awk xxx.csv > yyy.csv
のようにする
ありがとうございます。
VBAという限定的な表現がまずかったですね。
プログラムで処理してしまうと、実際にデータ操作する人がメンテナンスできなくなってしまうという意図でした。
DOSにawkを入れるくらいだったら、Linuxで処理してしまいますが、それだといつまでも面倒見てあげないといけないので・・・
考え方は、
・1行に何個変数があるのか
#1行目は4、2行目は3
#=COUNTIF(test!1:1,"項目*") で判断
・必ず 項目×n,単価×n,数量×n,金額×n の形式
・これを 1つのセル内で 項目A,単価A,数量A,金額A の形に変換
・並び替えたものを、テキストエディタに 貼り付ける。
・セルの区切りが タブ(スペース??)になるので、それを 改行(ニューライン, キャリッジリターン ???)に変換する。
・それをexcelに読み込ます
これで完成となります。
http://investment.up.seesaa.net/files/test_w.xls
まぁ、xlsを参照下さい。
[test]に変換前のcsvデータを貼り付け、その大きさに合わせて、
・・・というかひたすらでかくてもよく・・・
[check]を修正(領域拡大)すると、前準備修正完了です。
http://www.shuiren.org/chuden/teach/hidemaru/seiki/01.htm
そしたら、エスケープシーケンスで置換できるエディタにC列以降のデータを貼り付けて、セル区切りに相当する文字を改行コードに置換、これをexcelに読み込ませれば、目的の物が得られるかと思います。
ほぼ完璧なご回答です。ありがとうございます。
蛇足になりますが。
「項目*」というのはサンプルなので実際には、もっと不定形なネーミングになります。
→ ただし、そこはCOUNTAを4(項目/単価/数量/金額)で割ることで対処
改行コードは、char(10)で表現できますので、存在する項目数分だけ改行コードをデリミタに連結可能です。
これをテキストエディタにペーストして、ダブルクォート(改行を含むセルはクォートされる)を除去すれば、できあがりです。
ほぼ完璧なご回答です。ありがとうございます。
蛇足になりますが。
「項目*」というのはサンプルなので実際には、もっと不定形なネーミングになります。
→ ただし、そこはCOUNTAを4(項目/単価/数量/金額)で割ることで対処
改行コードは、char(10)で表現できますので、存在する項目数分だけ改行コードをデリミタに連結可能です。
これをテキストエディタにペーストして、ダブルクォート(改行を含むセルはクォートされる)を除去すれば、できあがりです。