エクセルの関数を使う方法です。
まず、Sheet1、Sheet2、Sheet3という3枚のシートからなるExcelブックを作成し、そのExcelブックを、一旦、保存して下さい。
次に、タブで区切られている元のテキストデータの全てをコピーして、Sheet1の左上隅に貼り付けて下さい。
すると、
A列 B列 C列
1行目 氏名 教科 点数
2行目 Aさん 数学 80点
3行目 Bさん 数学 90点
4行目 Cさん 国語 90点
5行目 Dさん 数学 80点
の様な形にデータが並ぶ筈です。
次に、Sheet2のA2セルに次の関数を入力して下さい。
=IF(INDEX(Sheet1!$B:$B,ROW())="","",INDEX(Sheet1!$B:$B,ROW())&"#"&COUNTIF(Sheet1!$B$1:INDEX(Sheet1!$B:$B,ROW()),INDEX(Sheet1!$B:$B,ROW())))
次に、Sheet2のA2セルをコピーして、A3以下に(Sheet1のデータが入力されている行数を上回るのに十分な行数となるまで)貼り付けて下さい。
次に、Sheet3のA1セルに「氏名」、B1セルに「教科」、C1セルに「点数」と入力して下さい。
次に、Sheet3のA2セルに次の関数を入力して下さい。
=IF(ROWS($2:2)>COUNTIF(Sheet2!$A:$A,REPLACE(CELL("filename",A2),1,FIND("]",CELL("filename",A2)),)&"#*"),"",INDEX(Sheet1!A:A,MATCH(REPLACE(CELL("filename",A2),1,FIND("]",CELL("filename",A2)),)&"#"&ROWS($2:2),Sheet2!$A:$A,0)))
次に、Sheet3のA2セルをコピーして、Sheet3のA2~C2の範囲に貼り付けて下さい。
次に、Sheet3のA2~C2の範囲をコピーして、同じ列の3行目以下に貼り付けて下さい。
次に、Sheet3を雛型として、そのコピーシートを教科の数だけ作成し、各コピーシートのシート名を「数学」や「国語」といった「Sheet1のB列に表示されている教科の名称」と同じ名称に変更して下さい。
これで、各教科のシートに、その教科のデータのみが抽出して表示されます。
お礼
お礼が遅くなり申し訳ありません。 回答ありがとうございます。 マクロまで頂けて非常に助かりました。 また、シンプルで汎用性の高いマクロなので、 他でもぜひ使わせて頂きます。