
質問ばかりで、回答出来る能力が身に付かないのですが(^^;)、また教えてください。
A B C
1 No. 学部 名前
2 1 小 東京太郎
3 2 中 埼玉次郎
4 3 小 神奈川三郎
5 4 高 千葉四郎
6 5 他 大阪五郎
というような「リスト」シートが有ります。
別のシートから、Index関数とMacth関数を使って、参照します。
B2セルに「4」と入力し、C2セルに4の千葉四郎さんの学部を参照したい場合、
C2セルに「=INDEX(リスト!B$2:B$6,MATCH($B2,リスト!$A$2:$A$6,0))」
とすると、当然「高」が代入されます。
このままなら、問題無いのですが、
「小は小学部」「中は中学部」「高は高等部」「他はそのまま他」と表示させたいのです。
そこで、C2セルに
=IF(INDEX(リスト!B$2:B$6,MATCH($B2,リスト!$A$2:$A$6,0))="高","高等部",IF(COUNTIF(INDEX(リスト!B$2:B$6,MATCH($B2,リスト!$A$2:$A$6,0)),"*他*")=1,INDEX(リスト!B$2:B$6,MATCH($B2,リスト!$A$2:$A$6,0)),INDEX(リスト!B$2:B$6,MATCH($B2,リスト!$A$2:$A$6,0))&"学部"))
としました。
ちゃんと、代入されています。
※ IFS関数も有るのが分かりましたが、最新のエクセルを使っていない人のために、IF関数で。
「ユーザー定義関数を作れば、出来るのかな?」とも考えたのですが、まだまだの知識で作ることが出来ませんでした。
この長い関数をどうにかすることは出来るのでしょうか?
No.2ベストアンサー
- 回答日時:
自分ならINDEX関数とMATCH関数の組み合わせではなくVLOOKUP関数を使う。
その後でINDEX関数で置き換えるかな。
C2に
=VLOOKUP($B2,リスト!$A$2:$C$6,2,TRUE)
で ”高” が表示されるなら、
D2セルに
=INDEX({"小学部","中学部","後頭部","他"},MATCH(C2,{"小","中","高","他"},0))
と作れば、D2セルに ”後頭部” と表示される。
C2セルを参照している箇所に VLOOKUP関数を使ったB2セルの関数を入れるだけ。
=INDEX({"小学部","中学部","後頭部","他"},MATCH(VLOOKUP($B2,リスト!$A$2:$C$6,2,TRUE),{"小","中","高","他"},0))
こんな感じになる。
当然ながら、エラー対策はしていません。
あと、メンテナンス性を上げるなら変換リストを別に設けたほうが良い。
そうすれば、INDEX関数やMATCH関数内で使った配列を参照に置き換えるだけで済む。
※ 配列:{ } で囲んだところ。
B C
5 小 商学部
6 中 中学部
7 高 後頭部
8 他 他
とすると、
=INDEX($A$5:$A$8,MATCH(VLOOKUP($B2,リスト!$A$2:$C$6,2,TRUE),$B$5:$B$8,0))
とスッキリする。
・・・余談・・・
IFS関数は複数の条件で一つの結果を返す物なので、ここでは使いようがないよ。
また、他の回答者さんも仰るようにIF関数内でカスケードにしないほうが良い。
例として挙げたものは、左端ですが、実際のシートでは端ではないのでVLOOKUPが使えると思い付きませんでした。
※範囲指定の中では、左端になるので使えましたが。
「配列を参照に」も配列自体、私の勉強にもなりましたし、実際参照にすることで、他の箇所でも使うことが出来たので、有効な手段でした。
ありがとうございました。
No.9
- 回答日時:
いろいろなアイディアがでているようですが、頑なに作業列を使わないという判断で進むのであれば、No.2さんのご指摘のようにVLOOKUP関数を使用する方法を支持します。
まずはリストのB列の名称変更(「高→高等部」など)を検討すべきです。
それ以外の方法としては、メンテナンス、数式文字数等を考慮すると、
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(VLOOKUP($B4,リスト!$A:$B,2,0),"高","高等部"),"中","中学部"),"小","小学部"),"特","特殊")
という数式はどうでしょうか。
この数式は、「高特」を「高等部特殊」、「中特」を「中学部特殊」まで含めた表示変更に対応できます。
ただし、エラーチェックはしていませんので、単独の「高」「中」「小」および「高特」「中特」以外で、文字中に「高」「中」「小」「高」「特」を含む文字列も勝手に変換されますし、含まないものはそのまま表示されます。
同じくエラーチェックなしで、若干長めになりますが、IFERROR関数を使用し、VLOOKUP関数の結果から、さらにVLOOKUP関数で{}内に書込された「対応配列」から変換後の表示を検索する以下の数式のほうが、判りやすいのかも知れません。
=IFERROR(VLOOKUP(VLOOKUP($B2,リスト!$A:$B,2,0),{"高","高等部";"中","中学部";"小","小学部";"高特","高等部特殊";"中特","中学部特殊"},2,0),VLOOKUP($B2,リスト!$A:$B,2,0))
この数式は「高」「中」「小」「高特」「中特」のみを特定して変換するため、これ以外で文字中に「高」「中」「小」「高」「特」を含む文字列が勝手に変換されることはありません。
また、「高特」「中特」はそのまま表示させるのであれば、{}内のその部分を削除すればOKです。
あるいは「三文字表示」にこだわるなら、「"高特","高等部特殊";"中特","中学部特殊"」の部分を「"高特","高特殊";"中特","中特殊"」に書換してください。
ありがとうございます。「頑なに」というわけではないです。(^^;)
「長い数式を短くできるのか?」という出発点も「数式などをあまり使わない人でも理解できるようにしたい」なので、おっしゃる通りに作業列を入れて、印刷時には印刷されないようにした方が良いのではとも思っています。
No.8
- 回答日時:
No.3の回答者です。
質問文を単純に読んでいました。
質問にある関数の組み合わせを正しく理解していませんでした。
質問にある関数の組み合わせだと、「高」の場合は「高等部」にして、
それ以外は参照した値に「学部」を付けたものですね。
ただし「他」が入った文字列の場合(ワイルドカード使った「*他*」)は、そのまま表示するということをしたいようですね。
ワイルドカードのものがなければ、
=IF(INDEX(リスト!B$2:B$16,MATCH($B2,リスト!$A$2:$A$16,0))="高","高等部",INDEX(リスト!B$2:B$16,MATCH($B2,リスト!$A$2:$A$16,0))&"学部")
だけで済むものですね。
これに、その他としてのワイルドカードのある文字列も対象にしたい
ということなら、以下のようなもので対応します。
=IFNA(IFERROR(CHOOSE(FIND(INDEX(リスト!B$2:B$16,MATCH($B2,リスト!$A$2:$A$16,0)),"小中高中特高特"),"小学","中学","高等","中特学",,"高特学")&"部",INDEX(リスト!B$2:B$16,MATCH($B2,リスト!$A$2:$A$16,0))),"")
質問の関数での組み合わせより、ちょっと短くなっているはずです。
条件付き書式を使えば、IF系関数を使わないので、もっとシンプルに
できます。でも条件付き書式は使いたくないのでしょうね。

