Excelで重複なし・誤認なしの安全なクーポンコードを大量生成する数式

実務の深淵

はじめに:そのクーポンコード、本当に大丈夫?

ECサイトやキャンペーンで配布する「クーポンコード」。
ランダムな英数字であれば何でもいいと思っていませんか?

Excelの説明画像

例えば、適当に作ったコードが「820MKD」だったとします。
これをお客様がiPhoneで受け取るとどうなるでしょう?

「MKD 820.00」

なんと、OSの機能が勝手に気を利かせて「マケドニア・デナール」という通貨表記に変換してしまうことがあるのです。

さらに恐ろしいのが、Excel自身の自動変換機能です。

もし「1E05」というコードが生成されたらどうなるか。
試しに、お手元のExcelのセルに「1E05」と入力(または貼り付け)してみてください。

Excelの説明画像

勝手に「1.00E+05」(指数表記)や「100000」(数値)に変換されませんか?

Excelはこれを数値として認識してしまうのです。

つまり、ランダムに生成したコードを保存しようと「値貼り付け」した瞬間、この自動変換が発動してデータが壊れる恐れがあります。

他にも、偶然「BAD」「DIE」といった縁起の悪い単語が含まれてしまったり…。

ただのランダム生成には、こうした「事故」のリスクが潜んでいます。

今回は、こうしたトラブルを未然に防ぎ、実務で安心して使える「重複なし・安全・高品質」なクーポンコード生成機をExcel数式で作ります!

本記事の前提

今回は、クーポンコードを「アルファベット大文字」と「数字」のみで作成します。

また、コードの表示には等幅フォントの「Consolas」を使用しています。

デフォルトのプロポーショナルフォント(游ゴシックなど)では文字幅が揃わず見にくいため、コード管理には等幅フォントが推奨されます。

※フォント「Consolas」については、以下の記事で詳しく解説しています。

本記事では、無料のWeb版Excelを使用して検証および画像の作成を行っています。Windowsはもちろん、MacやLinuxの方もブラウザさえあれば挑戦できます!

ステップ1:まずは「材料」を揃える

関数の詳細な仕様については、Microsoft公式のヘルプも参考にしてください。

はじめに、コードの元となる文字を用意しましょう。
A1セルに、以下の数式を入力してください。

=CONCAT(UNICHAR(SEQUENCE(10,,48)),UNICHAR(SEQUENCE(26,,65)))

【解説】
この数式は、文字コード(Unicode)を利用して「0〜9」と「A〜Z」を一気に出力しています。

  • SEQUENCE(10,,48):48から始まる10個の連番(48〜57)を作ります。これは数字の「0〜9」のコードです。
  • SEQUENCE(26,,65):65から始まる26個の連番(65〜90)を作ります。これは大文字「A〜Z」のコードです。
  • UNICHAR:コードを実際の文字に変換します。

結果として、0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ という文字列が生成されます。

Excelの説明画像

※文字コードについては以下の記事で詳しく解説しています。

試しにクーポンコードを作ってみよう

材料(A1セル)が揃ったので、まずはシンプルにここから6文字をランダムに抜き出して、クーポンコードを作ってみましょう。

以下の数式をA3セルに入力し、下方向(A3:A12)へコピーしてください。

=CONCAT(MID($A$1,RANDARRAY(6,,1,LEN($A$1),1),1))

すると、A3:A12の範囲に以下のようなランダムな文字列が生成されます。

Excelの説明画像

【数式の解説】

  • LEN($A$1):A1セルの文字数(36文字)を数えます。
  • RANDARRAY(6,,1,文字数,1):1から36までの整数(乱数)を、縦に6個生成します。これが「何文字目を抜き出すか」の指示になります。
  • MID($A$1, 乱数, 1):A1セルの文字列から、乱数番目の文字を1文字ずつ抜き出します。
  • CONCAT:バラバラに抜き出された6文字を結合して、1つの文字列にします。

一見、これで良さそうに見えますよね?

しかし、この方法のままでは以下の問題が発生する可能性があります。


ステップ2:「事故」を防ぐためのルール作り

先ほどの単純なランダム生成では、前述の「事故」が起きるリスクが排除できません。

そこで、実務運用に耐えうる鉄の掟を設けます。

1. 紛らわしい文字は「使わない」

画面のフォントによっては、以下の文字は区別がつきません。

「みんなコピペしてくれるでしょ?」と思うかもしれませんが、チラシや画像を見てスマホで「直打ち(手入力)」するお客様もたくさんいます。

その際、紛らわしい文字は致命的な入力ミス(カゴ落ち)の原因になるため、最初から除外します。

  • 数字の「1」と、アルファベットの「I(アイ)」
  • 数字の「2」と、アルファベットの「Z(ゼット)」
  • 数字の「0」と、アルファベットの「O(オー)」
Excelの説明画像

次に、これらを除外した「安全なリスト」をセルに入力しておきましょう。

  • F1セル(数字): 3456789
  • F2セル(英字): ABCDEFGHJKLMNPQRSTUVWXY

2. 文字と数字を「交互」にする

「MKD(通貨コード)」や「SEX(不適切な単語)」といった意味のある文字列が生まれる原因は、英字が連続するからです。

そこで、今回は「英字・数字・英字・数字…」と交互に配置する8桁のコードを作成します。

(例): A3B4C5D6

これなら通貨に誤認されることも、単語になってしまうこともありません。

しかも、この組み合わせ(23文字×7文字を4セット)は、以下の計算の通り約6億7000万通りもあります。

234×74=279,841×2,401=671,898,24123^4 \times 7^4 = 279,841 \times 2,401 = 671,898,241 通り

6桁のランダム(約400万通り)に比べて、重複のリスクも圧倒的に低くなります。


