Excel数式でランダムな文字列・パスワードを自動生成する方法【VBA・旧バージョン対応策あり】
はじめに:ランダム文字列生成が必要な理由
パスワードやテストデータの作成において、手入力や外部サイトの利用はセキュリティおよび利用文字などの効率の観点から推奨されないことがあります。
その場合、Excelの標準機能を用いることで、ローカル環境内でランダムな文字列を安全かつ効率的に生成できます。
本記事では、Excelの数式、VBA、Office Scriptの3つのアプローチを提示します。利用環境に応じた選択が可能です。
環境による使い分け
- 数式: Microsoft 365 または Excel 2021 以降が必要
- VBA: 古いバージョンのExcelでも利用可能
- Office Script: 主にExcel for Web (ブラウザ版) 向け
概要解説動画
実現できること
予め用意した「文字リスト(プール)」からランダムに文字を抽出し、指定した桁数で結合する仕組みです。
主な特徴
- 数式の場合、F9キー(再計算)で瞬時に別パターンを生成できます
- 文字種(英数字、記号)はセル入力値を変えるだけでカスタマイズ可能です
- 生成された文字列は、パスワード発行やダミーデータ作成に利用できます
ランダム文字列生成の数式解説(Microsoft 365 / 2021以降)
基本数式
CONCAT、MAP、RANDARRAY、COUNTA、LAMBDA、OFFSETを利用します。
=CONCAT(MAP(RANDARRAY(文字数,1,1,COUNTA(テキスト範囲),TRUE),LAMBDA(v,OFFSET(テキスト範囲の左端,0,v-1))))
実際に利用すると次のようになります。
=CONCAT(MAP(RANDARRAY($A$2,1,1,COUNTA($A$1:$B$J1),TRUE),LAMBDA(v,OFFSET($A$1,0,v-1))))


数式の構造
この数式は以下の4つの処理を組み合わせています。
- COUNTA: 文字プールの総数を取得
- RANDARRAY: 1から総数までの乱数を、必要な桁数分だけ配列として生成
- OFFSET & MAP (LAMBDA): 生成された乱数をインデックスとして、プールから該当する文字を取得
- CONCAT: 取得した文字配列を1つの文字列として結合
処理の流れ
例として、文字プールに62文字(A-Z,a-z, 0-9)を用意し、10桁のランダム文字列を生成する場合を示します。
- COUNTAが文字プールの総数「62」を返します
- RANDARRAYが1〜62の乱数を10個生成します(例: 5, 22, 3, 15...)
- MAPとLAMBDAが各乱数に対応する文字を取得します(例: e, v, c, o...)
- CONCATがこれらを結合して1つの文字列にします(例: evco...)
縦方向リストを使用する場合
文字プールを縦方向に配置する場合は、OFFSET関数の引数を変更します。
=CONCAT(MAP(RANDARRAY(文字数,1,1,COUNTA(テキスト範囲),TRUE),LAMBDA(v,OFFSET(テキスト範囲の上端,v-1,0))))
横方向では OFFSET(左端, 0, v-1) で列方向に移動しますが、縦方向では OFFSET(上端, v-1, 0) で行方向に移動します。
実際に利用すると次のようになります。
=CONCAT(MAP(RANDARRAY($B$1,1,1,COUNTA($A$1:$A$62),TRUE),LAMBDA(v,OFFSET($A$1,v-1,0))))


