• 締切済み

EXCELでのデータ抽出方法

EXCEL2003を使用して次のような条件で式を作成したいと思っております。 下記表B列には、生徒から提出された課題が入力されています。 表は3行ごとに一つのグループになっています。 B列3行(一つのグループ)を見て、各自提出した課題の種類をC列の最初の行に表示させたいです。 尚、重複している課題は一つのみ表示します。 分かりずらい説明で申し訳ございませんが、ご教示よろしくお願い致します。      A列      B列     C列     提出者     課題   データ表示列 ---------------------------------------------------------- 1     A       課題A      課題A 2     B 3     C ---------------------------------------------------------- 4     D                 課題A 5     E       課題A 6     F       課題A ---------------------------------------------------------- 7     G       課題C      課題C 8     H       課題B      課題B 9     I        課題A      課題A ---------------------------------------------------------- 10    J                 課題C 11    K 12    L       課題C ----------------------------------------------------------

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.7

関数でやろうとすると難しい式になる。 既に出ている関数の回答の長く難しいこと。 VBAが出来なければしょうがないが、VBAなら素直に条件をプログラムに組み込める。 例データ A列     B列           D列(VBA実行結果) 提出者 課題 データ表示列 A 課題A 課題A B C D 課題A 課題A E 課題A F 課題A G 課題C 課題C H 課題B 課題B I 課題A 課題A J 課題C 課題C K L 課題C 質問の例データも、このように書いてくれれば、すっきりしてわかりやすいのではないか。あと3行単位で考えることを添えて。 あと課題AのAは皆統一した。質問文では気をつけて。または別なら注記して。 ーー VBAコード Sub test01() Dim sh1 Set sh1 = Worksheets("Sheet1") d = sh1.Range("A65536").End(xlUp).Row For i = 2 To d Step 3 '3行づつとらえる Set rng = sh1.Range(sh1.Cells(i + 0, "D"), sh1.Cells(i + 2, "D")) 'D列で3行づつとらえる j = i: k = i '--- For j = 0 To 2 '3行内の各行処理 If sh1.Cells(i + j, "B") <> "" Then 'B列が空白で無ければ y = sh1.Cells(i + j, "B") 'B列の値取得 x = Application.WorksheetFunction.CountIf(rng, y) 'D列3行で同じものが既に無いか MsgBox x If x = 0 Then '同じものが無ければD列に増やす sh1.Cells(k, "D") = sh1.Cells(i + j, "B") k = k + 1 'D列で下の行をポイント End If End If Next j Next i End Sub コメントだけでも参考に。 上記D列が実行結果。 私は仕事でエクセルを使うには、VBAの仕様は必須だという持論。 ーー 2-3百人程度なら手作業でコピペするほうが回答を待って理解して、自分の場合に式を修正してより速い。 スペース行を省き、かつ3行内で同じ行は省く、VBAを作って手作業の再に使う手もある。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.6

一例です。 重複分は不要という事なのでVBAを使用しました。 対象のシートタブ上で右クリック→コードの表示→以下のサンプルコードを貼り付け→F5キー押下 Sub sample() Set Db = CreateObject("Scripting.Dictionary") For i = 2 To Cells(Rows.Count, "B").End(xlUp).Row Step 3 For j = 0 To 2 If Cells(i + j, "B").Value <> "" Then Db(Cells(i + j, "B").Value) = 1 End If Next j wk = Db.keys For k = 0 To Db.Count - 1 Cells(i + k, "C").Value = wk(k) Next k Db.RemoveAll Next i End Sub

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.5

