「小テスト 入力シート」と「小テスト 成績」のそれぞれに、INDEX関数使用の都合上行を追加してしまいますが、次のようになら可能かと思います。
1. 「小テスト 入力シート」に2行目を追加して、B2に次のように数式を設定します。
2. 「小テスト 入力シート」のB2をコピーして、2行目のC2から左のセルにペーストします。
3. 「小テスト 成績」に2行目を追加して、独立したセルに教科ごとに3つ教科名を設定します
(結合したセルだと数式をコピペしたとき参照が無効になってしまうため)。
こんな感じです。
4. 「小テスト 成績」のA4・B4・C4のそれぞれに、次のように数式を設定します。
・A4に設定する数式
・B4に設定する数式
・C4に設定する数式
5. 「小テスト 成績」のA4〜C4を範囲選択してコピーし、次のようにペーストします。
・A5〜C列最終行セルを範囲選択してペースト
・D5〜F列最終行セルを範囲選択してペースト
・G5〜I列最終行セルを範囲選択してペースト
・J5〜L列最終行セルを範囲選択してペースト
・M5〜O列最終行セルを範囲選択してペースト
こんな感じになります。
「小テスト 入力シート」と「小テスト 成績」にそれぞれ追加した2行目は、普段は非表示にし、数式の再設定が必要になった場合などメンテナンスの際に再表示すれば良いと思います。
「小テスト 入力シート」に列を追加した場合には、「小テスト 成績」の各セルに設定したINDEX関数の第1引数(範囲)の変更が必要になります。従いまして、あらかじめ「小テスト 入力シート」の列数を想定される上限の列数分追加しておいてから、それを前提に「小テスト 成績」に数式を設定した方が良いと思います。
例えば、「小テスト 入力シート」がAZ列まである場合、「小テスト 成績」の各セルに設定されたINDEX関数の第1引数(範囲)は、'小テスト 入力シート'::$A:$AZ になります。