[[20110212114229]] 『横のデータを縦に変換したいのですが。』(excel猛勉強中) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『横のデータを縦に変換したいのですが。』(excel猛勉強中)

excel2007です。

たとえば

氏名   データ1  データ2  データ3

鈴木   100   200   500

田中   400

佐藤   300   600

このようなリストを

氏名   データ

鈴木   100

鈴木   200

鈴木   500

田中   400

佐藤   300

佐藤   600

このような形に変換させたいのですが、関数などで方法ありますでしょうか。

よろしくお願いいたします。


 E,G列を作業列に使用します。
	[A]	[B]	[C]	[D]	[E]	[F]	[G]	[H]	[I]
[1]	氏名	データ1	データ2	データ3	1			氏名	データ
[2]	鈴木	100	200	500	4		1	鈴木	100
[3]	田中	400			5		1	鈴木	200
[4]	佐藤	300	600		7		1	鈴木	500
[5]							2	田中	400
[6]							3	佐藤	300
[7]							3	佐藤	600
[8]									
[9]									
[10]									
 E1=IF(A1="","",COUNT($B$1:D1)+1)
  E10までフィルドラッグ

 G2=IF(MAX($E$1:$E$10)>ROW(A1),MATCH(ROW(A1),$E$1:$E$4),"")
 H2=IF(G2="","",INDEX($A$2:$A$10,G2))
 I2=IF(G2="","",INDEX($B$2:$D$10,G2,COUNTIF($G$2:G2,G2)))
  必要行(E列のMAX-1行以上)フィルドラッグ

 データ範囲は10行目までを想定しています。
 実際はまだ多いと思いますので、適宜変更して下さい。

 F1セルに =IF(MAX(E:E)-1<>COUNT(G:G),"注意","")
 の様な式を仕込んでおくと、G:I列の数式の入力範囲のチェックになるかもしれません。

 (HANA)


ありがとうございました!思い通りにできました。
会社の色々な人に聞きましたが、誰に聞いてもマクロじゃなにかじゃないと無理でしょう、
との答えでした。
助かりました。本当にありがとうございます。
もっと勉強しないと!という気持ちになりました。
(excel猛勉強中)

 ループ処理が分かれば、マクロの方が単純に出来ると思います。
 これを機に 試してみられてはどうでしょう。

 '------
Sub TEST()
    Dim i As Long, ii As Long
    Dim myR As Long

    Range("F:G").ClearContents
        'F:G列のデータを削除
    Range("F1").Value = "氏名"
    Range("G1").Value = "データ"
        'F1,G1に見出しを設定
    myR = 1
        '見出し行が1行目(2行目からデータを配置)
    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
        '2行目から最終行までループ
        For ii = 2 To 4
            '行方向のループの中で、列方向に4列目(D列)までループ
            If Cells(i, ii).Value <> "" Then
                'i行,ii列 のセルの値が "" でない時
                myR = myR + 1   '書き出す行を一つ下に
                Cells(myR, 6).Value = Cells(i, 1).Value
                Cells(myR, 7).Value = Cells(i, ii).Value
            End If
        Next
    Next
End Sub
 '------

 (HANA)

(HANA)様
マクロでもご教示ありがとうございます!
VBAはまだまだ未知の世界です。恥ずかしながら全くわかりません。
今例題で試してみましたが、あまりの鮮やかさに、やはりマクロでやってみたいと思いました。
今回の例はA列からのデータでしたが、元データのシートには、できれば他の情報も表示しておきたいので、たとえばC列に"氏名"、D列以降20列に"データ"がある場合はできますでしょうか。

今,ご教示いただいたマクロの列を変えて悪戦苦闘しているのですが、なかなかうまくいきません。
VBAの言葉が全くわからない状態なので、愚問だと思いますがすみません。

別シートにセル参照で、氏名をA列に、データをB列以降に参照させてみましたが、当然ながらデータのないセルは"0"になってしまい、縦変換にも"0"が反映されてしまいます。

何度も申し訳ないのですが、お教えいただければ大変助かります。
(excel猛勉強中)


