- ベストアンサー
エクセルでセル内の数値の取得
エクセル2010です。 A列に文字列と数字の混在データがあります。 たとえばA1~A3に 東京123 大阪22 つくば564 などのデータがあります。 これらの文字列のうち、漢字やかなではない数字を取得したいのです。 漢字やかなの文字数が一定ではないので困っています。 関数でもVBAでもOKです。 ご教示ください
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
単に半角の数字だけを抜き出し、文字列として返す関数でよければ 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 でいかがでしょうか。
その他の回答 (9)
- imogasi
- ベストアンサー率27% (4737/17069)
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行のような例は、無いとして良いのかどうか、質問に書くべき。
お礼
ありがとうございます。 滋賀457-A789のような例や第4行のような例はありません。 そう書くべきでした。すみません。
- imogasi
- ベストアンサー率27% (4737/17069)
質問の表現が不十分ですよ。 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記事になっているよ。
お礼
ご指摘ありがとうございます。 文字列+数字の値のデータです。 ただ、常に文字が先でそのあとに数字です。 すみません。
- HohoPapa
- ベストアンサー率65% (455/693)
HohoPapaです。 注釈の記述が間違っていましたので修正します。 'Chr(0):48 ~ Chr(9):57 誤 'Chr(48):0 ~ Chr(57):9 正
お礼
ご丁寧に、ありがとうございます。
- nishi6
- ベストアンサー率67% (869/1280)
下記の条件でコードを書いてみました。 ・数値の位置は自由。 文字+数字、数字+文字、文字+数字+文字、数字+文字+数字・・・ ・半角数字と全角数字はぞのまま取り出す。 ・抜き出した数字の前ゼロは有効とする 対象の文字列を選択した状態でマクロを実行してください。選択した隣の列に結果を出力します。 全角数字を取り出さない場合は判定箇所を「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
お礼
ありがとうございます。 正しく動きました。
- msMike
- ベストアンサー率20% (364/1805)
[No.3]で提示した式ですが、次のように訂正しておきます。 =MID(A1,MIN(FIND({1,2,3,4,5,6,7,8,9,0},A1&1234567890)),99) 理由:当該式の末尾に「*1」があると、文字列の後の数字部分が 0 から始まる場合にその 0 が表示されなくなるから。
お礼
ご丁寧のありがとうございます。その通りでした。
- msMike
- ベストアンサー率20% (364/1805)
=MID(A1,MIN(FIND({1,2,3,4,5,6,7,8,9,0},A1&1234567890)),99)*1
お礼
ありがとうございます。 なぜ、この式で答えが返るのかわかりませんが、正しく帰ってきました。 ありがとうございます。
- kkkkkm
- ベストアンサー率66% (1734/2604)
こんな感じでいかがでしょう 同じ行の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
お礼
ありがとうございます。 期待通りの動きをしてくれました。
- f272
- ベストアンサー率46% (8532/18264)
A1に文字+数字があるとしたら =LOOKUP(10^17,RIGHT(A1,COLUMN($1:$1))*1)
お礼
ありがとうございます。 なぜ、この式で答えが返るのかわかりませんが、正しく帰ってきました。 ありがとうございます。・
- kon555
- ベストアンサー率51% (1845/3565)
関数で https://qiita.com/mhara/items/82421d1b34e88a3efba1 VBAで http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell_suuji.html ちなみに数字は必ず末尾だけですか? それとも先頭や真ん中、入り乱れるケースもあります?
お礼
ありがとうございます。
補足
数字は必ず末尾だけです。
お礼
お礼が遅くなりました。 正しく関数として機能しました。 ありがとうございます。