Excel 数字だけを抜き出す方法|初心者向けテクニックとコピペで解決
「TEL:03-1234-5678」から「0312345678」だけを抽出したい。「商品番号:ABC-12345」から「12345」だけを取り出したい。このような文字列から数字だけを抜き出す作業に時間がかかっていませんか?
数字と数字以外が混在する文字列から数字のみを抽出する方法を紹介します。
よく見かける手法では、ある程度ルールのある文字列から抽出しますが、この記事ではどんなルールでも対応します。
よくある抽出パターンの例
| 文字列 | 抽出対象の数字 |
|---|---|
| A-0005 | 0005 |
| 090-1234-XXXX | 0901234 |
| 0あ12うえ56お7 | 012567(全角数字含む) |
※全角数字の処理方法は、選択する手法によって異なります
従来であれば、一つずつ手作業で数字を打ち直したり、複雑な関数を覚える必要がありました。
この記事では、最も簡単なフラッシュフィル機能から、コピペで使える関数、さらに高度な自動化まで、複数の解決策を紹介します。
IT初心者の方でも迷わず実行できる方法から、より確実で応用の利く方法まで、段階的に解説します。
あなたのスキルレベルと業務要件に合わせて、最適な解決策を見つけてください。
最も手軽で分かりやすい方法【フラッシュフィル】
まずは、関数の知識が一切不要な、最も簡単な方法から説明します。Excelのフラッシュフィル機能は、あなたが入力したパターンを自動で学習し、残りのデータに同じ処理を適用してくれる便利な機能です。
実践例で理解する
以下のようなデータがA列にあると仮定します:
| 元データ |
|---|
| 価格:¥2,500円 |
| TEL:03-1234-5678 |
| 注文No.XYZ-789-DEF |
| FAX:06-9876-5432 |
| 商品番号:ABC-12345 |
| 管理番号:DEF-456 |
| 郵便番号:〒100-0001 |
| 会員ID:MEM456 |
| 価格:¥700円 |
具体的な手順
ステップ1:抽出例を手入力する
以下のように、数字だけを抽出した例を2つ手入力します(先頭にアポストロフィ「'」を付けて、0が消えないようにします):
- A2セル「価格:¥2,500円」→ B2セルに「2500」
- A3セル「TEL:03-1234-5678」→ B3セルに「'0312345678」
これらがパターンの見本となります。
ステップ2:フラッシュフィルを実行する
B3セルを選択した状態で、データタブの「フラッシュフィル」ボタンをクリック、またはCtrl+Eキーを押します。すると、パターンを学習してB列の残りのセルに自動で数字が抽出されます。
※データのある範囲内であれば、B列のどのセルを選択していても機能します。
フラッシュフィルが効果的なケース
- データの形式が統一されている場合
- 抽出したい数字の位置が一定の場合
- 統一されたフォーマットのデータを直感的な操作で処理したい場合
注意点
フラッシュフィルは便利ですが、データの形式にばらつきがある場合や、複雑なパターンの場合は認識に失敗することがあります。そのような場合は、次に紹介する数式を使った方法が確実です。
関数による幅広い対応
フラッシュフィルがうまくいかない場合や、より幅広いデータ形式に対応したい場合は、数式を使った方法が効果的です。ここでは、コピー&ペーストで使える実用的な数式を紹介します。
【最新版Excel向け】コピペで手軽に実装
Microsoft 365やExcel 2021以降をお使いの方は、以下の数式をコピー&ペーストするだけで、確実に数字だけを抽出できます。新しい関数やスピルを利用していますが、簡潔です。
一つの数式で完結する方法
基本版(全角半角をそのまま保持)
=LAMBDA(txt, CONCAT(MAP(MAKEARRAY(1,LEN(txt),LAMBDA(row,col,MID(txt,col,1))),LAMBDA(v,IF(ISNUMBER(VALUE(v)),v,"")))))(A2)
半角に統一する数式
=LAMBDA(txt, CONCAT(MAP(MAKEARRAY(1,LEN(txt),LAMBDA(row,col,MID(txt,col,1))),LAMBDA(v,IF(ISNUMBER(VALUE(v)),ASC(v),"")))))(A2)
全角に統一する数式
=LAMBDA(txt, CONCAT(MAP(MAKEARRAY(1,LEN(txt),LAMBDA(row,col,MID(txt,col,1))),LAMBDA(v,IF(ISNUMBER(VALUE(v)),JIS(v),"")))))(A2)
使い方:
- データの使用目的に応じて数式を選択します
- 基本版:元の文字幅を変更したくない場合
- 半角版:システム入力や数値計算に使用する場合
- 全角版:文書の見た目を統一したい場合
- 選択した数式を結果を表示するセル(例:B2)にコピー&ペーストします
- 「A2」の部分を、実際のデータがあるセル番地に変更します
- Enterキーを押すと、数字だけが抽出されます
解説: これらの数式で使用している関数:LAMBDA、CONCAT、MAP、MAKEARRAY、LEN、MID、ISNUMBER、VALUE、ASC(半角化)、JIS(全角化)。各関数の詳しい使い方については、それぞれの関数の解説記事をご参照ください。
【旧バージョンExcel向け】段階的な数式
新しい関数やスピルも不要な方法です。Excel 2019以前のバージョンをお使いの方は、以下の方法で同様の結果を得られます。
ステップ1:一文字ずつ抽出・判定する
まず、文字列を1文字ずつ抽出して、数字かどうかを判定する数式を作成します。
基本版(全角半角をそのまま保持)
=IF(ISNUMBER(VALUE(IF(COLUMN(A1)<=LEN($A2),MID($A2,COLUMN(A1),1),""))),IF(COLUMN(A1)<=LEN($A2),MID($A2,COLUMN(A1),1),""),"")
半角に統一する数式
=IF(ISNUMBER(VALUE(IF(COLUMN(A1)<=LEN($A2),MID($A2,COLUMN(A1),1),""))),ASC(IF(COLUMN(A1)<=LEN($A2),MID($A2,COLUMN(A1),1),"")),"")
全角に統一する数式
=IF(ISNUMBER(VALUE(IF(COLUMN(A1)<=LEN($A2),MID($A2,COLUMN(A1),1),""))),JIS(IF(COLUMN(A1)<=LEN($A2),MID($A2,COLUMN(A1),1),"")),"")
使い方:
- データの使用目的に応じて数式を選択します
- 基本版:元の文字幅を変更したくない場合
- 半角版:システム入力や数値計算に使用する場合
- 全角版:文書の見た目を統一したい場合
- 選択した数式をB2セルに入力します
- COLUMN(A1)の部分は変更せず、そのまま使用します(1からの連番生成のため)
- $A2の部分は、実際のデータがあるセル番地に変更します(例:$A3、$A4など)
- B2セルを選択し、右方向(C2、D2、E2...)にドラッグしてコピーします
- 元の文字列の最大文字数分まで横に展開します
この数式により、B2からの各セルに、元の文字列の1文字目、2文字目、3文字目...がそれぞれ表示され、数字以外は空白になります。半角版では数字がすべて半角に、全角版では数字がすべて全角に変換されて表示されます。
ステップ2:各セルに抽出された数字を1つのセルに結合する
ステップ1で抽出した数字を結合するには、以下のCONCAT関数を使います。
=CONCAT(B2:U2)
使い方:
- 結果を表示したいセル(例:V2)に上記数式を入力します
- 「B2:U2」の範囲は、ステップ1で数式をコピーした範囲に合わせて調整します
- Enterキーで実行すると、数字だけが結合された結果が表示されます
この2段階の方法により、古いバージョンのExcelでも数字抽出が可能です。
※もしCONCAT関数が使用できない場合は、文字列結合(&演算子)を使用してください。
ステップ1・2で使用している関数: IF、ISNUMBER、VALUE、COLUMN、LEN、MID、ASC(半角化)、JIS(全角化)、CONCAT
関数による方法のメリット
- 幅広い対応:多様なデータ形式に対応可能
- 再利用性:一度設定すれば同じ処理を繰り返し実行可能
- 保存性:ファイル保存時に数式も一緒に保存される
- 自動更新:元データが変更されると結果も自動で更新される
高度な抽出テクニック
基本的な数字抽出をマスターした後は、より高度なテクニックも活用できます。
正規表現を使った抽出(REGEXEXTRACT関数)
Microsoft 365の最新版では、正規表現を使用したより柔軟な抽出が可能です。正規表現は分かりにくいですが、最も簡潔な数式というメリットがあります。
=CONCAT(REGEXEXTRACT(A2,"\d+",1))
概要: 正規表現「\d+」を使って、連続する数字を抽出します。複数の数字の塊がある場合でも、すべてを抽出して結合できます。
適用例:
- 元データ:「注文番号123、商品コード456、価格789円」
- 結果:「123456789」
複数の数字の塊を別々に抽出
数字の塊を別々のセルに分割して抽出したい場合は、以下の数式が使用できます。
=TEXTSPLIT(A1,TEXTSPLIT(A1,VSTACK(JIS(SEQUENCE(10,,0)),SEQUENCE(10,,0)),,TRUE))
概要: 文字列内の複数の数字の塊を、それぞれ別のセルに分離して表示します。数式を入力したセルの横に、数字が自動で展開されます(スピル機能)。
適用例:
- 元データ:「TEL:03-1234-5678」
- 結果:「03」「1234」「5678」(別々のセル)
スクリプトを使った自動化
VBA(Visual Basic for Applications)
大量のデータや定期的な処理には、VBAによる自動化が効果的です。
数字抽出のコード
Sub ExtractNumbersFromRange()
Dim ws As Worksheet
Dim inputRange As Range
Dim cell As Range
Dim numbers As String
Dim i As Integer
' アクティブなワークシートを対象
Set ws = ActiveSheet
' ユーザーに抽出対象のセル範囲を選択させる
On Error Resume Next
Set inputRange = Application.InputBox("数字を抽出するセル範囲を選択してください。", Type:=8)
On Error GoTo 0
If inputRange Is Nothing Then
Exit Sub ' キャンセルされた場合
End If
' 入力範囲の各セルをループ
For Each cell In inputRange
numbers = "'" ' 結果を初期化
' テキストを一文字ずつ確認
For i = 1 To Len(cell.Value)
' その文字が数字か判定
If IsNumeric(Mid(cell.Value, i, 1)) Then
' 数字であれば結果に追加
numbers = numbers & Mid(cell.Value, i, 1)
End If
Next i
' 結果を隣のセルに書き込む
cell.Offset(0, 1).Value = numbers
Next cell
MsgBox "数字の抽出が完了しました。", vbInformation
End Sub
使い方
- VBAエディタを開く:Alt + F11でVBAエディタを開きます
- モジュール追加:挿入 → 標準モジュールを選択します
- コード追加:上記コードをコピー&ペーストします
- 実行方法:Alt + F8でマクロダイアログを開き、「ExtractNumbersFromRange」を選択して実行
- 範囲選択:ダイアログで数字を抽出したいセル範囲を選択します
- 結果確認:選択した範囲の隣のセル(右側)に抽出結果が表示されます
Office スクリプト
Microsoft 365では、Office スクリプトを使用した自動化が可能です(デスクトップ版・ブラウザ版両方対応)。
数字抽出のコード
function main(workbook: ExcelScript.Workbook) {
// 抽出元シート名とセル範囲を直接指定
let sheetName = "Sheet4"; // ここに抽出元のシート名を記入
let sourceRangeAddress = "C2:C10"; // ここに抽出元のセル範囲を記入
// 抽出後のデータを書き込む列を指定(ここではB列)
let outputRangeAddress = "D2"; // ここに抽出結果の書き込み開始セルを記入
let sheet = workbook.getWorksheet(sheetName);
let sourceRange = sheet.getRange(sourceRangeAddress);
let values = sourceRange.getValues();
let outputRange = sheet.getRange(outputRangeAddress);
for (let i = 0; i < values.length; i++) {
let text = String(values[i][0]);
let numbers = "";
for (let j = 0; j < text.length; j++) {
let char = text.charAt(j);
let code = char.charCodeAt(0);
// 半角数字 (0-9) または 全角数字 (0-9) の文字コード範囲で判定
if ((code >= 48 && code <= 57) || (code >= 65296 && code <= 65305)) {
numbers += char;
}
}
outputRange.getCell(i, 0).setValue(numbers);
}
}
使い方
- スクリプト作成:自動化タブ → 新しいスクリプトを選択します
- 設定変更:コード内の以下の部分を実際の環境に合わせて変更します
sheetName:処理対象のシート名sourceRangeAddress:抽出元のセル範囲(例:C2:C10)outputRangeAddress:結果の書き込み開始セル(例:D2)
- コード入力:上記コードをコピー&ペーストします
- 実行:実行ボタンで指定範囲を一括処理します