エクセルを使って「真・女神転生3 ノクターンマニアクス」の合体検索を作った時の備忘録


PS2不朽の名作「真・女神転生3 ノクターン」がクロニクルベースでリマスターされるということで、エクセルのリハビリがてら合体検索ができるブックを作成してみました。ゲーム内で悪魔全書を埋めると良いことがありますが、その為の合体は若干面倒になることも。ピンポイントで合体後の悪魔が分かるブックの制作過程を備忘録的に残しておきます。

真・女神転生3の合体検索ブックの仕様

特に便利な機能などはなく、ただただ素材1と素材2を組み合わせると何が出来上がるのかが分かるものです。この時、種族、レベル、名前が横並びで表示されます。
記事の最後にも書きますが、特殊な組み合わせで生まれる悪魔(シヴァやノルン等)は今回考慮しません。エラー回避も今回はしていません。今回作成するブックに少し追加するだけで対応できるので、別に記事を書くかもしれません。
このブックを作成するにあたって必要なものは以下の3点。

  • 全仲魔のデータ(レベル、種族、名前)
  • 合体の法則
  • 合体表

幸いなことに、上記3点はすべてインターネットで公開されています。ありがたく使わせてもらいましょう。

シート1「合体表」を作成する


ウェブ上に存在する情報から、シート1に「合体表」という名前をつけて合体表を作成しました。この合体表で合体後の仲魔の種族を調べます。

シート2「仲魔一覧」を作成する


こちらもウェブ上に存在する情報をありがたく使わせていただきました。今回使用するのは「レベル」「種族」「名前」の3点だけです。

シート3「合体検索」を作成する


この「合体検索」シートの2つのセルに仲魔の名前を打ち込んで、合体後の悪魔を調べます。青いセル以外には入力する必要はありません。

合体結果を知るための流れ - 種族とレベルを見つける

合体結果の仲魔は素材1と素材2の種族によって種族が決定し、素材1と素材2の基礎レベルによって合体後の悪魔を見つけるためのレベルが決まります。その上で条件に合った悪魔が最終的に誕生します。まずは、各素材の種族とレベルを仲魔一覧シートから検索しましょう。

入力した悪魔の種族を調べる

例えば素材1の青いセルに「ピクシー」、素材2の青いセルに「セイテンタイセイ」と入力します。合体結果に必要なのは素材の種族なので、合体素材1の下の「種族」という項目の下にそれぞれの種族を表示させようと思います。そのために必要なのは「XLOOKUP」関数です。

=XLOOKUP(B3,仲魔一覧!$D$3:$D$186,仲魔一覧!$C$3:$C$186)


これで素材1の名前から、種族を検索できます。素材2も同様にXLOOKUP関数の引数「検索値」を素材2のセルにすれば完了です。

入力した悪魔のレベルを調べる

続いて、素材1と素材2の基礎レベルを探し出しましょう。合体結果を知るためには、素材の種族に加えて基礎レベルが必要です。これは種族を見つけるときと同じで、戻り範囲を仲魔一覧シート内のレベルの列であるB列に変更すれば完了です。

=XLOOKUP(B3,仲魔一覧!$D$3:$D$186,仲魔一覧!$B$3:$B$186)


このようにピクシーとセイテンタイセイのレベルがそれぞれ表示されればOKです。

合体結果を知るための流れ1 - 合体後の種族を調べる

ここまでで合体に必要な情報は揃いました。続いて、素材1と素材2を合体したらどんな種族になるかを調べる必要があります。合体後の種族を調べるのは「合体表」シートの合体表を使います。


先程の例でそれぞれの素材欄に入力した「ピクシー」の種族は妖精、「セイテンタイセイ」の種族は破壊神です。合体表シートから、妖精と破壊神が交差するところを見てみると妖鬼となっていることがわかります。この情報を自動で引っ張りたいので「XLOOKUP」関数を使います。

=XLOOKUP($B$6,合体表!$B$3:$B$32,XLOOKUP($D$6,合体表!$C$2:$AF$2,合体表!$C$3:$AF$32))

ちょっとややこしいので紐解きましょう。

最初の「XLOOKUP」関数の検索値は素材1の種族です。検索範囲は合体表の縦軸(ここではB列)を指定します。戻り範囲で「XLOOKUP」関数をネストします。その「XLOOKUP」関数の検索値は素材2の種族、検索範囲は合体表の横軸(ここではC2からAF2まで)、戻り範囲が合体表の中身(ここではC2からAF32)となります。

