目次


注意

文章量が多くなっています
ご注意ください

概要

ダミー用ネームをランダムに作成してくれるツールです
こちらはマクロなしバージョンの説明になります
作成手順について説明していきます
使用手順やファイルのダウンロードについてはnoteというサイトに記載しています

ファイルのダウンロード

使用上の注意点

乱数を発生させています
Excel作業をする度に内容が変更されてしまいます
変更しない場合や作業をする場合は自動計算の設定を手動計算の設定にしてからやることをお勧めします

自動計算と手動計算の切り替え

  1. 数式タブをクリックします
  2. 計算方法グループの「計算方法の設定」をクリックします
  3. 「自動」または「手動」をクリックします
  4. 「自動」に切り替えずに計算を実行したい場合は「再計算」をクリックします

実装機能

出力対象(姓名/姓/名)、性別を選択し件数を入力すると、 出力欄に出力される



作成手順

ここからは作成手順と関数の説明をしていきます

1. シートの作成

下記シートを作成します

  1. 出力
    • 条件の設定
    • 出力
    • 導出表(すべての姓名の組み合わせを出力するもの)
  2. 名前一覧
    • 姓・名を一覧化
  3. 情報
    • シート・セル・プルダウンリストの内容を格納




2. 名前の登録

[名前一覧]シートに項目名と名前を登録します

2-1.項目名の登録

下記セルに項目名を入力します

セル入力内容セル入力内容
A1【姓_漢字】 E1【名_漢字】
A2姓(漢字) E2名(漢字)
B2姓(かな) F2名(かな)
C2カウント G2性別
H2カウント

2-2. 名前の登録

下記列の3行目以降に名前を登録します

登録内容登録内容
A漢字の姓 E漢字の名
B漢字の姓に対するかな F漢字の名に対するかな
G性別(男/女)


2-3. 関数の挿入

セルC3とセルH3にそれぞれ関数を挿入します
【セルC3】
=SEQUENCE(ROWS(FILTER(A3:A1000000, A3:A1000000<>"")))
【セルH3】
=SEQUENCE(ROWS(FILTER(E3:E1000000, E3:E1000000<>"")))

2-4. 関数の説明

【ROWS関数】
指定した範囲に含まれる行数や配列数を返す
[構文]
=ROWS(array)
[引数]
array:行数を数えたい範囲や配列
[使用例]
=ROWS(A1:A10)

  →10
=ROWS({1;2;3;4})

  →4
=ROWS(A:A)

  →1048576(Excelの最大行数)


【FILTER関数】
条件に一致するデータを抽出してスピル出力する動的配列関数
Excel365/2021以降で利用できる
[構文]
=FILTER(array, include, [if_empty])
[引数]
array:抽出したい範囲
include:抽出条件(TRUE/FALSE の配列)
if_empty:一致がない場合に返す値(省略可)
[使用例]
=FILTER(B:B,A:A=1)

  →A列が「1」の行の名前をすべて抽出
=FILTER(B:C,(A:A=1)*(D:D="女"))

  →A列が「1」かつ D列が「女」の行を抽出


【SEQUENCE関数】
連続した数列を自動生成する関数
動的配列関数なので、結果がセルにスピル展開される
Excel365/2021以降で利用可能
[構文]
=SEQUENCE(rows, [columns], [start], [step])
[引数]
rows:生成する行数(必須)
columns:生成する列数(省略可、既定値は1)
start:開始値(省略可、既定値は1)
step:増分(省略可、既定値は1)
[使用例]
=SEQUENCE(5)

  →1,2,3,4,5を縦に出力
=SEQUENCE(5,1,10)

  →10,11,12,13,14を縦に出力
=SEQUENCE(5,1,10,2)

  →10,12,14,16,18を縦に出力
=SEQUENCE(1,5)

  →1,2,3,4,5を横に出力
=SEQUENCE(3,4)

  →3行×4列の連番を展開(1~12)

