• ベストアンサー

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

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

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

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (454/691)
回答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/17068)
回答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/17068)
回答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% (454/691)
回答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% (363/1775)
回答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% (363/1775)
回答No.3

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

emaxemax
質問者

お礼

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

  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答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% (8019/17138)
回答No.1

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

emaxemax
質問者

お礼

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

  • kon555
  • ベストアンサー率52% (1754/3367)
回答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

  • テキストデータの中の数字列を抽出したい

    宜しくお願い致します。 テキストデータで漢字やひらがな かたかな 数字の混在している文章から 数字だけ 拾い出したいときに つかうVBAの関数のようなものは あるのでしょうか 例えば5桁の数字のみ 抽出したいなど 喩えば 文章中に 1145 123 11456 116699 14523 他漢字かな混じり文が あるとしまして 5桁の11456 と 14523のみ 見つけ出して 表示する方法は 御座いますか

  • Excel VBA   %の入ったセル

    困りました、、、 VBAを使って A×30%+15000 これが入ったセルB2と たとえば250000が入ったセルB2を掛け算したいのですが (B2の数字は固定ではなくいろいろな数字が入ります) 文字列が入っていることにより うまくいきません 今は仕方なくMid関数で数字を抜き出して使っているのですが なにかよい方法はないでしょうか よろしくお願いします<m(__)m>

  • エクセルVBAでセル選択

    エクセル2000でリストを作成し、VBAで編集しようとしています。 A列に入力されているコードの先頭に「’」をつけて文字列とするための関数をB2のセルからA列のデータが入力されている最後のセルの隣までコピーしたいと思っています。 A列の最終セルを取得するVBAは分かったのですが、その値をB列の選択範囲として使用する方法がわかりません。 エクセルVBAは全くの初心者です。 どなたか教えてください!

  • Excel 2000 で近似値を取得する方法

    1行目がタイトル、2行目から数値のデータがA列~E列まで500行ほどあります。 D列は小数点第3位までの数値が並んでいます。 E列には0から始まって100まで偶数が並んでいます。 E列の数値に一番近い値をもつD列のデータをみて、A列とB列のデータを別シートに書き出したいのですが、 上手くいきません。 試して駄目だった方法は、 VLOOKUP関数:0.815と2.015の場合、2.015の値を取得したいのに0.815のデータになる。 EVEN関数:0.×××が沢山並ぶ場合2になるので比較ができない。 なにか関数で上手く組み合わせてできる方法は無いでしょうか? また、VBAでも可能であれば方法をご教示下さい。 お願いいたします。

  • Excelでセルからの表示形式を取得

    Excelでセルからの表示形式を取得 関数またはVBAで、セルから表示形式を取得するにはどのようにすればいいでしょうか? (標準・文字列など)

  • Excelでセル内の数字だけ取り出したい。

    1セル内に最大40文字程度の半角英数カナが混在しています。 例:1234abcdアイウ3456efghijk これが数千行あるのですが、集計のため数字にしたく、 しかも数字連続と次の数字連続の間にスペースを入れたいです。 例:1234 3456 かなり調べましたが、関数では数字を取り出すだけでも40文字は不可能のように思います。 マクロで置き換えを連続させて文字を消すのは思いつくのですが、 今少しスマートな方法はありますでしょうか?

  • エクセル VBA セル内の文字検索について

    XP microsoft visual basic 6.0 です A1からA10に書かれた文章(平仮名、カタカナ、漢字、数字、記号、含む)の中に 0から始まる半角8桁の数字があれば 取り出し B列に書き出す VBAを用いてこのようなことは可能でしょうか ※8桁の数字は文章内の何文字目にあるか決まっていない ※文章内に0から始まる8桁の数字が複数あることはない、が、0から始まり記号を含む8桁の文字列はある ご教授ください

  • 【Access2003】のクエリにて、半角数字のみを取得したいのですが

    【Access2003】のクエリにて、半角数字のみを取得したいのですが。 とあるカラムに字名が入っています。 "1丁目" "5丁目" "8丁目" "八事" …… このような感じで全角及び半角数字と漢字及びかなが混在しています。 その中から、数字だけを半角にして取り出したいのです、 どんな関数をどのように駆使すればよろしいでしょうか? 上記の場合ですと、 "1" "5" "8" "" …… としたいのですが。 よろしくお願いします。

  • エクセルについて

    どなたかご教示ください。 エクセルで、ある一つのセルに一定の文字列や数値が入力されたら、 それによって、違う列にある、ある一つのセルから横や盾方向に指定した数のセル数まで、一定の文字列や数値が入力される様に、なんて出来ますでしょうか? 小生、関数やVBAなるもの、よくわからないもので申し訳ありませんがよろしくお願いいたします。

  • エクセルでセルの中身が漢字かどうか識別する方法は?

    セルの内容が、数値か、文字列か、空白かどうかは関数で出来るのですが、文字列の場合、それが漢字(ひらがな、かたかな含む)かそうではないのか識別できる関数またはVBAはないでしょうか?

専門家に質問してみよう