簡単に解説を行いますが、興味のない方は飛ばして頂いても大丈夫です。

「XLOOKUP」関数でのクロス検索の簡単な解説

合体表から探してくるようなクロス検索は今まで「INDEX」関数と「MATCH」関数を組み合わせて行っていましたが、「XLOOKUP」関数の登場でかなり楽に検索できるようになりました。そこで、「XLOOKUP」によるクロス検索の簡単な解説を行います。

まずは素材1の種族を合体表の縦軸(or横軸)に当てはめる必要があります。最初の「XLOOKUP」関数で検索範囲を縦軸としたのは、今入力されている悪魔の種族が縦軸のどこにいるかを見つけるためです。ただ、「XLOOKUP」関数は複数検索範囲を指定することができないので、戻り範囲でもう一度「XLOOKUP」関数を使って素材2の種族が合体表の横軸のどこにあるのかを探す必要があります。

1回目の「XLOOKUP」関数の戻り範囲で縦軸の位置を持っているので、2回目のXLOOKUPで得た横軸の位置からクロスする場所を探すために、2回目の「XLOOKUP」関数戻り範囲に合体表の中身を選択します。

合体結果を知るための流れ2 - 合体後の悪魔の元になるレベルを調べる

合体後の悪魔の元になるレベルは以下の計算式と、その後の処理で決まります。

  • (素材1のレベル) + (素材2のレベル) / 2 + 1
  • 小数点以下は切り下げる(未確認)

この計算を行った後、算出されたレベル以上で、合体後の種族のうちそれに一番近いレベルの悪魔が誕生します。

ここまでの手順で2つの素材のレベルは分かっているので、それぞれのレベルのセルから上記の計算式に当てはめれば完了します。

=ROUNDDOWN((B9+D9)/2+1,1)


今回の例ではピクシーはレベル2でセイテンタイセイは54なので、計算結果は29となりました。この結果は仮にE9セルに表示しておきます。

合体後の悪魔の名前を調べる

ここまでで、合体後の悪魔の種族と元になるレベルが分かりました。今回の例ではレベルが29以上の妖鬼が生まれることになります。仲魔一覧シートからレベル29以上の種族が妖鬼である悪魔の名前を探し出せればついに合体後の仲魔が分かります。

レベル29は仲魔一覧シートの何行目かを調べる

今回はレベル29未満の悪魔は検索対象外となりますので、条件にあった検索範囲に絞り込むため、レベル29は仲魔一覧シートの何行目にあるのかを調べます。指定のセルの位置を知るには「CELL」関数を使用します。

=CELL("row",XLOOKUP(E9,仲魔一覧!$B$3:$B$186,仲魔一覧!$B$3:$B$186,"",1))

「CELL」関数でセルの位置を求めるには、検査の種類で対象範囲内の左上のセルを取得する「row」を指定します。

対象範囲には「XLOOKUP」関数を使ってE9セル(合体後のレベル)を検索値にして、仲魔一覧シートのレベルが書かれた列を検索範囲、同じ列を戻り範囲に指定すると、E9セルのレベルが最初に現れる列番号を取得できます。


これによって、仲魔一覧シートの69行目がレベル29の悪魔が記載されている一番最初の行であることがわかりました。

レベル29の悪魔の頭から最後までが何行あるのかを調べる

悪魔合体の結果は、計算式で求めたレベルより上の条件に合った種族が選ばれます。先程調べたレベル29が初出する69行目を始点として、仲魔一覧の最後の1体までの中からレベル29以上の妖鬼の悪魔の名前を探すということになります。

最後の悪魔が何行目まであるかを調べるには「COUNTIF」関数を使います。絶対に増減しない項目ではありますが、COUNTIFを使えば空白以外の数も数えられるという備忘録的な意味でも使ってみましょう。

=COUNTIF(仲魔一覧!$D$3:$D$999,"*")

「COUNTIF」関数の検索条件を「"*"」とすることで、空白ではないセルの数を数えることができます。若干アナログ感はありますが、仲魔一覧で名前の書かれている列を999まで調べました。


こうすることで、仲魔一覧に記載されている悪魔の名前の数がわかります。今回は全部で184体いることが分かりました。

検索範囲を予め表示しておくセルを作成する

合体後の悪魔の名前はもちろん「XLOOKUP」関数を用いて検索します。そのために必要なのは「検索値」「検索範囲」「戻り範囲」です。ここまでで「検索値」は「妖鬼」、検索範囲は「仲魔一覧シートの69行目から184行目」、「戻り範囲」は「仲魔一覧シートの悪魔の名前の列」ということが分かっています。

