こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルでセル内の数値の取得

エクセル2010です。
A列に文字列と数字の混在データがあります。
たとえばA1~A3に
東京123
大阪22
つくば564
などのデータがあります。
これらの文字列のうち、漢字やかなではない数字を取得したいのです。
漢字やかなの文字数が一定ではないので困っています。
関数でもVBAでもOKです。
ご教示ください

投稿日時 - 2019-10-26 22:11:19

QNo.9671491

困ってます

質問者が選んだベストアンサー

単に半角の数字だけを抜き出し、文字列として返す関数でよければ

Function GetNumeric(MyRange As Range) As String
 
 Dim C As Long
 Dim T As String
 
 GetNumeric = ""
 
 T = MyRange.Value
 If Len(T) = 0 Then Exit Function
 For C = 1 To Len(T)
  'Chr(0):48 ~ Chr(9):57
  If ((Asc(Mid(T, C, 1)) >= 48) And _
   (Asc(Mid(T, C, 1)) <= 57)) Then
   GetNumeric = GetNumeric & Mid(T, C, 1)
  End If
 Next C
 
End Function

でいかがでしょうか。

投稿日時 - 2019-10-27 09:24:48

お礼

お礼が遅くなりました。
正しく関数として機能しました。
ありがとうございます。

投稿日時 - 2019-11-01 22:13:30

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(10)

ANo.9

VBAでもよいなら、VBAの兄弟のVBSのRegExp(正規表現)を使う、(すでに出ている回答以外の方法で)、回答を出してみます。ツールー参照設定でVBScript関係の指定が必要かも。
RegExpを理解しておれば、変な小手先の技巧は要らず、コード行数も主要部分は少ない。
ーーー
例データ 元データはA列
A列 B列(実行結果)
東京124 124
出雲346 346
ハンナジョウ45123 45123
滋賀456-A
滋賀457-A789   457 789
313東京 313
ASS325   325
ーー
標準モジュールに
Sub test01()
'RegExpオブジェクトの作成
Dim reg As Object
Set reg = CreateObject("VBScript.RegExp")
'正規表現の指定
With reg
.Pattern = "[^0-9]" 'パターンを指定 半角数字以外
.IgnoreCase = False '大文字と小文字を区別するか(False)、しないか(True)
.Global = True '文字列全体を検索するか(True)、しないか(False)
End With
'---
Dim str1 As String, str2 As String
endrw = Range("A100000").End(xlUp).Row
For i = 1 To endrw
X = Cells(i, "A")
str1 = X
str2 = reg.Replace(str1, " ") '半角数字以外を削除
' MsgBox str2
Cells(i, "B") = str2
Next i
End Sub
--
https://www.sejuku.net/blog/33541 などを一部修正。
この第5行の滋賀457-A789のような例や第4行のような例は、無いとして良いのかどうか、質問に書くべき。

投稿日時 - 2019-10-27 14:31:39

お礼

ありがとうございます。
滋賀457-A789のような例や第4行のような例はありません。
そう書くべきでした。すみません。

投稿日時 - 2019-10-27 17:13:27

ANo.8

質問の表現が不十分ですよ。
A列に
(1)数字(値)のみのデータと文字列+数字の値のデータが混在してあるのか
(2)文字列と数字の混合した(文字列の)値があって文字列部分と数字部分を
分離したいのか?
標題の、「セル内の」と言っているせいか、(2)の回答が多いようだが、(1)も考えられる。セル内の「数字」部分というなら少しはっきりする。
===
(2)なら、Googleなどで、「Excel 文字列 数字部分の抜出」とでも、検索語を入れて、照会すれば、たくさん記事が出る。こんなところへ質問して時間をとることはない。
その中の最初の記事
例 エクセル関数でどんな文字列からでも数字だけを抽出できる方法!裏技
https://whiteleia.com/%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB-%E9%96%A2%E6%95%B0-%E6%96%87%E5%AD%97%E5%88%97-%E6%95%B0%E5%AD%97-%E6%8A%BD%E5%87%BA/
ーー
どれも初心者には、数思い付くような方法ではない。-->裏技!
この質問の内容パターンを、憶えるよりほかないだろう。
==
ただし質問者は、VBAまでやる人らしいのに、Google照会をしないのは解せない。
エクセルの質問など、ほとんど、今までWEB記事になっているよ。

投稿日時 - 2019-10-27 12:32:05

お礼

ご指摘ありがとうございます。
文字列+数字の値のデータです。
ただ、常に文字が先でそのあとに数字です。
すみません。

