[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『横のデータを縦に変換したいのですが。』(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)
ループ処理が分かれば、マクロの方が単純に出来ると思います。 これを機に 試してみられてはどうでしょう。
'------ 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)
今,ご教示いただいたマクロの列を変えて悪戦苦闘しているのですが、なかなかうまくいきません。
VBAの言葉が全くわからない状態なので、愚問だと思いますがすみません。
別シートにセル参照で、氏名をA列に、データをB列以降に参照させてみましたが、当然ながらデータのないセルは"0"になってしまい、縦変換にも"0"が反映されてしまいます。
何度も申し訳ないのですが、お教えいただければ大変助かります。
(excel猛勉強中)
たびたびすみません。大変失礼しました。
今、別シートへセル参照させて、
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様のおかげで、マクロへの第一歩を踏み出すことができました。
今まで自分には無理だとあきらめていましたが、がんばる気力ができました。
これをマスターすれば、仕事の効率がグンとアップします。
本当になんとお礼をいっていいか。。。
貴重なお時間本当にありがとうございました。
(excel猛勉強中)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.