必要十分な情報を持っているので、「XLOOKUP」関数を使って検索することで合体後の悪魔の名前が判明します。そのためにまず検索範囲を予め表示しておくセルを作成しましょう。検索結果のセルに書けば省略できますが、視認性を高めるために今回は検索範囲を表示するセルを用意します。

検索範囲は仲魔一覧シート内の69行目から184行目なので、手で入力する場合は「仲魔一覧!C69:C184」と書きますね。これを自動で「XLOOKUP」関数の検索範囲に入れてあげたいので、検索範囲表示用のセルに

="仲魔一覧!C"&D11&":C"&D12

と入力しておけば、仲魔一覧シート内の種族の列の中から今回の例ではレベル29以上の種族である「妖鬼」を探すための範囲が自動的に表示されます。「CELL」関数を用いればシート名の取得も可能ですが、不変である可能性が高い事と先程の「COUNTIF」関数の時の用に1行で書き残せないので今回は手入力としました。

今回は検索結果に合体後の種族、レベル、名前を表示したいので、上記と同様にレベル検索用、名前検索用のセルも用意して入力しておきましょう。


こんな感じになると思います。

文字列として表示されている検索範囲を関数内で使えるようにしてあげる

先程作成した検索範囲は文字列として表示されているため、このまま「XLOOKUP」関数の中で使うことはできません。なので、この文字列を「INDIRECT」関数を使って関数の中でも使えるようにします。

=INDIRECT($D$13)

今回、この「INDIRECT」関数は後述しますが「XLOOKUP」関数内で使用します。

家計簿やちょっとした名簿等では「INDIRECT」関数を使うことは少ないかもしれませんが、特定の位置を求めた後にそれをそのまま関数で使う時には必須の関数ですので覚えておくと便利かもしれません。

さて、話がずれましたがこのように「INDIRECT」関数を使うことで、今回使用する「XLOOKUP」関数以外でも関数の中で使えるようになります。これで合体後の仲魔の名前が表示されるようになります。

今まで得た情報を駆使して合体後の悪魔の名前を表示さる

いよいよ合体後の悪魔の名前が判明します。合体後結果の欄に以下のように入力します。

=XLOOKUP($F$3,INDIRECT($D$13),INDIRECT($D$15),"",-1)


これで合体結果がヨモツイクサであることが分かりました。ちなみに、「XLOOKUP」関数の「-1」というのは一致モードです。-1は

合体後の悪魔のレベルもついでに表示させる

最初の方で合体後の悪魔の種族、レベル、名前が表示されるようにすると書きましたので、合体後の悪魔のレベルも表示してみましょう。

レベルを表示するセルで「XLOOKUP」関数を使いますが、ここまでの流れで必要な情報はすべて揃っているので簡単に検索することができます。

=XLOOKUP(H3,INDIRECT(D15),INDIRECT(D14))

「XLOOKUP」関数の検索値を合体後の悪魔の名前にして、残りの検索範囲と戻り範囲はアナログ的にマウスで選択しても良いのですがこれまでの流れで名前の検索範囲とレベルの検索範囲を表示するセルを作っているのでそのセルの内容を「INDIRECT」関数を使った上で使えばスマートですね。


これにて、任意の2つの素材の合体結果が分かるようになりました。

最後に

冒頭でも書きましたが、このままでは合体不可や精霊が出来上がる場合はエラーになりますし、特殊な組み合わせでの合体結果が表示されません。更にDARK系悪魔を作る際の特殊な合体や魔人合体も調べることができません。しかも、合体表から持ってきた合体後の種族が、計算で出されたレベルよりも低いものしかいない場合もエラーになります。今回は単純に悪魔の検索結果がザクッとわかる、そんな内容です。

今後、このブックに対して追加していくという形で全合体結果を漏らさないものを作成するかもしれません。その時はまた記事に残しておきますね。

もし今後更新する場合は「条件以上の悪魔がいない場合に、一つ下のレベルの悪魔を表示する」「特殊な組み合わせの合体結果の反映」「DARK系専用の合体結果の反映」の順番で更新していこうと思います。

狩矢隆夫 この記事を書いた人:狩矢隆夫
家庭用ゲームが大好きでしたが、完全に熱が冷め、趣味といえば散歩と2時間ドラマくらいに。旅行が好きで、路線図と時刻表を見ながら妄想旅行をすることも。スマホとブラウザで気軽にできるゲームでは遊んでいます。そしてTDR好き。
© SLOPOND