2-5. 完成イメージ

▼[名前一覧]シート



3. [情報]シートの入力

3-1. 項目名の入力

下記セルに項目名を入力します

セル入力内容セル入力内容
B3シート名 B13
D3開始行 B14終了行
B4漢字 C14最大値_男女
B5 D14カウント_男
B6終了行 E14カウント_女
C6最大値 B16項目名
B8項目名 C16
C8 D16結合
D8結合 B17カウント
B9カウント B18名(漢字)
B10姓(漢字) B19名(かな)
B11姓(かな) B20性別

3-2. 関数の入力

ダイレクトに文字列を入力してもいいのですが、 途中で行/列/セルを挿入したときに一々修正をしないといけなくなります
なので、関数で実現できるところは関数で実現します

セルC2
[関数]
=RIGHT(CELL("filename",名前一覧!$A$1),
LEN(CELL("filename",名前一覧!$A$1))-FIND("]",
CELL("filename",名前一覧!$A$1)))&"!"

[関数の説明]
  1. CELL("filename", 名前一覧!$A$1)
    • 現在のブックの「フルパス+ファイル名+シート名」
  2. FIND("]", CELL(...))
    • 「]」の位置を探す
    • Excelのファイルパスでは「ファイル名.xlsx]シート名」という形式になるので、「]」の直後がシート名の開始位置
  3. LEN(CELL(...)) - FIND("]", CELL(...))
    • 全体の文字数から「]」の位置を引くことで、シート名の文字数を計算する
  4. RIGHT(CELL(...), 文字数)
    • 右から「シート名の文字数」分だけ切り出す→シート名だけ抽出
  5. &"!"
    • 最後に「!」を付けることで、セル参照に使える形式に整える


セルE2
[関数]
=ROW(名前一覧!A3)
[関数の説明]
  1. ROW() 関数
    • 指定したセルの「行番号」を返す
    • ROWS関数との違いは、「行番号」か「行数」


セルB7
[関数]
=MAX(IF(名前一覧!$A:$A<>"",ROW(名前一覧!$A:$A)))
[関数の説明]
  1. 名前一覧!$A:$A<>""
    • 「名前一覧」シートの A列をチェックし、空白でないセルなら「TRUE」、空白なら「FALSE」を返す
    • つまり「A列に値が入っているかどうか」を判定
  2. ROW(名前一覧!$A:$A)
    • A列の各セルの行番号を返す
  3. IF(名前一覧!$A:$A<>"", ROW(名前一覧!$A:$A))
    • A列が空白でないセルの行番号だけを返し、空白なら FALSE(または空白)
    • データが入っている行番号の一覧
  4. MAX(...)
    • その一覧の中で最大値を返す
    • つまり「A列で最後にデータが入っている行番号」


セルC7
[関数]
=MAX(名前一覧!$C:$C)
[関数の説明]
  1. MAX(名前一覧!$C:$C)
    • C列の中で最大値を返す


セルC9
[関数]
=SUBSTITUTE(ADDRESS(1,COLUMN(名前一覧!C2),4),"1","")
[関数の説明]
  1. COLUMN(名前一覧!C2)
    • 「名前一覧」シートの C2セルの列番号を返す
  2. ADDRESS(1, COLUMN(...), 4)
    • ADDRESS(行番号, 列番号, 参照形式) でセル参照を文字列として返す
    • 行番号 = 1、列番号 = 3 → C1
    • 第3引数の「4」は「相対参照形式」を意味する
  3. SUBSTITUTE("C1","1","")
    • 文字列"C1"の「1」を空文字に置き換える


セルC10
[関数]
=SUBSTITUTE(ADDRESS(1,COLUMN(名前一覧!A2),4),"1","")
[関数の説明]

セルC9と同様



セルC11
[関数]
=SUBSTITUTE(ADDRESS(1,COLUMN(名前一覧!B2),4),"1","")
[関数の説明]

