エクセル上にある

 1  2  3
A値 値 値
B値 値 値
C値 値 値

というピポットではないクロステーブルを

A 1 値
A 2 値
A 3 値
B 1 値

という単純なテーブルに簡単に置き換えるにはどの様な方法があるでしょうか?
Access、SQL等でも構いません。

小生はマクロにて縦横総当りにて、並べ替えて出力する方法しか、今のところ、思い当たりません。しかしコレでは、ちょっと処理が遅いです。

コピペで手作業が加わる回答等はご遠慮ください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答6件)

id:EddyYamanaka No.1

回答回数385ベストアンサー獲得回数1

ポイント10pt

http://www.hatena.ne.jp/1101633378#

人力検索はてな - エクセル上にある  1  2  3 A値 値 値 B値 値 値 C値 値 値 というピポットではないクロステーブルを A 1 値 A 2 値 A 3 値 B 1 値 : という単純なテーブルに簡..

マクロってそんなに時間がかかりますか?

以下の単純なマクロでもあっという間ですけど?

マトリックス(要素)のサイズはどれくらいなのでしょう?

Private Sub CommandButton2_Click()

 Dim rr, cc, r2

 r2 = 1

 rr = 2

 While Len(Cells(rr, 1))

  cc = 2

  While Len(Cells(1, cc))

   Sheet2.Cells(r2, 1) = Cells(rr, 1)

   Sheet2.Cells(r2, 2) = Cells(1, cc)

   Sheet2.Cells(r2, 3) = Cells(rr, cc)

   r2 = r2 + 1

   cc = cc + 1

  Wend

  rr = rr + 1

 Wend

End Sub

id:iojoy

5000行×50列です、やはり、こういう方法しかないかな。。。

2004/11/28 18:35:28
id:taknt No.2

回答回数13539ベストアンサー獲得回数1198

ポイント10pt

For a = 1 To 5000

ActiveWindow.LargeScroll ToRight:=1

Range(”A” & a & ”:AX” & a).Select

Range(”AX” & a).Activate

Selection.Copy

b = ((a - 1) * 50 + 1)

Range(”AZ” & b).Select

ActiveWindow.SmallScroll Down:=3

Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _

False, Transpose:=True

Next a

AZの列に 作成するようにしてみました。

一行をまとめてコピペしてるので、ひとつひとつのセルよりは、速いと思います。

>5000行×50列

これは エクセルの制限上、無理ではないのでしょうか?

つまり、5000×50=250000行 できるということですよね?

エクセルは 65536行までなので 1311行目でエラーになります。

id:iojoy

そうなのです、ですので基本的にCSVに出力してアクセス等で使用するイメージでした。

2004/11/28 21:04:41
id:EddyYamanaka No.3

回答回数385ベストアンサー獲得回数1

先程のコメントです。

5000行×50列だと変換後が65535行を越えるのでEXCELでは扱えませんね。

id:iojoy

そうです、外部のCSVに出力するイメージでした、基本的にEddyYamanakaさんと同様の方法しかないかな・・・と思ってます。それでも、SQL文等を使って簡単に出来る方法が他にあるのでは?と思って質問したのであります。

2004/11/28 21:08:30
id:tsukudanian No.4

回答回数51ベストアンサー獲得回数0

ポイント40pt

urlはダミー。

アクセスで、ユニオンクエリーというSQLを発行すれば一発です。

1.列名のフィールドを作ります。(フィールド名:F)

F 1 2 3

A 値 値 値

B 値 値 値

C 値 値 値

2.上記をアクセスにインポートします。

3.アクセスで下記のクエリーを作成して開けばOK。(テーブル名:テーブル1)

SELECT テーブル1.[F]&’1’ AS id,テーブル1.[1]

FROM テーブル1

UNION ALL

SELECT テーブル1.[F]&’2’ AS id,テーブル1.[2]

FROM テーブル1;

UNION ALL

SELECT テーブル1.[F]&’3’ AS id,テーブル1.[3]

FROM テーブル1;

id:iojoy

なるほど、ひとつのテーブルにて項目毎にユニオンをかけるのですね!目からウロコです!。ありがとうございます。

2004/11/29 14:49:27
id:stealthinu No.5

回答回数55ベストアンサー獲得回数1

ポイント20pt

http://www.perl.com/

Perl.com: The Source for Perl -- perl development, conferences

URLはダミーです。

行数的にExcelでは不可能なサイズのようですので、TXT形式で吐き出しておいて、後でperlで加工するというのではダメでしょうか。

ちなみにこんな感じで出来ます。

while(<>) {

chomp;

@col=split(”¥t”);

$name=shift(@col);

$count = 1;

foreach (@col) {

print ”$name¥t$count¥t$_¥n”;

$count++;

}

}

id:iojoy

ありがとう御座います、確かにperlの方がコードが一番スマートに組めますね。

2004/11/29 23:50:38
id:MrT No.6

回答回数98ベストアンサー獲得回数0

ポイント10pt

http://www.hatena.ne.jp/1101633378

人力検索はてな - エクセル上にある  1  2  3 A値 値 値 B値 値 値 C値 値 値 というピポットではないクロステーブルを A 1 値 A 2 値 A 3 値 B 1 値 : という単純なテーブルに簡..

URLはダミーです。

めんどいのでマクロを使わない方法。かな?

A,B,Cとか1,2,3とかは存在しない、値だけのテーブルと仮定しても良いですか?(ダメならポイントは0にして下さい。)

置き換え機能のあるエディタorワープロを使います。

まず、csv形式で保存します。

それをエディタ等で読み込み、カンマを改行に置き換え、保存します。

それをエクセルで読み直す。

(・・・・・これでできるだろうけど・・・前提条件でダメだろうな、きっと。)

id:iojoy

その作業をコード化したのが、上記のPerlスクリプトになると思います。皆さん、ありがとうございました。

2004/11/29 23:56:42

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

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

トラックバック

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

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

回答リクエストを送信したユーザーはいません