- 締切済み
Excel 二つの表を用いたデータ整理
かなり困っています。 (1)二つのエクセル表が存在 (2)ファイル1には↓のようにデータが並んでいます A列 B列 C列 D列 生徒A 生徒B 生徒C 生徒D 行1 国語27 国語34 国語54 算数34 行2 数学36 家庭25 算数23 理科23 行3 理科55 理科44 理科21 英語44 行4 社会87 社会33 社会32 行5 英語54 (3)ファイル2は以下のようになっています A列 B列 C列 D列 E列 国語 算数 理科 社会 行1 生徒A 27 36 55 87 行2 生徒B (4)要するに、ファイル1のデータから必要な数値を抽出して ファイル2のデータに移し変えたいのですが、ファイルAの中の名称とデータ数が異なる場合があることもあり、整理はコピペしかないのかと半ばあきらめています。 とはいえデータの数は4000…正直なきたいです…何かいい方法はありませんか?
- みんなの回答 (9)
- 専門家の回答
みんなの回答
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! すでに色々回答が出ていますので、 参考程度で目を通してみてください。 ↓の画像で説明させていただきます。 数学を算数に変更させてもらっています。 尚、科目は7科目まで、生徒数は列幅いっぱい 当方使用のExcel2003ではIV列が最終列になるはずですので 生徒数は 256列÷2の128人 までしか対応できないと思います。 科目数は増えても問題ないと思いますので、 科目数によって範囲指定の領域はアレンジしてください。 Sheet2の 科目はあらかじめ入力してあるものとします。 Sheet2の生徒名のセルA2セルに =IF(COUNTA(Sheet1!$1:$1)>=ROW(A1),INDEX(Sheet1!$1:$1,,2*ROW(A1)-1),"") そして、B2セルに =IF(ISERROR(INDEX(Sheet1!$2:$8,MATCH(B$1,INDEX(Sheet1!$2:$8,,MATCH($A2,Sheet1!$1:$1,0)),0),MATCH($A2,Sheet1!$1:$1,0)+1)),"",INDEX(Sheet1!$2:$8,MATCH(B$1,INDEX(Sheet1!$2:$8,,MATCH($A2,Sheet1!$1:$1,0)),0),MATCH($A2,Sheet1!$1:$1,0)+1)) という数式を入れ列方向(科目が入力してあるセルまで)オートフィルでコピー 最後にA2~科目がある最後の列を範囲指定し、最後のセルのフィルハンドルで 下へオートフィルでコピーすると画像のような感じになります。 以上、参考になれば幸いですが、 他に良い方法があれば読み流してくださいね。m(__)m
- imogasi
- ベストアンサー率27% (4737/17069)
#3です。補足いただいたのですが、 >つのブックが存在し、書式は固定です。正しくはブック1からブック2の書式で指定されている項のデータを抜き出すのが目的でした。 エクセルでは書式は別の意味が決っているので、表のレイアウトとかフォーマットと表現すべきだと思います。 >指定されている項のデータを抜き出すのが 指定されているというのはどういう状態ですか。 ●ブック2に、穴埋めをすべきような、空白セルがあるのか。 そこへブック1のデータを探して、該当セルデータを持ってくるのか。 ブック2で、空白?のセルのあり場所は何かルール性が無いのか。 例えば科目の理科がデータが入ってないとか 在る科目だけとか。 ●生徒の順番はブック1とブック2と違うのか。 ーー 回答すべきことの内容は、 結局データ例を少数挙げて、人間が手作業でやる場合、どういうステップになるか、文章にすれば判りよいのだ。あとは回答者がエクセル的に方法を考える。
- a987654
- ベストアンサー率26% (112/415)
NO7です。1っ箇所ポカミス修正です。 >7.SHEET3からファイル1に移り "ファイル1”→"ファイル2”に読み替えて下さい。 (読み替えないと元ファイルを壊します。)
- a987654
- ベストアンサー率26% (112/415)
>データの数は4000… このことからEXCEL2007と断定して回答します。 (2003等は256列が仕様の最大ですのでこの質問が不成立。 本当にこんなことをやっているのでしょうか? ファイル1の列方向に4000件かつ1セルの文字と数値を付けた データの持ち方、しかも使う行数は現時点で6行、教科が増えても 10行程度であり甚だ疑問ですが、次の機会からはファイル1 のような作り方をしないようにしましょう。 VBAの方法は他の方が書かれていますので、作業用シートを 使った方法を示します。 1.ファイル1にて1~6行を選択(行表示を左クリックのまま 1~6を選択) 2.1.の選択状態で 右クリック→"コピー" 3.作業用シート(SHEET3とします)に移り A1セルで右クリック "型式を選択して貼り付ける" 4."値"と"行列を入れ替える"の2箇所にチェックを入れ"OK" ここまででA~E列4000行のデータになっている。 5.下記のように数式を設定 F1セル =A1 G1セル =IF(B1="","",LEFT(B1,2)) G1セルをH1~J1にオートフィル K1セル =IF(B1="","",VALUE(SUBSTITUTE(B1,G1,""))) K1セルをL1~N1にオートフィル ここの数字を文字で扱うならば K1セルを =IF(B1="","",SUBSTITUTE(B1,G1,"")) として下さい。 6.F1~N1を必要なだけ下方にオートフィル 7.SHEET3からファイル1に移り ・B1~E1セルに固定で国語 算数 理科 社会 を入力 ・A2セルに =+Sheet3!F1 ・B2セルに =IFERROR(OFFSET(Sheet3!$J1,0,MATCH(B$1,Sheet3!$G1:$J1,0)),"") B2セルをC2~E2にオートフィル 8.A2~E2を下方に必要なだけオートフィル 以上です。 冒頭にも述べましたが、ファイル1のような表の作り方はすべきでは ないことを重ねて進言します。
お礼
ありがとうございます! データ数4000に関する説明が不十分でした・・・ 140人×(最大)10教科×3年分という意味です。 バイト先で上からある日配られてきた資料なので詳しいことは分かりませんが…とりあえず適当に並べられているようです。 他の方の方法と同様に試してみます。
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
- KURUMITO
- ベストアンサー率42% (1835/4283)
行1と書かれているのは1行目には項目名が書かれているのですから2行目からデータがあるとします。 ファイル1とありますのはシート1であるとします。 そこでお望みの表はシート2に作成するとします。 1列目には科目名が有るとします。 A2セルには次の式を入力し下方にオートフィルドラッグします。 =IF(INDEX(Sheet1!$1:$1,ROW(A1)*2-1)=0,"",INDEX(Sheet1!$1:$1,ROW(A1)*2-1)) B2セルには次の式を入力し右横方向にオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF(OR(B$1="",$A2="",COUNTIF(Sheet1!$1:$1,$A2)=0),"",IF(COUNTIF(INDEX(Sheet1!$A:$XX,1,MATCH($A2,Sheet1!$1:$1,0)):INDEX(Sheet1!$A:$XX,1000,MATCH($A2,Sheet1!$1:$1,0)),B$1)=0,"",INDEX(Sheet1!$A:$XX,MATCH(B$1,INDEX(Sheet1!$A:$XX,1,MATCH($A2,Sheet1!$1:$1,0)):INDEX(Sheet1!$A:$XX,1000,MATCH($A2,Sheet1!$1:$1,0)),0),MATCH($A2,Sheet1!$1:$1,0)+1)))
お礼
ありがとうございます! サンプルデータを用いて試して見ようと思います!
- imogasi
- ベストアンサー率27% (4737/17069)
何がしたいのか、文章で表現してみること。 エクセルの質問なんだからバージョンぐらい書くこと 20003までなら256列しか使えず、データ数4000が4000人(ならば)はありえないだろう。4000セル? ーー 生徒(人別)に見て 「縦のものを横にする」だけのことか。 ーーー 2つのブックのシートのデータを比べたいのか。 1つから2つめを導出したいのか >ファイル1のデータから必要な数値を抽出して ファイル2のデータに移し変えたいのですが からはそう取れる。 >名称とデータ数が異なる場合があることもあり なら2のブックも既に存在するのかな。 ではどうするのか。 >「要するに」、なんていっているが、どうしたいのかわからない。 質問の文章を読み返して、考えてみること。 ーーー 一般に表の組み換えは関数では複雑になる。全セルに数式を埋め込むことになり、データ数ガ多いとエクセルの動きが重くなるとおもう。 形式を選択して貼り付けー行列を入れ替える、では対処できないのか。 == 結局VBAでも出来る人の考える課題と思う。 ブック1から質問で下の方の形式に直すのは極簡単なVBAで可能。 質問者は、匂いだけ嗅いで。 標準モジュールで Sub test01() Dim sh1, sh2 As Worksheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") '--最右列を捉える c = sh1.Range("IV2").End(xlToLeft).Column MsgBox c k = 2 'シート2でだい2行から書き出し For j = 1 To c 'A列から最右列まで sh2.Cells(k, "A") = sh1.Cells(1, j) '生徒名書き出し For i = 2 To 8 '7科目以内と仮定 If sh1.Cells(i, j) = "" Then Exit For 'その列で空白セルに '空白セルに出くわすと次の列の処理へ sh2.Cells(j + 1, i) = sh1.Cells(i, j) Next i k = k + 1 '次はシート2の次の行に書き出し Next j End Sub これは簡単のためSheet2に書き出している。ブック2のシートにブック1のシート2結果をコピペすると質問のようになる。
お礼
4000に関する説明は上のとおりですが、やはり自分でも読み返してみると支離滅裂ですね…申し訳ありません。アドバイスありがとうございます。地道にひとつずつ方法を試してみようと思います。 念のため WindowsExcel2007において、2つのブックが存在し、書式は固定です。 正しくはブック1からブック2の書式で指定されている項のデータを抜き出すのが目的でした。
[回答番号:No.1この回答への補足]へのコメント、 》 だからMATCH関数が使えないみたいです それは貴方の勝手な思い込みです。ナントカとハサミは使いよう、と申します。 下の例では、簡単のために、別「ファイル」でなく、同一シート内のハナシにしていますが、「MATCH関数が使え」ています。ちなみに、セル A3 は「数学」でなく「算数」に改竄しています。(^_^) A B C D E F G H 1 生徒A 生徒B 生徒C 生徒D 2 国語 27 国語 34 国語 54 算数 34 3 算数 36 家庭 25 算数 23 理科 23 4 理科 55 理科 44 理科 21 英語 44 5 社会 87 社会 33 社会 32 6 英語 54 J K L M N O P 1 国語 算数 理科 社会 英語 家庭 2 生徒A 27 36 55 87 54 3 生徒B 34 44 33 25 4 生徒C 54 23 21 32 5 生徒D 34 23 44 K2: =IF(ISERROR(VLOOKUP(K$1,OFFSET(INDIRECT(ADDRESS(1,MATCH($J2,$A$1:$H$1,0))),,,10,2),2,FALSE)),"",VLOOKUP(K$1,OFFSET(INDIRECT(ADDRESS(1,MATCH($J2,$A$1:$H$1,0))),,,10,2),2,FALSE))
お礼
ありがとうございます。 自省した上でmikeさんの方法を試してみようと思います。 お手数かけて申し訳ありません。
- yokomaya
- ベストアンサー率40% (147/366)
勿論ありますよ。 まず、空いている列を作業列として使いMATCHでデータの有無を調べます。 次にそれで得た行番号を用いてINDEX等で実データを抜き出すんです。 ただ4000だと同姓同名など考慮が要りますね。 ちなみに縦横がややこしいなら、条件貼付けの中に行列入れ替えがありますからそちらを先にすれば、シンプルになるかも。
補足
>>yokomayaさん ありがとうございます。 ですが、ここで質問文の補足、というか重要なことを間違えていました。一番目のファイルは↓が正しいです。 A列 B列 C列 D列 E列 F列 生徒A 生徒B 生徒C 行1 国語 27 国語 34 国語 54 行2 数学 36 家庭 25 算数 23 行3 理科 55 理科 44 理科 21 行4 社会 87 社会 33 社会 32 行5 英語 54 だからMATCH関数が使えないみたいです…
お礼
ありがとうございます! ぜひとも参考にさせていただきます! 皆さんのおかげでどうやら三日連続徹夜は防げそうです…