(HANA)様

たびたびすみません。大変失礼しました。
今、別シートへセル参照させて、

If Cells(i, ii).Value <> "" Then

の <> を <0> に変更したらできました。

恥ずかしいです。

本当にありがとうございました。

あとどれくらいかかるかわかりませんが、少しずつマクロを勉強します。

(excel猛勉強中)


 おっと。。。衝突しちゃいましたが
 書きかけだったので載せておきます。

 開始行は1行目が見出しで、2行目からデータでしょうか?

 >C列に"氏名"、D列以降20列
 C列は、A列から数えて 3番目の列です
 D列は、A列から数えて 4番目の列です

 そして、データの入力範囲は A列から数えて
 何番目の列まででしょうか?
 W列なら23番目,X列なら24番目と言う事に成りますが。

 結果を書き出すのは、どの範囲に書き出しますか?

 現在、データが入っている最終行を調べるのに
 A列の入力状況で確認をしています。
  Cells(Rows.Count, 1).End(xlUp).Row
 この部分。         ~~~ 1列目 = A列
 どこか別の列(C列?)で確認した方が良いですか?
 それとも、名前が入力されている最後の行と A列の入力がある最後の行は
 一致してますか?

 (HANA)

すみません。

では、別シートにわざわざ参照させなくてもできるのですね。

その後また追加した列があって。。。

実際の元データはこうです。

F列(A列から数えて6列目)に "氏名"

データの入力範囲は、 

J列〜AC列(A列から数えて10列〜29列)の20列

書き出すのは、AF列とAG列 にしたいと思っています。

氏名とデータの間に3列追加してしまったのは、やはりだめですよね。

本当にわかりにくくて申し訳ありません。

(excel猛勉強中)


 >氏名とデータの間に3列追加してしまったのは、やはりだめですよね。 
 いや、大丈夫ですよ。

 こんな感じに変更してみて下さい。
 '------
Sub TEST2()
    Dim i As Long, ii As Long
    Dim myR As Long

    Range("AF:AG").ClearContents
        '★F:G列 → AF:AG列のデータを削除
    Range("AF1").Value = "氏名"
    Range("AG1").Value = "データ"
        '★F1,G1 → AF1,AG1 に見出しを設定
    myR = 1
        '見出し行が1行目(2行目からデータを配置)
    For i = 2 To Cells(Rows.Count, 5).End(xlUp).Row
        '2行目から最終行までループ
        '★最終行を調べる列を A列(1列目)→F列(5列目)に変更
        For ii = 10 To 29
            '★行方向のループの中で、列方向に2列目(B列)から4列目(D列)までループ
            '         → J列〜AC列(A列から数えて10列〜29列)の20列 をループ
            If Cells(i, ii).Value <> "" Then
                'i行,ii列 のセルの値が "" でない時
                myR = myR + 1   '書き出す行を一つ下に
                Cells(myR, 32).Value = Cells(i, 6).Value
                    '★ F列(6列目) → AF列(32列目)・・・・書き出すセル
                    '          名前は A列(1列目)→ F列(6列目)
                Cells(myR, 33).Value = Cells(i, ii).Value
                    '★ G列(7列目) → AG列(33列目)・・・・書き出すセル
            End If
        Next
    Next
End Sub
 '------

 元のコードと見比べて 変わったところを確認してみてもらえればと思います。
 少しは分かるかな。。。?

 因みに、 Cells(行 , 列)の順番に書いて
 1行目の 1列目のセルが A1 セルに成ります。

 (HANA)


(HANA)様

とりあえず、そのままコピペして実行してみたら、見事に出来ました!!

丁寧な解説までつけていただき本当に感動しています。

変わったところを一つ一つ確認して、納得できるようにします。

HANA様のおかげで、マクロへの第一歩を踏み出すことができました。

今まで自分には無理だとあきらめていましたが、がんばる気力ができました。
これをマスターすれば、仕事の効率がグンとアップします。

本当になんとお礼をいっていいか。。。

貴重なお時間本当にありがとうございました。

(excel猛勉強中)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.