セルC9と同様



セルD9
[関数]
=$C$2&C9&$E$2&":"&C9&$B$7
[関数の説明]

セルの内容と文字列を結合しています



セルB15
[関数]
=MAX(IF(名前一覧!$E:$E<>"",ROW(名前一覧!$E:$E)))
[関数の説明]

セルB7と同様



セルC15
[関数]
=MAX(名前一覧!$H:$H)
[関数の説明]

セルC7と同様



セルD15
[関数]
=COUNTIF(名前一覧!$G:$G,"男")
[関数の説明]
  1. COUNTIF 関数
    • 「範囲の中で条件に一致するセルの数」を返す
    • 構文は「COUNTIF(範囲, 条件)」
  2. 名前一覧!$G:$G
    • 「名前一覧」シートの G列全体を範囲として指定
    • $G:$G は絶対参照で、列全体を対象
  3. "男"
    • 条件。セルの値が「男」と一致する場合にカウント
    • 文字列なので「" "」で囲む必要がある


セルE15
[関数]
=COUNTIF(名前一覧!$G:$G,"女")
[関数の説明]

セルD15と同様



セルC17
[関数]
=SUBSTITUTE(ADDRESS(1,COLUMN(名前一覧!H2),4),"1","")
[関数の説明]

セルC9と同様



セルC18
[関数]
=SUBSTITUTE(ADDRESS(1,COLUMN(名前一覧!E2),4),"1","")
[関数の説明]

セルC9と同様



セルC19
[関数]
=SUBSTITUTE(ADDRESS(1,COLUMN(名前一覧!F2),4),"1","")
[関数の説明]

セルC9と同様



セルC20
[関数]
=SUBSTITUTE(ADDRESS(1,COLUMN(名前一覧!G2),4),"1","")
[関数の説明]

セルC9と同様



セルD17
[関数]
=$C$2&C17&$E$2&":"&C17&$B$15
[関数の説明]

セルD9と同様



セルD10,D11は、セルD9をセルごとコピーし貼り付けるかオートフィルを使います
セルD18,D19,D20は、セルD17をセルごとコピーし貼り付けるかオートフィルを使います

3-3. 完成イメージ

▼[情報]シート | 項目入力


3-4. プルダウンリストの項目の設定

今回は項目が増えることはありませんが、 プルダウンリストの項目を設定するときは癖でテーブルを作成し、 作成したテーブルを参照するようにプルダウンを作成します
下記セルに項目名を入力します
プルダウンリストは[出力]シートにて作成しますので、ここではテーブル化まで説明します

セル入力内容セル入力内容
G2出力対象_姓名 G7性別
G3姓名 G8男女
G4 G9
G5 G10

出力対象_姓名
1. テーブル化したいセル範囲(G2:G5)を選択後、「挿入」タブをクリックし、テーブルグループの「テーブル」を選択します

2. テーブルの作成ダイアログボックスが出るので、 「先頭行をテーブルの見出しとして使用する」にチェックを入れ、「OK」をクリックします

3. 「テーブルデザイン」タブをクリックします

4. テーブル名を「出力対象_姓名」に変更します


性別
出力対象_姓名と同様に行います
セル範囲G7:G10をテーブル化し、テーブル名は「性別」にしておきます

3-5. 完成イメージ

▼[情報]シート | プルダウンリスト準備

3-6. 最大値

プルダウンリストの件数に表示する最大値を求めます
下記セルに項目名を入力します

セル入力内容
I2最大値
J2
K2

下記セルに関数を挿入します

セルI3
[関数]
=J3*K3
[関数の説明]

姓の欄と名の欄の積