具体的な設定手順
手順1: 文字プールの作成
任意のセル範囲(例ではA1:AK1)に使用したい文字を入力します。
- 小文字のみ: a, b, c, ... z
- 数字のみ: 0, 1, 2, ... 9
- 記号混在: a, b, c, ... z, 0, 1, ... 9, !, @, #
各文字を1セルに1文字ずつ配置します。記号を含める場合は、使用可能な記号をプールに追加します。
すでにまとまったテキストが存在する場合は、テキストを1文字ずつセルに分割する数式を利用します。
手順2: 文字数の指定
任意のセル(例:ではA2)に生成したい桁数を入力します。
- 8桁のパスワード: 8
- 12桁のID: 12
手順3: 数式の入力
結果を表示したいセル(例: A3)に数式を入力します。
=CONCAT(MAP(RANDARRAY($A$2,1,1,COUNTA($A$1:$BJ$1),TRUE),LAMBDA(v,OFFSET($A$1,0,v-1))))
A2: 文字数を指定したセルA1:AK1: 文字プールの範囲A1: プールの左端セル
この数式を入力すると、指定した桁数のランダム文字列が生成されます。F9キーで再計算すると、新しい文字列が生成されます。
値を固定したい場合・旧バージョンの場合
数式には以下の2つの制約があります。
- 揮発性: 再計算のたびに値が変動します
- バージョン依存: Microsoft 365 または Excel 2021 以降が必要です
古いExcel環境(Excel 2019/2016など)を使用している場合や、生成した値を固定したい場合は、以下のスクリプト手法が有効です。
VBAによる生成(旧バージョン・デスクトップ版 Excel向け)
マクロを追加したブックの保存時は必ず「Excel マクロ有効ブック (*.xlsm)」形式を選択してください。
対応バージョン: Excel 2016, 2019, 2021, Microsoft 365等
仕様
- 選択範囲から文字プールを取得
- 指定した桁数のランダム文字列を生成
- 選択範囲の右隣のセルに出力
メリット
- バージョン依存が少なく、古いExcelでも動作します
- 生成した値は固定され、再計算で変動しません
実装手順
- Alt + F11でVBAエディタを開きます
- 挿入 > 標準モジュールを選択します
- 以下のコードを貼り付けます
- 文字プールのセル範囲を選択します
- Alt + F8でマクロ一覧を表示し、GenerateRandomStringFromSelectionを実行します
コード
Sub GenerateRandomStringFromSelection()
Dim rng As Range
Dim CharPool As String
Dim Result As String
Dim i As Integer
' 設定:生成する文字数
Const TARGET_LENGTH As Integer = 12
' セル範囲が選択されていない場合のチェック
If TypeName(Selection) <> "Range" Then
MsgBox "セル範囲を選択してください。", vbExclamation
Exit Sub
End If
' 選択範囲の値を結合して文字プールを作成
For Each rng In Selection
CharPool = CharPool & CStr(rng.Value)
Next rng
' 文字プールが空の場合は終了
If Len(CharPool) = 0 Then
MsgBox "選択範囲に文字が見つかりません。", vbExclamation
Exit Sub
End If
Randomize
' 指定の長さ分ランダムに抽出
For i = 1 To TARGET_LENGTH
Result = Result & Mid(CharPool, Int(Len(CharPool) * Rnd + 1), 1)
Next i
' 出力:選択範囲の右隣(範囲外)の先頭行セルに値を入れる
Selection.Cells(1, 1).Offset(0, Selection.Columns.Count).Value = Result
End Sub
カスタマイズ
コード内の TARGET_LENGTH の値を変更することで、生成する文字数を調整できます。
Office Scriptによる生成(Excel for Web向け)
対応環境: Microsoft 365 ※Webでもデスクトップでも利用可能です。
仕様
- 選択範囲から文字プールを取得
- 指定した桁数のランダム文字列を生成
- 選択範囲の右隣のセルに出力
メリット
- Webブラウザ上で動作し、環境構築が容易です
- 生成した値は固定され、再計算で変動しません
実装手順
- 自動化タブを選択します
- 新しいスクリプトを作成します
- 以下のコードを貼り付けて保存します
- 文字プールのセル範囲を選択します
- スクリプトを実行します
コード
function main(workbook: ExcelScript.Workbook) {
// 設定:生成する文字数
const length = 12;
// 現在選択されているセル範囲を取得
const selectedRange = workbook.getSelectedRange();
const values = selectedRange.getTexts();
// 選択範囲から文字プールを作成
let charPool = "";
for (let i = 0; i < values.length; i++) {
for (let j = 0; j < values[i].length; j++) {
charPool += values[i][j];
}
}
// 文字プールが空でない場合のみ実行
if (charPool.length > 0) {
let result = "";
for (let k = 0; k < length; k++) {
result += charPool.charAt(Math.floor(Math.random() * charPool.length));
}
// 出力:選択範囲の右隣(範囲外)のセルに値を入れる
selectedRange.getCell(0, selectedRange.getColumnCount()).setValue(result);
}
}
カスタマイズ
コード内の length の値を変更することで、生成する文字数を調整できます。
手法の比較と使い分け
| 手法 | 対応環境 | メリット | デメリット |
|---|---|---|---|
| 数式 | Microsoft 365 Excel 2021以降 | Web版でも利用可能 設定が手軽 F9キーで即座に再生成するため、何度も試したい場合に有効。 | 最新バージョンが必要 セルの再計算でも変わるため、意図せず結果が変わってしまうことがある |
| VBA | Excel 2016以降 デスクトップ版 | 旧バージョンでも動作 意図せず結果が変わることがない。 バージョン依存が少ない | マクロ有効化ブックとセキュリティ設定の変更が必要 数式に比べると動作が遅い。Office Scriptよりは速いことが多い。 |
| Office Script | Microsoft 365 | Web版でも利用可能 意図せず結果が変わることがない。 | 永続ライセンスでは利用不可 手法の中では最も動作が遅い(VBAとはPC性能次第)。 |
選択の指針
数式を選択する場合
- Microsoft 365 または Excel 2021以降を利用
- 何度も試行したい
- マクロを有効化したくないシート
VBAを選択する場合
- Excel 2019, 2016など旧バージョンを使用
- セルの再計算で結果が変わることを避けたい
- デスクトップ版Excelを使用している
Office Scriptを選択する場合
- Microsoft 365を使用
- セルの再計算で結果が変わることを避けたい
- 主にWeb版を使用している
まとめ
Excelでランダム文字列を生成する3つのアプローチを提示しました。
利用環境に応じて、最適なアプローチを選択することを推奨します。各手法には固有のメリットとデメリットがあり、業務要件に合わせた選択が効率化につながります。