ステップ3:重複との戦い(試行錯誤編)

ルールは決まりましたが、ランダム生成において避けて通れないのが「重複」です。

完全にランダムだと、確率こそ低いものの、同じコードが2回出てくる可能性があります。

1. 重複があるかチェックする

もし、既に作成したクーポンコードが A3:A12 の範囲にあるとしたら、以下の数式で重複の有無を一発で判定できます。

=AND(COUNTIF(A3:A12,A3:A12)=1)

Excelの説明画像

【解説】
COUNTIFでそれぞれのコードが範囲内にいくつあるかを数え、すべて「1個(=自分だけ)」であれば TRUE を返します。

もし重複があれば「2」以上の数字が混ざるため FALSE になります。
TRUEなら安心してコピペできますね。

Excelの説明画像

2. 重複を取り除いて抽出する

もし重複があった場合、手動で消すのは面倒です。

そんな時は UNIQUE 関数と TAKE 関数を組み合わせます。

以下の数式は、例として重複のないコードを「8個」取り出す場合の数式です。

=TAKE(UNIQUE(A3:A12), 8)

【解説】
1. UNIQUE(A3:A12):範囲内の重複データを削除して、ユニークなリストにします。
2. TAKE(..., 8):そのリストの上から「8個」だけを取り出します。

これで、重複のないクリーンなリストを入手できます。

Excelの説明画像

3. 一発で生成しようとした時の「落とし穴」

「じゃあ、最初から UNIQUE 関数を組み込めばいいじゃん!」と思いますよね。
例えば、こんな数式です。

=LET(a,F2,n,F1,cnt,10,UNIQUE(MAP(SEQUENCE(cnt),LAMBDA(i,CONCAT(MID(a&n,RANDARRAY(4,1,1,LEN(a),1),1)&MID(a&n,RANDARRAY(4,1,LEN(a)+1,LEN(a&n),1),1))))))

Excelの説明画像

これは、先程のランダム生成ロジックに UNIQUE をかませたものです。

しかし、これには致命的な欠点があります。

「運悪く重複が発生した場合、結果が指定した数(n=10)より少なくなってしまう」のです。

10個作って、1個重複して消されたら、手元に残るのは9個。

「10個納品してください」と言われているのに9個しか出せなかったら大問題ですよね。
この問題を解決するのが、次の数式です。


ステップ4:重複なしコードを大量生産する「究極の数式」

それでは、いよいよ生成です。

「指定された数を絶対に確保する」ために、多めに作って(投網)、良いものだけ残す」という戦略をとります。

続いて、以下の数式を入力してください。

=LET(
a, F2,
n, F1,
cnt, 10,
TAKE(
UNIQUE(
MAP(
SEQUENCE(cnt*1.5),
LAMBDA(i,
CONCAT(
MID(a&n, RANDARRAY(4, 1, 1, LEN(a), 1), 1) &
MID(a&n, RANDARRAY(4, 1, LEN(a)+1, LEN(a&n), 1), 1)
)
)
)
),
cnt
)
)

数式の解剖図(ここがポイント!)

1. LET関数で変数を定義する

数式を見やすく、変更しやすくするために LET 関数を使っています。

  • a:英字リスト(F2セル)
  • n:数字リスト(F1セル)
  • cnt生成したい個数(ここでは10個)

この cnt の数字を変えるだけで、100個でも1000個でも自由自在に生成できます。

2. 多めに作る(投網を打つ)

SEQUENCE(cnt*1.5) の部分です。

欲しい数が「10個」だとしても、重複で減る可能性を考慮し、あらかじめ1.5倍(15個)生成します。

3. 1つずつ生成する(MAPとLAMBDA)

MAP関数は、配列の要素ひとつひとつに対して処理を行う関数です。

ここでは RANDARRAY を巧みに使って、英字と数字を交互に配置しています。

  • MID(a&n, RANDARRAY(4, 1, 1, LEN(a), 1), 1)
    英字リスト(a)の範囲から、ランダムに4文字取り出します。
  • MID(a&n, RANDARRAY(4, 1, LEN(a)+1, LEN(a&n), 1), 1)
    数字リスト(n)の範囲から、ランダムに4文字取り出します。

※以下、イメージ

Excelの説明画像

これらを & で結合すると、配列同士がくっつき {英1数1; 英2数2; 英3数3; 英4数4} という形になります。

最後に CONCAT で1つの文字列にまとめれば、「英数英数英数英数」の8桁コードの完成です!

Excelの説明画像

4. 重複を取り除き、必要な分だけ摘む

生成された大量のコードを UNIQUE 関数に通して重複を削除します。

最後に TAKE(..., cnt) で、上から順番に欲しい個数(10個)だけを取り出します。

1.5倍も作っておけば、多少重複して消えても、10個は余裕で確保できるというわけです。

Excelの説明画像

【⚠超重要:実務での注意点】
この数式はランダム関数(RANDARRAY)を使用しているため、シートを再計算するたびにクーポンコードが変わってしまいます!

コードが生成されたら、すぐに範囲を選択してコピーし、「値として貼り付け」を行って文字列を固定してください。

これを忘れると、発行したコードが変わってしまい、大事故につながります。

まとめ:永久保存版の生成機

cnt の値を「100」や「1000」に変えれば、一瞬でその数だけユニークなクーポンコードが生成されます。

  • 誤認文字なし
  • 不適切ワードなし
  • 勝手な自動変換なし
  • 重複なし

これらを全てクリアしたコードを一瞬で作れるこの数式は、まさに実務における「永久保存版」のツールと言えるでしょう。

ぜひ、キャンペーンや会員IDの発行などで活用してみてください!

タイトルとURLをコピーしました