セルJ3
[関数]
=IF(COUNTIF(出力!$C$2,"姓*")>0,$C$7,1)
[関数の説明]
  1. COUNTIF(出力!$C$2,"姓*")
    • COUNTIF(範囲, 条件) は「範囲内で条件に一致するセルの数」を返す
    • "姓*"は「姓で始まる文字列」を意味する
    • 「*」はワイルドカードで「任意の文字列」を表す
  2. IF(...>0, $C$7, 1)
    • IF(条件, 真の場合, 偽の場合)


セルK3
[関数]
=IFS(COUNTIF(出力!$C$2,"*名")>0,
IFS(出力!$C$3="男女",C15,出力!$C$3="男",D15,出力!$C$3="女",E15,TRUE,0),
COUNTIF(出力!$C$2,"姓*")>0,1,
TRUE,0)

[関数の説明]
  1. 出力シートの出力対象に名が含まれていればこの欄に男女/男/女の最大値を表示、 含まれていなければ1または0を表示させたい
  2. =IFS(条件1, 結果1, 条件2, 結果2, …, [TRUE, デフォルト結果])
    • 条件1,条件2,…:判定したい条件式
    • 結果1,結果2,…:条件が真の場合に返す値
    • 条件は上から順番に評価され、最初に真になったものの結果が返される
    • どの条件にも当てはまらない場合はエラーになるが、最後に「TRUE, デフォルト値」を入れておくと安全
  3. COUNTIF関数
  4. セルK3と同様



3-7. 完成イメージ

▼[情報]シート | 最大値



4. [出力]シートの入力

4-1. 設定欄の作成

下記セルに項目名を入力します

セル入力内容セル入力内容
B1【設定】 B3性別
B2出力対象(姓名/姓/名) B4件数

下記セルにプルダウンリストを設定します

セルC2
  1. セルC2を選択します
  2. 「データ」タブをクリックします
  3. データツールグループの「データの入力規則」のv字ボタンをクリックします(下記はない場合があります)
  4. 「データの入力規則」をクリックします
  5. データの入力規則ダイアログボックスが表示されるので「設定」タブをクリックします
  6. 入力の種類で「リスト」を選択します
  7. 元の値に下記を入力します
    =INDIRECT("出力対象_姓名")
    これは「出力対象_姓名」テーブルを参照するという意味の関数です
  8. 「OK」をクリックします

セルC3

セルC2と同様です
手順1ではセルC3を選択します
手順7では下記を入力します
=INDIRECT("性別")

下記セルに入力規則と日本語入力を設定します

セルC4
  1. 「データ」タブをクリックします
  2. データツールグループの「データの入力規則」のv字ボタンをクリックします(下記はない場合があります)
  3. 「データの入力規則」をクリックします
  4. データの入力規則ダイアログボックスが表示されるので「設定」タブをクリックします
  5. 入力の種類で「整数」を選択します
  6. データが「次の値の間」になっていることを確認します
    なっていなければ「次の値の間」を選択してください
  7. 最小値に「1」を入力します
  8. 最大値に下記を入力します
    =情報!$I$3
  9. 「日本語入力」タブをクリックします
  10. 日本語入力欄で「無効」を選択します
  11. 「OK」をクリックします
日本語入力を無効にしておくことで半角/全角の切り替えをしなくて済むようになります

下記セルに関数を入力します

セルD4
[関数]
="最大値:"&TEXT(情報!$I$3,"#,##0")
[関数の説明]

[情報]シートのセルI3で作成した最大値を参照し、カンマ区切りで表示するようにしています
分かりやすいように、「最大値:」という文字列を前につけています

4-2. 完成イメージ

▼[出力]シート | 設定欄

4-3. 出力欄と導出表欄の項目の入力

下記セルに項目名を入力します

セル入力内容セル入力内容
F1【出力】 L1【導出表】
F2番号 L2番号
G2No M2漢字
H2漢字 N2かな
I2かな O2性別
J2性別

