エクセルに次のようなCSVをインポートします。

項目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くらいを上限に変動する前提です。

回答の条件
  • URL必須
  • 1人1回まで
  • 登録:2007/03/26 12:07:31
  • 終了:2007/03/27 10:40:33

ベストアンサー

id:JunK No.3

JunK回答回数707ベストアンサー獲得回数182007/03/26 22:41:02

ポイント65pt

考え方は、

・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に読み込ませれば、目的の物が得られるかと思います。

id:P-mako

ほぼ完璧なご回答です。ありがとうございます。

蛇足になりますが。

「項目*」というのはサンプルなので実際には、もっと不定形なネーミングになります。

→ ただし、そこはCOUNTAを4(項目/単価/数量/金額)で割ることで対処

改行コードは、char(10)で表現できますので、存在する項目数分だけ改行コードをデリミタに連結可能です。

これをテキストエディタにペーストして、ダブルクォート(改行を含むセルはクォートされる)を除去すれば、できあがりです。

2007/03/27 10:39:04

その他の回答(2件)

id:apr-25 No.1

apr-25回答回数200ベストアンサー獲得回数32007/03/26 12:23:15

ポイント5pt

http://q-apr25.ne.jp/ (dummy)

項目、単価、数量、金額毎に編集のコピー、形式を選択して貼り付けで行列を入れ替えて貼り付ければよいのでは。ブックやシートは読み込んだブックやシートと異なっていても可能です。

id:P-mako

項目Aから始まる1件の請求書、項目Xから始まる1件の請求書・・・のように全体で500件ほど存在します。

これを手動ではなく自動で上記のような並び替えをしたいです。

2007/03/26 12:31:30
id:russian-blue No.2

russian-blue回答回数36ベストアンサー獲得回数02007/03/26 13:59:58

ポイント10pt

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

のようにする

id:P-mako

ありがとうございます。

VBAという限定的な表現がまずかったですね。

プログラムで処理してしまうと、実際にデータ操作する人がメンテナンスできなくなってしまうという意図でした。

DOSにawkを入れるくらいだったら、Linuxで処理してしまいますが、それだといつまでも面倒見てあげないといけないので・・・

2007/03/27 10:35:22
id:JunK No.3

JunK回答回数707ベストアンサー獲得回数182007/03/26 22:41:02ここでベストアンサー

ポイント65pt

考え方は、

・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に読み込ませれば、目的の物が得られるかと思います。

id:P-mako

ほぼ完璧なご回答です。ありがとうございます。

蛇足になりますが。

「項目*」というのはサンプルなので実際には、もっと不定形なネーミングになります。

→ ただし、そこはCOUNTAを4(項目/単価/数量/金額)で割ることで対処

改行コードは、char(10)で表現できますので、存在する項目数分だけ改行コードをデリミタに連結可能です。

これをテキストエディタにペーストして、ダブルクォート(改行を含むセルはクォートされる)を除去すれば、できあがりです。

2007/03/27 10:39:04

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません