• ベストアンサー

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

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

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

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.6

単に半角の数字だけを抜き出し、文字列として返す関数でよければ 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 でいかがでしょうか。

emaxemax
質問者

お礼

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

その他の回答 (9)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.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行のような例は、無いとして良いのかどうか、質問に書くべき。

emaxemax
質問者

お礼

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

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.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記事になっているよ。

emaxemax
質問者

お礼

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

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.7

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

emaxemax
質問者

お礼

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

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.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

emaxemax
質問者

お礼

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

  • msMike
  • ベストアンサー率20% (364/1805)
回答No.4

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

emaxemax
質問者

お礼

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

  • msMike
  • ベストアンサー率20% (364/1805)
回答No.3

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

emaxemax
質問者

お礼

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

  • kkkkkm
  • ベストアンサー率66% (1734/2604)
回答No.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

emaxemax
質問者

お礼

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

  • f272
  • ベストアンサー率46% (8532/18264)
回答No.1

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

emaxemax
質問者

お礼

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

  • kon555
  • ベストアンサー率51% (1845/3565)
回答No.1

関数で https://qiita.com/mhara/items/82421d1b34e88a3efba1 VBAで http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell_suuji.html ちなみに数字は必ず末尾だけですか? それとも先頭や真ん中、入り乱れるケースもあります?

emaxemax
質問者

お礼

ありがとうございます。

emaxemax
質問者

補足

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

関連するQ&A

専門家に質問してみよう