セルF1とセルL1は選択範囲で中央にしておくと見栄えがよくなります
セルの結合をするとフィルターがしづらかったり、その他不都合が出ることがあります
選択範囲内で中央にする方法は下記です

  1. セル範囲F1:J1を選択します
  2. 配置グループの右下の拡張できる部分をクリックします
  3. 横位置で「選択範囲内で中央」を選択し、「OK」をクリックします



4-4. 導出表欄の作成

導出表欄の下記セルに関数を挿入します
長くなっています
分かりやすいように改行とそれぞれの行の前に空白を入れています

セルL3
[関数]
=IFS(
    $C$2="姓名",
        IFS(
            $C$3="男女",SEQUENCE(情報!$C$7*情報!$C$15),
            $C$3="男",SEQUENCE(情報!$C$7*情報!$D$15),
            $C$3="女",SEQUENCE(情報!$C$7*情報!$E$15),
            TRUE,""
        ),
    $C$2="姓",SEQUENCE(情報!$C$7),
    $C$2="名",
        IFS(
            $C$3="男女",SEQUENCE(情報!$C$15),
            $C$3="男",SEQUENCE(情報!$D$15),
            $C$3="女",SEQUENCE(情報!$E$15),
            TRUE,""
        ),
    TRUE,""
)

[関数の説明]

セルL3には、連番を振りたいです
そのため最大番号となる数値を知る必要があります
IFS関数とSEQUENCE関数のみでできています
設定欄の出力対象(姓名/姓/名)欄と性別欄の内容によって条件をわけています
ただし、出力対象欄が「姓」だと性別判定はしません

情報シートのセルC7,C15,D15,E15にはそれぞれ、 姓,名(男女),名(男),名(女)の最大値が入っています
出力対象が姓名のとき、姓×名が最大値となります
その最大値をSEQUENCE関数に入れることにより、連番が自動的に振り分けられるのです



