パスワードを忘れた? アカウント作成
11507544 journal
日記

akiraaniの日記: エクセルでTRPGの高機能キャラクターシートを作るためのTips 3

日記 by akiraani

INDIRECT関数VLOOKUP関数と、入力規則を使ったチャートの自動選択。

例1:クラスをプルダウンメニューで選択したら、基本能力値が表に自動的に適用されるようにしたい

まず、別シートにクラスの基本能力値表を作成し、名前を定義する

例えば、こんな表があったとする

__|____A_____|_B|_C|_D|_E|_F|_G|
01|_クラス名_|ST|DX|AG|IQ|HP|MP|
02|クレリック|_1|_1|_0|_1|20|15|
03|__シーフ__|_0|_2|_2|_0|15|10|
04|ファイター|_2|_1|_0|_0|25|10|
05|__メイジ__|_0|_0|_0|_3|10|25|

この表に対して二つの名前を定義しておく(やらなくてもいいが、やった方が後でわかりやすい)

範囲:A2:A5 名前:クラス名
範囲:A2:G5 名前:クラス能力値修正

リスト選択用のセルの入力規則を追加、リストによる入力規則で定義した名前「クラス名」を指定
あとは、選択したクラス名に応じて能力値の修正値をVLOOKUP関数で参照する。
例えば「=VLOOKUP(クラス能力値修正,[クラス名を選択したセル],1,false)」という式であれば、STの修正値が入力される。

例2:選択したクラスに応じて、クラスに応じて選択可能なスキルをプルダウンメニューで表示させたい

→クラスごとスキルのデータ範囲を定義するvlookup用テーブルを作る

  |__F___|___G____|_____________H_______________|_____I_______|
2|要素名|データ列|_____データ数________________|___範囲______|
3|シーフ|____J___|=COUNTA(INDIRECT(G3&":"&G3)))|G3&"1:"&G3&H3|
4|メイジ|____K___|=COUNTA(INDIRECT(G4&":"&G4)))|G4&"1:"&G4&H4|

→それぞれのデータ列(上記例だとJ列がシーフ、K列がメイジ)のスキル一覧を記述しておく

  |___J____|___K___
1|_鍵明け_|炎の矢
2|_罠解除_|氷の矢
3|__追跡__|岩の矢
4|背後攻撃|風の矢
5|__軽業__|雷の矢
6|________|光の矢
7|________|闇の矢

リスト選択用セル(下の例ではB3セル)→リストによる入力規則でF3:F4を指定
要素選択用セル→リストによる入力規則で=INDIRECT(VLOOKUP($B$3,$F$3:$I$5,4,false))を指定

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • ・JとかKとか埋め込むのはちょっと気持ち悪いというか、そこも検索させた方が保守性がいいと思います。

    3つめの表のは、1行目(J1/K1)に「シーフ」「メイジ」と入れといて
    G3: =MATCH($F3, $J$1:$Z$1, 0)+9
    G4: =MATCH($F4, $J$1:$Z$1, 0)+9
    で、何列目から取ってくるかを選択
    (MATCHの第3引数0は、ソート不要な完全一致検索オプション。
    9足すのは、J列からの検索から列番号に変えるため。J列=10列目に対し、範囲の1列目で見つかった時はMATCHは1を返すので、9足してます。)

    ・OFFSETが使えるところは、INDIRECT よりは OFFSET を使った方がいいと思います。

    H3: =COUNTA(OFFSET($A:$A, 0, $G3-1))
    に。後述のR1C1形式などは1オリジンで、それに合わせて式を入れてるのに対し、OFFSETの引数は0オリジンなので、「$G3-1」と1引いてます。

    ・どうしてもINDIRECTを使うしか無い場合は、R1C1形式で。

    「リストによる入力規則で=INDIRECT(VLOOKUP($B$3,$F$3:$I$5,4,false))を指定」の部分はOFFSETによる置き換えが無理で、INDIRECT を使うしかないと思いますが、
    INDIRECTを使う時は、R1C1形式の方が動的生成しやすいです。

    I3: ="R2C"&$G3&":R"&$H3&"C"&$G3
    リストによる入力規則: =INDIRECT(VLOOKUP($B3,$F$3:$I$5,4,false),false)
    INDIRECTの第2引数をfalseにすると、R1C1形式での指定になります。

    といったとこですかね。

    まあ、今の分量ぐらいなら全部INDIRECTでもいいと思いますが、
    参照数が増えてくると、OFFSETに比べてINDIRECTはかなり重いです。再計算にかかる時間が目に見えて遅くなるぐらい…

  • by Anonymous Coward on 2014年08月20日 13時55分 (#2660322)

    まず、リンク先にもあるがCONCATENATE 関数は「&」で代用できる。

    次にVLOOKUP関数では第四引数に「False」を指定すると検索範囲を昇順に並べておく必要はなくなる。
    (第四引数が「True」または省略された場合は昇順に並べておく必要があり、その場合、検索値以下で一番大きい値を検索する。
    「False」の場合は検索値と等しい値を検索する)

    また、
    >エクセル上で昇順ソートをかけたもの
    はソートのオプションの「ふりがなを使わない」にチェックを入れた状態で並べ替える必要がある。
    カタカナ・ひらがなの場合はいいが、漢字の場合に影響してくる。

    • by akiraani (24305) on 2014年08月20日 14時29分 (#2660343) 日記

      言われてみればその通りで……。
      よくよく調べてみてCONCATENATE 関数のいらない子っぷりにちょっとなけてきた……。

      というわけで、このへんざっくり修正しました。情報サンクスです。

      --
      しもべは投稿を求める →スッポン放送局がくいつく →バンブラの新作が発売される
      親コメント
typodupeerror

Stay hungry, Stay foolish. -- Steven Paul Jobs

読み込み中...