C2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(MOD(ROW(A1),3)=1,IF(B2<>"",B2,IF(B3<>"",B3,IF(B4<>"",B4,""))),IF(MOD(ROW(A1),3)=2,IF(AND(B2<>"",B2<>C1),B2,IF(AND(B3<>"",B3<>C1),B3,"")),IF(MOD(ROW(A1),3)=0,IF(AND(B2<>"",COUNTIF(OFFSET(C1,-1,0):C1,B2)=0),B2,""))))

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.4

 回答番号ANo.3です。  申し訳御座いません、 >尚、重複している課題は一つのみ表示します。 と言う箇所を見落としておりました。  先程の回答の関数は、重複の除外には対応しておりません。  重複を除外する場合には、以下の様な方法があります。  今仮に、Sheet1に         A列       B列       C列 1行目    提出者     課題    データ表示列 2行目     A       課題A      課題A 3行目     B 4行目     C 5行目     D                 課題A 6行目     E       課題A 7行目     F       課題A 8行目     G       課題C      課題C 9行目     H       課題B      課題B 10行目    I        課題A      課題A 11行目    J                 課題C 12行目    K 13行目    L       課題C という形に表を作成するものとします。  又、Sheet2のA列を作業列として使用するものとします。  まず、Sheet2のA2セルに次の数式を入力して下さい。 =IF(COUNTIF(OFFSET(Sheet1!$B$1,FLOOR(ROWS(Sheet1!$B$1:$B2)-2,3)+1,,MOD(ROWS(Sheet1!$B$1:$B2)-2,3)+1),Sheet1!$B2)=1,ROW(),"")  次に、Sheet2のA2セルをコピーして、Sheet2のA3以下に貼り付けて下さい。  次に、Sheet1のC2セルに次の数式を入力して下さい。 =IF(MOD(ROWS($B$1:$B2)-2,3)<COUNT(OFFSET(Sheet2!$A$1,FLOOR(ROWS($B$1:$B2)-2,3)+1,,3)),INDEX($B:$B,SMALL(OFFSET(Sheet2!$A$1,FLOOR(ROWS($B$1:$B2)-2,3)+1,,3),MOD(ROWS($B$1:$B2)-2,3)+1)),"")  そして、Sheet1のC2セルをコピーして、Sheet1のC3以下に貼り付けて下さい。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.3

 今仮に、         A列       B列      C列 1行目    提出者     課題   データ表示列 2行目     A       課題A      課題A 3行目     B 4行目     C 5行目     D                 課題A 6行目     E       課題A 7行目     F       課題A 8行目     G       課題C      課題C 9行目     H       課題B      課題B 10行目    I        課題A      課題A 11行目    J                 課題C 12行目    K 13行目    L       課題C という形に表を作成するものとします。  その場合、まず、C2セルに次の数式を入力して下さい。 =IF(MOD(ROWS($1:2)-2,3)<COUNTIF(OFFSET($B$1,FLOOR(ROWS($1:2)-2,3)+1,,3),"*"),INDEX($B:$B,SUMPRODUCT(ROW(OFFSET($B$1,FLOOR(ROWS($1:2)-2,3)+1,,3))*(OFFSET($B$1,FLOOR(ROWS($1:2)-2,3)+1,,3)<>"")*(COUNTIF(OFFSET($B$1,FLOOR(ROWS($1:2)-2,3)+1,,ROW(INDIRECT("Z1:Z3"))),"*")=MOD(ROWS($1:2)-2,3)+1))),"")  そして、C2セルをコピーして、C3以下に貼り付けて下さい。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.2

関数で対応するなら、力技になりますが、例えば以下のような数式で表示できます。 C2セル =IF(B2<>"",B2,IF(B3<>"",B3,B4&"")) C3セル =IF(MAX(INDEX((B2:B4=C2)*ROW(B2:B4),))>=ROW(B4),"",IF(OFFSET($B$1,MAX(INDEX((B2:B4=C2)*ROW(B2:B4),)),0)&""<>"",OFFSET($B$1,MAX(INDEX((B2:B4=C2)*ROW(B2:B4),)),0),B4&"")) C4セル =IF(AND(COUNTA(B2:B4)=3,B2<>B3,B3<>B4,B2<>B4),B4,"") 上記3つのセルを選択して下方向にオートフィルコピーしてください。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! 関数ではなく、VBAでの一例ですので、参考にならなかったら読み流してください。 画面左下にある操作したいSheet見出し上で右クリック → コードの表示 → VBE画面が出ますので ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub test() 'この行から Dim i, j As Long Columns(4).Insert For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row Step 3 Range(Cells(i, 2), Cells(i + 2, 2)).Copy Cells(1, 4).Select ActiveSheet.Paste For j = 3 To 1 Step -1 If WorksheetFunction.CountIf(Range(Cells(1, 4), Cells(j, 4)), Cells(j, 4)) > 1 _ Or Cells(j, 4) = "" Then Cells(j, 4).Delete (xlUp) End If Next j Range(Cells(1, 4), Cells(3, 4)).Copy Cells(i, 3).Select ActiveSheet.Paste Next i Columns(4).Delete Cells(1, 1).Select End Sub 'この行まで ※ 無理矢理って感じのコードですがこの程度しか思いつきませんでした。m(_ _)m