セルM3
[関数]
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
=IFS($C$2="姓名",
    IFS($C$3="男女",
        INDEX(
            INDIRECT(情報!$D$10),
            INT((SEQUENCE(情報!$C$7*情報!$C$15)-1)/情報!$C$15)+1
        )
        &" "&
        INDEX(
            INDIRECT(情報!$D$18),
            MOD(SEQUENCE(情報!$C$7*情報!$C$15)-1,情報!$C$15)+1
    ),
    $C$3="男",
        FILTER(
            INDEX(
                INDIRECT(情報!$D$10),
                INT((SEQUENCE(情報!$C$7*情報!$C$15)-1)/情報!$C$15)+1
            )
            &" "&
            INDEX(
                INDIRECT(情報!$D$18),
                MOD(SEQUENCE(情報!$C$7*情報!$C$15)-1,情報!$C$15)+1
            ),
            INDEX(
                INDIRECT(情報!$D$20),
                MOD(SEQUENCE(情報!$C$7*情報!$C$15)-1,情報!$C$15)+1
            )
        ="男"),
    $C$3="女",
        FILTER(
            INDEX(
                INDIRECT(情報!$D$10),
                INT((SEQUENCE(情報!$C$7*情報!$C$15)-1)/情報!$C$15)+1)
            &" "&
            INDEX(
                INDIRECT(情報!$D$18),
                MOD(SEQUENCE(情報!$C$7*情報!$C$15)-1,情報!$C$15)+1
            ),
            INDEX(
                INDIRECT(情報!$D$20),
                MOD(SEQUENCE(情報!$C$7*情報!$C$15)-1,情報!$C$15)+1
            )
        ="女"),
    TRUE,""),
$C$2="姓",
    INDEX(INDIRECT(情報!$D$10),INT(SEQUENCE(情報!$C$7))),
$C$2="名",
    IFS($C$3="男女",
        INDEX(INDIRECT(情報!$D$18),INT(SEQUENCE(情報!$C$15))),
    $C$3="男",
        FILTER(
            INDEX(INDIRECT(情報!$D$18),SEQUENCE(情報!$C$15)),
            INDEX(INDIRECT(情報!$D$20),SEQUENCE(情報!$C$15))
        ="男"),
    $C$3="女",
        FILTER(
            INDEX(INDIRECT(情報!$D$18),SEQUENCE(情報!$C$15)),
            INDEX(INDIRECT(情報!$D$20),SEQUENCE(情報!$C$15))
        ="女"),
    TRUE,""),
TRUE,"")
[関数の説明]
  1. 関数が長くなっていますが、下記の条件で構成されています
    1. 「出力対象」が「姓名」のときは、姓+全角スペース+名を結合したものが対象となる
    2. 「出力対象」が「姓」のときは、姓を参照する
    3. 「出力対象」が「名」のときは、名を参照する
    4. 出力対象が「姓名」または「名」のとき かつ 性別が「男」または「女」のときは、 すべての対象に対し、「男」または「女」で絞っている
  2. INT((SEQUENCE(...)-1)/情報!$C$15)+1
  3. SEQUENCE(...)-1→0から始まる番号列
    /情報!$C$15→名の件数で割ることで「姓の繰り返し単位」を作る
    INT(...)→小数点切り捨てで「姓の行番号」を決定
    +1→Excelの行番号は1から始まるので補正

  4. MOD(SEQUENCE(...)-1, 情報!$C$15)+1
  5. MOD(..., 情報!$C$15)→名の件数で割った余りを使う
    余りが「0~名数-1」になるので、名の行番号を決定
    +1→行番号補正
    ※姓が固定されたまま、名が順番に切り替わる

  6. INDEX関数
  7. 位置指定で値を返す
    構文 =INDEX(配列, 行番号, [列番号])

  8. FILTER関数
  9. 条件に一致する行を動的に抽出
    構文 =FILTER(配列, 条件, [空の場合])

  10. INDIRECT関数
  11. 文字列をセル参照に変換
    構文 =INDIRECT(参照文字列, [参照形式])

  12. SEQUENCE関数
  13. 連続した数列を自動生成
    構文 =SEQUENCE(行数, [列数], [開始値], [増分])

  14. INT関数
  15. 小数点以下を切り捨て
    構文 =INT(数値)

  16. MOD関数
  17. 割り算の余り
    構文 =MOD(数値, 除数)



セルN3
[関数]
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
=IFS($C$2="姓名",
    IFS($C$3="男女",
        INDEX(
            INDIRECT(情報!$D$11),
            INT((SEQUENCE(情報!$C$7*情報!$C$15)-1)/情報!$C$15)+1
        )
        &" "&
        INDEX(
            INDIRECT(情報!$D$19),
            MOD(SEQUENCE(情報!$C$7*情報!$C$15)-1,情報!$C$15)+1
        ),
    $C$3="男",
        FILTER(
            INDEX(
                INDIRECT(情報!$D$11),
                INT((SEQUENCE(情報!$C$7*情報!$C$15)-1)/情報!$C$15)+1
            )
            &" "&
            INDEX(
                INDIRECT(情報!$D$19),
                MOD(SEQUENCE(情報!$C$7*情報!$C$15)-1,情報!$C$15)+1
            ),
            INDEX(
                INDIRECT(情報!$D$20),
                MOD(SEQUENCE(情報!$C$7*情報!$C$15)-1,情報!$C$15)+1
            )
        ="男"),
    $C$3="女",
        FILTER(
            INDEX(
                INDIRECT(情報!$D$11),
                INT((SEQUENCE(情報!$C$7*情報!$C$15)-1)/情報!$C$15)+1
            )
            &" "&
            INDEX(
                INDIRECT(情報!$D$19),
                MOD(SEQUENCE(情報!$C$7*情報!$C$15)-1,情報!$C$15)+1
            ),
            INDEX(
                INDIRECT(情報!$D$20),
                MOD(SEQUENCE(情報!$C$7*情報!$C$15)-1, 情報!$C$15)+1
            )
        ="女"),
    TRUE,""),
$C$2="姓",
    INDEX(INDIRECT(情報!$D$11), INT(SEQUENCE(情報!$C$7))),
$C$2="名",
    IFS($C$3="男女",
        INDEX(INDIRECT(情報!$D$19), INT(SEQUENCE(情報!$C$15))),
    $C$3="男",
        FILTER(
            INDEX(INDIRECT(情報!$D$19),SEQUENCE(情報!$C$15)),
            INDEX(INDIRECT(情報!$D$20),SEQUENCE(情報!$C$15))
        ="男"),
    $C$3="女",
        FILTER(
            INDEX(INDIRECT(情報!$D$19),SEQUENCE(情報!$C$15)),
            INDEX(INDIRECT(情報!$D$20),SEQUENCE(情報!$C$15))
        ="女"),
    TRUE,""),
TRUE,"")
[関数の説明]

仕組みはセルM3と同じである
参照先のセルが異なっていて、かな部分を参照している



セルO3
[関数]
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
=IFS($C$2="姓名",
    IFS($C$3="男女",
        INDEX(
            INDIRECT(情報!$D$20),
            MOD(
                SEQUENCE(ROWS(INDIRECT(情報!$D$11))
                *ROWS(INDIRECT(情報!$D$19))
            )-1,
            ROWS(INDIRECT(情報!$D$19)))+1
        ),
    $C$3="男",
        FILTER(
            INDEX(
                INDIRECT(情報!$D$20),
                MOD(
                    SEQUENCE(ROWS(INDIRECT(情報!$D$11))
                    *ROWS(INDIRECT(情報!$D$19))
                )-1,
                ROWS(INDIRECT(情報!$D$19)))+1
            ),
            INDEX(
                INDIRECT(情報!$D$20),
                MOD(
                    SEQUENCE(ROWS(INDIRECT(情報!$D$11))
                    *ROWS(INDIRECT(情報!$D$19))
                )-1,
                ROWS(INDIRECT(情報!$D$19)))+1)
        ="男"),
    $C$3="女",
        FILTER(             INDEX(
                INDIRECT(情報!$D$20),
                MOD(
                    SEQUENCE(ROWS(INDIRECT(情報!$D$11))
                    *ROWS(INDIRECT(情報!$D$19))
                )-1,
                ROWS(INDIRECT(情報!$D$19)))+1
            ),
            INDEX(
                INDIRECT(情報!$D$20),
                MOD(
                    SEQUENCE(ROWS(INDIRECT(情報!$D$11))
                    *ROWS(INDIRECT(情報!$D$19))
                )-1,
                ROWS(INDIRECT(情報!$D$19)))+1
            )
        ="女"),
    TRUE,""),
$C$2="姓",""
$C$2="名",
    IFS($C$3="男女",
        INDEX(
            INDIRECT(情報!$D$20),
            INT(SEQUENCE(ROWS(INDIRECT(情報!$D$19))))
        ),
    $C$3="男",
        FILTER(
            INDEX(
                INDIRECT(情報!$D$20),
                SEQUENCE(ROWS(INDIRECT(情報!$D$19)))
            ),
            INDEX(
                INDIRECT(情報!$D$20),
                SEQUENCE(ROWS(INDIRECT(情報!$D$19)))
            )
        ="男"),
    $C$3="女",
        FILTER(
            INDEX(
                INDIRECT(情報!$D$20),
                SEQUENCE(ROWS(INDIRECT(情報!$D$19)))
            ),
            INDEX(
                INDIRECT(情報!$D$20),
                SEQUENCE(ROWS(INDIRECT(情報!$D$19)))
            )
        ="女"),
    TRUE,""),
TRUE,"")
[関数の説明]


4-5. 完成イメージ

▼[出力]シート | 設定欄1

▼[出力]シート | 導出表欄1

▼[出力]シート | 設定欄2

▼[出力]シート | 導出表欄2

▼[出力]シート | 設定欄3

▼[出力]シート | 導出表欄3



4-6. 出力欄の作成

出力欄の下記セルに関数を挿入します

セルF3
[関数]
=IF($C$4="","",
    INDEX(
        SORTBY(SEQUENCE(MAX($L:$L)),
        RANDARRAY(MAX($L:$L))
    ),
    SEQUENCE($C$4))
)

[関数の説明]
  1. 指定した数だけランダムな番号を返す
    導出表の番号欄を参照して、 導出表の番号欄の最大番号までの範囲で、設定欄の件数の数だけ乱数を発生させます
    ただし、件数が空欄の場合は出力しません
  2. SORTBY関数
  3. 並べ替えのキーを指定して配列を並べ替える
    構文 =SORTBY(
        配列, 並べ替え範囲1,
        [順序1], [並べ替え範囲2],
        [順序2], …
    )

    配列:並べ替えたい範囲や配列
    並べ替え範囲1:並べ替えの基準となる範囲
    順序1:1 → 昇順、-1 → 降順
    並べ替え範囲2, 順序2(省略可):複数のキーで並べ替える場合に指定

  4. RANDARRAY関数
  5. 動的配列で乱数を生成する
    構文
    =RANDARRAY([行数], [列数], [最小値], [最大値], [整数])
    行数(省略可):生成する乱数の行数。省略すると 1
    列数(省略可):生成する乱数の列数。省略すると 1
    最小値(省略可):乱数の下限。省略すると 0
    最大値(省略可):乱数の上限。省略すると 1
    整数(省略可):TRUE → 整数、FALSE → 小数。省略すると FALSE



セルG3
[関数]
=IF($C$4="","",SEQUENCE($C$4))
[関数の説明]

設定欄の件数までの数値を1から順に返します
ただし、件数が空欄の場合は出力しません



セルH3
[関数]
=IF($G3="","",XLOOKUP($F3, $L:$L, $M:$M))
[関数の説明]
  1. 導出表の番号欄に対する漢字を出力します
    ただし、件数が空欄の場合は出力しません
  2. XLOOKUP関数

  3. 構文
    =XLOOKUP(
        検索値, 検索範囲, 戻り範囲,
        [見つからない場合], [検索モード],
        [一致モード]
    )

    検索値:探したい値
    検索範囲:検索対象となる範囲
    戻り範囲:見つかったときに返す値の範囲
    見つからない場合(省略可):検索値が見つからなかったときに返す値
    検索モード(省略可):順方向(1)、逆方向(-1)、バイナリ検索(2/-2)
    一致モード(省略可):完全一致(0)、次に大きい値(1)、次に小さい値(-1)、ワイルドカード一致(2)



セルI3
[関数]
=IF($G3="","",XLOOKUP($F3, $L:$L, $N:$N))
[関数の説明]

導出表の番号欄に対するかなを出力します
ただし、件数が空欄の場合は出力しません



セルJ3
[関数]
=IF($G3="","",XLOOKUP($F3, $L:$L, $O:$O))
[関数の説明]

導出表の番号欄に対する性別を出力します
ただし、件数が空欄の場合は出力しません

4-7. 完成イメージ

▼[出力]シート | 設定欄1

▼[出力]シート | 出力欄1

▼[出力]シート | 設定欄2

▼[出力]シート | 出力欄2

▼[出力]シート | 設定欄3

▼[出力]シート | 出力欄3



あとがき

ツールの作成もかなり時間がかかりましたが、 こちらのページを作るのもかなり時間がかかりました
ただ、Copilot先生にかなり助けられて、 ツールの作成・ページの作成ができたこと、 今のAIはすごく優秀だなと思いました
今回、色々な関数を改めて知ることができたのは大きなことだと思っています
仕事でExcelを使うことが多いので、そちらにもいつか活きてくると信じて…
ここまでご覧いただきありがとうございました