投稿日時 - 2019-10-27 17:10:01

ANo.7

HohoPapaです。

注釈の記述が間違っていましたので修正します。
'Chr(0):48 ~ Chr(9):57  誤
'Chr(48):0 ~ Chr(57):9  正

投稿日時 - 2019-10-27 11:22:43

お礼

ご丁寧に、ありがとうございます。

投稿日時 - 2019-11-01 22:14:34

ANo.5

下記の条件でコードを書いてみました。
 ・数値の位置は自由。
  文字+数字、数字+文字、文字+数字+文字、数字+文字+数字・・・
 ・半角数字と全角数字はぞのまま取り出す。
 ・抜き出した数字の前ゼロは有効とする

対象の文字列を選択した状態でマクロを実行してください。選択した隣の列に結果を出力します。
全角数字を取り出さない場合は判定箇所を「If "0" <= elm And elm <= "9" Then」としてください。
当方、Win10、Excel2010です。ご参考に。

Sub 数値を取り出す()
 Dim rg As Range   '// セル
 Dim c As Integer   '// 文字カウンタ
 Dim elm As String  '// 1文字
 Dim strWk As String '// 取り出し結果

 For Each rg In Selection
  strWk = ""
  For c = 1 To Len(rg.Text)
   elm = Mid(rg.Text, c, 1)
   If "0" <= StrConv(elm, vbNarrow) And _
        StrConv(elm, vbNarrow) <= "9" Then
    strWk = strWk & elm
   End If
  Next
  rg.Offset(0, 1).NumberFormatLocal = "@"
  rg.Offset(0, 1) = strWk
 Next
End Sub

投稿日時 - 2019-10-27 02:01:21

お礼

ありがとうございます。
正しく動きました。

投稿日時 - 2019-10-27 16:29:41

ANo.4

[No.3]で提示した式ですが、次のように訂正しておきます。
=MID(A1,MIN(FIND({1,2,3,4,5,6,7,8,9,0},A1&1234567890)),99)
理由:当該式の末尾に「*1」があると、文字列の後の数字部分が 0 から始まる場合にその 0 が表示されなくなるから。

投稿日時 - 2019-10-27 01:44:32

お礼

ご丁寧のありがとうございます。その通りでした。

投稿日時 - 2019-10-27 16:26:00

ANo.3

=MID(A1,MIN(FIND({1,2,3,4,5,6,7,8,9,0},A1&1234567890)),99)*1

投稿日時 - 2019-10-26 22:44:09

お礼

ありがとうございます。
なぜ、この式で答えが返るのかわかりませんが、正しく帰ってきました。
ありがとうございます。

投稿日時 - 2019-10-27 16:24:26

ANo.2

こんな感じでいかがでしょう 同じ行のB列に数値のみを書き込みます。
全角の数字があった場合、半角に変換して半角の数値にしてます。
Sub Test()
Dim i As Long
Dim c As Range
Dim strbuf As String

For Each c In Range(Cells(1, "A"), Cells(Rows.Count, "A").End(xlUp))
strbuf = ""
For i = 1 To Len(c.Value)
If IsNumeric(Mid(c.Value, i, 1)) Then
strbuf = StrConv(strbuf & Mid(c.Value, i, 1), vbNarrow)
End If
Next
If strbuf <> "" Then
Cells(c.Row, "B").Value = Val(strbuf)
End If
Next
End Sub

投稿日時 - 2019-10-26 22:40:48

お礼

ありがとうございます。
期待通りの動きをしてくれました。

投稿日時 - 2019-10-27 16:21:38

ANo.1

A1に文字+数字があるとしたら
=LOOKUP(10^17,RIGHT(A1,COLUMN($1:$1))*1)

投稿日時 - 2019-10-26 22:39:08

お礼

ありがとうございます。
なぜ、この式で答えが返るのかわかりませんが、正しく帰ってきました。
ありがとうございます。・

投稿日時 - 2019-10-27 16:16:15

ANo.1

関数で
https://qiita.com/mhara/items/82421d1b34e88a3efba1

VBAで
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell_suuji.html

ちなみに数字は必ず末尾だけですか? それとも先頭や真ん中、入り乱れるケースもあります?

投稿日時 - 2019-10-26 22:31:34

補足

数字は必ず末尾だけです。

投稿日時 - 2019-10-27 16:16:52

お礼

ありがとうございます。

投稿日時 - 2019-11-01 22:15:53

あなたにオススメの質問