No.6
- 回答日時:
皆さんが、主さんの難しい要望に応えるべく解説してくれているので、
単純な私だったらを。
これ、関数の練習なのか?それとも、結果が出せるようになればいいのか?
どちらなんでしょうか?
結果さえできればいいのであれば、元のデータ自体の小、中、高~を
初めから、置き換えておくか、新しく列を追加して、とりあえず、隣にでも欲しい情報を入れたらいいんじゃないの?
A B C D
1 No. 学部 学部 名前
2 1 小 小学部 東京太郎
3 2 中 中学部 埼玉次郎
No.5
- 回答日時:
No.3の回答者です。
VLOOKUP関数を使い別に用意した表を使えば、No.2の回答者さん
が書いているように短くてスッキリします。
"小学部","中学部","高等部","他"を関数の引数として入れないの
ですから、短くなりますよね。
No.3の回答の関数は、別表を用意しないでも利用できるものです。
別解として、以下のようなものでも結果は同じです。
=IFNA(MID("小学部中学部高等部他",FIND(INDEX(リスト!B$2:B$6,MATCH($B2,リスト!$A$2:$A$6,0)),"小中高他")*3-2,3),"")
エラー処理をしたものなら、ちょっとだけ短くなります。
今回のような、"小学部","中学部","高等部"が同じ文字数ならば、
"他"を最後に持ってくることで残りの文字数として対応できます。

No.3
- 回答日時:
もっと短くできるのかもしれませんが。
私がすぐに思いつく方法だと、
=CHOOSE(FIND(INDEX(リスト!B$2:B$6,MATCH($B2,リスト!$A$2:$A$6,0)),"小中高他"),"小学部","中学部","高等部","他")
での対応ですね。
FIND関数で一文字としてリストから抽出した結果から位置をだし、
CHOOSE関数で、位置に対応した値を出しています。
一応エラー対応として、添付画像では
=IFNA(CHOOSE(FIND(INDEX(リスト!B$2:B$6,MATCH($B2,リスト!$A$2:$A$6,0)),"小中高他"),"小学部","中学部","高等部","他"),"")
で処理しています。