関連するQ&A

  • エクセルでのデータ抽出方法について

    Excel2010で、IDと氏名を結びつけたリスト表を作成しようと考えています。 例として以下のようなエクセル表があったとします。 ※列A・列B→ID及び氏名   列D・列E→列A・列Bから抽出したい情報        【列A】    【列B】    【列C】    【列D】    【列E】      【行1】   11111   山田 太郎    -      11119    (※「山田 九郎を」入れたい) 【行2】   11112   山田 二郎    -      11112    (※「山田 二郎を」入れたい)     【行3】   11113   山田 三郎    -       11118    (※「山田 八郎を」入れたい)     【行4】   11114   山田 四郎    -       11114    (※「山田 四郎を」入れたい) 【行5】   11115   山田 五郎              【行6】   11116   山田 六郎                【行7】   11117   山田 七郎           【行8】   11118   山田 八郎 【行9】   11119   山田 九郎         : D列は既に入力済み(確定)で、IDが割り振られている人の氏名をE列に挿入したい場合の エクセルの操作方法について教えていただきたく、よろしくお願いします。

  • エクセル2003 データの抽出

    excel2003を使用しています。 A列に8桁のコード、B列に、そのコードの品名が入力された表があります。 この表の中から、最初の4桁だけ一致するデータを抽出したいのですが どうすればよいでしょうか? オートフィルタオプションを使ってみたのですが、うまくできません。 よろしくお願いいたします。 例:12348888、12349999、12346666、32224434、46732235・・・・と並ぶコードの中から、 1234×××× のコードの行だけが、表示されるようにしたい。

  • 【エクセル】抽出データを上に詰めて表示させたい。

    重複するデータを上に詰めて表示さセル方法が解らないです。 B列はA列の元データから重複分は表示しないようにしています。 C列はA列の元データから重複分の数を数えています。 │A │B    │C│ D │ 1│あああ │あああ │3│ 2│いいい │いいい │2│ 3│あああ │     │ │ 4│ええ  │ ええ  │2│ 5│おおお │おおお │1│ 6│ええ  │   │ │ 7│いいい │  │ │ 8│あああ │  │ │ 9│うううう│うううう│1│ ・ ・ 上記のような表で、A列が元データで、 B列にはセルB1から、=IF(COUNTIF($A$1:A1,A1)>1,"",A1)という関数を オートフィルで下まで伸ばしています。 C列は、=IF(COUNTIF($A$1:A1,A1)>1,"",COUNTIF($A$1:$A$100,A1))と いう関数を使用しています。 そこで、B列C列の何も表示されていないセルを詰めて、上に詰めて 表示させたいです。マクロは良くわからないのでなるべく関数で お願いします。ちなみに、今使用している関数も、こうしたほうが いいというのがありましたら。訂正してもらえると助かります。 解りづらいところがありましたら、補足します。 宜しくお願いします。

  • エクセル データ抽出

    A列には、年月6桁の数値 例/200501 B列には、サブグループを示す文字列 黒、白 のいずれか C列には、100刻みの整数(各サブグループ毎に連続した値となるが、最小値と最大値      は都度変化する。→個数・行数が変動) データが変化するたびに各グループごとに、自動でC列のデータ種類一覧を表示 させたい(重複を除いて、昇順)のですが、どのような方法がありますでしょうか。 LOOKUPとMAX(MIN)を併用するようなイメージを持ったのですが可能でしょうか? 例えば、下の場合、グループ「200501」のC列のデータ種類は200、300、400、500、というように。    A   B  C 1 200501 黒 300 2 200501 黒 400 3 200501 黒 500 4 200501 白 200 5 200501 白 300 6 200502 黒 400 7 200502 黒 500 ・ ・ ・ お手数ですがよろしくお願いします。

  • Excel データの抽出について教えて下さい。

    初めて質問させて頂きます。 Excelでデータの抽出と言ったらいいでしょうか・・・ 「一定の条件に当てはまった場合に、別のセルに数字を入力する」 というような処理をしたいのですが、データ量が多くて、 どのようにやったら効率がいいのか、頭を悩ませています。 例えば・・・       A列  B列 1行目  111   A 2行目  112   B 3行目  115   C 4行目  115   C 5行目  118   D といったようなデータが1500件ほどあります。 このデータを使って、A列の中で番号が2つ(又は3つ等)あるものに、      A列   B列  C列 1行目  111   A 2行目  112   B 3行目  115   C    1 4行目  115   C    1 5行目  118   D といった感じで決まった数字を表示する方法がないでしょうか? こんな説明でご理解頂けるかどうか、心配なんですが・・・。 いい方法をご存知の方がいらっしゃいましたら、力を貸して下さい。

  • エクセルで抽出の関数は?

      A B C   ----------- 1 A 1 あ 2 A 2 い 3 B 3 う 4 B 1 え 5 C 2 お 上記のようなA1からC5までの表があるとします。 例えばA6に「A」B6に「2」と入力した時に、C6に「い」と表示したいのですが、どのような関数を使って表示すればいいのですか? A列とB列の条件が合致するものをC列に表示する行を作成したいのです。教えてください。  

  • 「エクセル」で重複したデータだけを呼び出したい。

    「Excel2000」を使用しています。 「重複しているデータだけ抽出する」 ということは出来るでしょうか? たとえば「A列」に名前が入っていて、 「B列」に住所、「C列」に電話番号が 入っているとします。 重複した名前だけを呼び出して、 なおかつ「B列」「C列」の データも表示させたいのですが…。

  • エクセルでのデータの表示

    エクセルでのデータの表示 次のような表が在ります。 A列   B列   100    2   100    2      101    6   101    2   101    6   102    6   102    6   103    2   103    2   103    2    104    6   104    2  ・     ・  ・     ・  ・     ・   これを、次のように、C列に「◎」と「×」を表示させるようにするには、どのようにすれば可いですか? つまり、「A列のナンバーが重複していて、且つ、B列の数字が異なる二種類の場合は、C列に◎」、「A列のナンバーが重複していて、B列の数字は一種類の場合は、Cれつに×」と表示させたいのです。 A列  B列  C列 100    2  × 100    2  ×   101    6  ◎ 101    2  ◎ 101     6  ◎ 102    6  × 102    6  × 103    2  × 103    2  × 103    2  × 104    6  ◎ 104    2  ◎ ・      ・  ・ ・       ・  ・ 宜しくお願い致します。

  • Excelでのデータ抽出

    Excelで外部結合風のデータ抽出を教えてください。 シートAとシートBに表形式のデータがあり、 シートAのA列の値とシートBのA列の値が一致するシートBの 行を抽出するのが目的です。 具体的には次のような感じです。 シートA         シートB ----------------  ---------------- A列 | B列 | C列     A列 | B列 | C列 ----------------  ---------------- 2  | 2B  | 2C      1  | 1BB | 1CC ----------------  ---------------- 4  | 4B  | 4C      2  | 2BB | 2CC ----------------  ---------------- 6  | 6B  | 6C      3  | 3BB | 3CC ----------------  ---------------- ↓ シートB ---------------- A列 | B列 | C列 ---------------- 2  | 2BB | 2CC ---------------- 以下以外の方法がありましたら教えてください。 1)アクセスに両シートのデータを取り込み、2つのテーブルを外部結合で連結させる。 2)マクロで二重ループをつくり、A列が一致した行を取り出す。 よろしくお願いします。

  • EXCELの重複データの抽出について

    1月と2月という2つのシートがあり、それぞれA列に姓、B列に名、C列にメールアドレスが入力されています。 1月と2月を比べてABC列のデータが全く同じものだけを、1月重複分、2月重複分として抽出することが、ExcelまたはAccessでうまくできないため、どなたか教えてください。

専門家に質問してみよう