No.1
- 回答日時:
INDEX関数とMATCH関数の結果を納める列を新たに追加すれば、
簡潔で見易い(他人でも理解しやすい)表と結果になると思います。
> 最新のエクセルを使っていない人のために、IF関数で。
そもそも、IF関数は構造が深いと、理解しづらくバグの元です。
そんな場合は、論理式に置き変えたほうが良い場合があります。
例)
結果=条件論理式1*候補1+条件論理式2*候補2+条件論理式3*候補3+…
ご参考まで。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel 値を返す数式についてです
- エクセルでエラーを無視して一番左側のセルの値を返したい
- ExcelVBAで、index、match関数を使用して、指定範囲に出力したい
- Excel2019、2021の日付、曜日の表示について
- vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使
- エクセルについて教えてください。
- エクセルの関数について
- RemoveDuplicatesメソッドについて教えてください。 シート1にシート2から値をもってく
- サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2
- マクロを簡潔にしたい
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
INDEXとMATCH関数で#N/Aが出るときに非表示にしたい
Excel(エクセル)
-
エクセルで条件に一致したセルの隣のセルを取得したい
その他(Microsoft Office)
-
INDEX、MATCH関数の#N/Aエラー表示を空欄に
Excel(エクセル)
-
-
4
INDEX、MATCH関数での空欄を「0」ではなくそのまま空欄する式について
Excel(エクセル)
-
5
【エクセル】関数で「A1が0でないならB1を表示」の式
その他(コンピューター・テクノロジー)
-
6
Excelで[表1]にあって、[表2]にないものを抽出する関数
その他(Microsoft Office)
-
7
Excel-参照セルが空白の場合、別のセルを参照するには。
Excel(エクセル)
-
8
【配列数式を使わずに】表から複数のデータを抽出して、別の表に上から順に並べたい。
Excel(エクセル)
-
9
Excelで重複データの件数ではなく、何番目かを求める方法
Excel(エクセル)
-
10
Excelのmatch関数エラー原因が分かりません
Excel(エクセル)
-
11
EXCELで2つの数値のうち大きい方を採択する数式
Excel(エクセル)
-
12
Excelでセル参照したとき、書式も一緒に持ってくるには?
Windows Vista・XP
-
13
エクセルで指定したセルのどれかに○がはいっていたら○を表示したいです。
その他(コンピューター・テクノロジー)
-
14
値が入っているときだけ計算結果が表示されるようにするには・・?
Excel(エクセル)
-
15
Excel MATCH関数で検索範囲内に同じ値の検索値が複数ある場合
Access(アクセス)
-
16
ある列のセルに特定の文字が入っていたら他のセルに決まった文字を入れる
Word(ワード)
-
17
Excelの関数 SUBSTITUTEとIF関数の組み合わせについて
Excel(エクセル)
-
18
エクセル 同じ番号に枝番をつける
Excel(エクセル)
-
19
AのセルとB行を比較して、一致したらCの内容を別セルに表示
Excel(エクセル)
-
20
あるセルに特定の文字列を打つと、他のセルに決められた文字が自動入力するように
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelの関数について
-
エクセルの関数でわからないこ...
-
VBA Excelのシート名が変更され...
-
エクセルで⑤番の操作が分かりま...
-
マクロを実行するとエクセルが...
-
同じパターンで出てくる言葉に...
-
【マクロ】for nextステートメ...
-
VBA エクセル で FIND でのエラ...
-
Excelの関数で教えください。 ...
-
マクロについて質問です。 現在...
-
Excelで複数の条件を別表に反映...
-
COUNTIFで同一範囲にある複数の...
-
EXCEL表の手入力を関数で自動化...
-
0.001ずつずらしたいのですが実...
-
エクセル関数またはVBAについて
-
【Excel】[Expression.Error] ...
-
複雑なシフト表から1日ごとの...
-
【関数】Falseは表示させないよ...
-
excel VBA文字化け
-
エクセル2016でfilter関数がな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【Excel】[Expression.Error] ...
-
【関数】Falseは表示させないよ...
-
excelの数字がE+になってしまい...
-
Excelについて質問です。
-
セル内の数式をVBAで書くと
-
エクセルで同じ値が連続してい...
-
int関数について。
-
下記のような条件付き書式はど...
-
列の総当たりチェックの方法
-
Excel countif関数で取り消し線...
-
エクセルのマクロについて教え...
-
算数、数学解りません。 足し、...
-
エクセルで添付画像のように値...
-
エクセル CSVファイルについて
-
Excel vba 重複削除、連番に並...
-
次のような関数が作りたく、ど...
-
エクセル 応用した置換方法
-
エクセルの数式で教えてください。
-
エクセルの数式で教えてください。
-
エクセルの計算式で教えてほし...
おすすめ情報
教えてもらえれば、応用できるかなと思ったので、「他」にしたのですが、実際は「中特殊の中特」と「高特殊の高特」なんです。(;'∀')
「IF関数 複数条件」でググると、「入れ子にして・・・」という解説が数多く見つかり、階層を確認しながら書いたら、思い通りに表示されるようになりましたが、同じINDEXとMATCHの数式が何度も使われていて、さらにいくつもの入れ子というと、書いた私も分からなくなりそうでした。
そこで、ユーザー定義関数だったり、他の関数でもっと簡単のわかりやすいものが有るのかな?と思っての質問でした。
1ページに印刷したい(他の部分もあり)とか、他のシートでも使うので・・・(^^;)