• 締切済み

数字だけを取り出す関数

仕事で使用するための関数を教えていただきたいのですが、メールなどで数字の報告を受けるときに、文章から数字だけを取り出す方法はありますか? メール本文には開始数()受注数()・・・という具合で()の中に数字が入力されて受信します。現状は、何文字目以降の文字を取り出すという関数で抽出していますが、開始数(マイナス5)など()の中に文字が入ってしまっている場合には数字だけ取り出すことができずに悩んでいます。 エクセルの関数BOOKなどを読んでみましたが、なかなか適した関数がみつかりませんでした。 アドバイスよろしくお願いします。

みんなの回答

  • arata
  • ベストアンサー率49% (139/279)
回答No.8

プロロシージャと関数の入ったブックをあげておきました。 参考にしてください。

参考URL:
http://www.onetwo.jp/GetNum.lzh
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.7

#6です。 エクセルのシートの1セル内に( )が1組しかないとき、()内の数字を取り出す関数 =VALUE(MID(A6,FIND("(",A6)+1,FIND(")",A6)-FIND("(",A6)-1)) これが役に立たないかやってみてください。 (例)A6セル 今月の実績は(-123)です 結果 -123

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.6

・関数とかエクセルの言葉が見えるので、エクセルの質問ですか。考えているソフトは明確にしないと答えが明確になりません。 ・エクセルだとして >メールなどで数字の報告を受けるときに これではどのセルにどのように値・文章が入っていますか。明確に伝わりません。 ・数字は()の中に必ず入っているなら、(から)までということで1セルあたり1つなら関数抜きき出せそうです。 1文に2つ以上あると、関数では、別の位置で繰り返しができないのでお手上げです。 ・1セル全体が数値かどうか(-も含め)なら、=ISNUMBER関数があります。 ・正面きってー、0-9で判別しようとすると 既回答のようにVBAのユーザー関数になります。 ・OSやソフトに[0-9]と表現して0から9まで のどれかに該当すれば・・という使い方ができるものもありますが数字の塊を抜き出すのは不可能では(自信なし) ・当面は少しの勉強で実現するのは、VBAのユーザー関数しかないように思います。それも考えている単位で1箇所抜き出しでしょう。 ・それ以上は、全文字を1字ずつ判別してゆき、0-9、-か判別し、かつ固まり(数字のつながり)を判別して行くプログラムになります。 1文字n判別も、文字コードによると1バイト2バイト文字があったりして、初心者には手ごわいように思います。

  • arata
  • ベストアンサー率49% (139/279)
回答No.5

そうです。マクロですね。 作り方ですが、私が使っているのがOffice2000なので、若干違うかもしれませんが、その辺はご勘弁ください。 1.新規で、ブックを作成してください。  (新規じゃなくてもいいですけどね) 2.メニューの[ツール]-[マクロ]-[Visual Basic Editor]を選択 (シート下部のタブ(シート名があるところ)の上で右クリックして、[コードの表示]を選択でもよい 3.メニューの[挿入]-[標準モジュール]を選択 4.開いたコードウインドウに、紹介したVBAの関数コードを貼り付けてください。 貼り付ける範囲は、 Function GetNum1(p_Range As Variant, p_Str As String) As Variant から End Function までです。 ANo.2の方もやってみたければ、 Sub 数字取り出し() から End Sub まで貼り付けてください。 以上を行ったら、Visual Basic Editorを閉じてOKです。 あとは、エクセルのブックで試してみてください。 ANo.4の方は、 -------------------------- A5に”開始数(20)受注数(マイナス200)"が入っている場合 セルに =GetNum1(A5,"開始数") =GetNum1(A5,"受注数") を設定すると(どこのセルでもよい) それぞれ20、-200が返却されます。 -------------------------- のようにすると動作しますが、ANo.2の方は操作が必要です。 1.ブックの一番左のシート(名前を変えてなければSheet1ですね。)のA1に抽出元の文字列を貼り付けます。 2.メニューの[ツール]-[マクロ]-[マクロ...]を選択 3.マクロ名の一覧に”数字取り出し”がありますので、これを選択して実行ボタンを押下 A1に”開始数(20)受注数(マイナス200)"を入れた場合は、A2に開始数、B2に20、A3に受注数、B3に-200が入るはずです。

  • arata
  • ベストアンサー率49% (139/279)
回答No.4

もうひとつおまけ これもVBAですが、関数タイプです。 指定したセルに入っている文字中から指定した文字列の直後の数字を返します。 例えば、A5に”開始数(20)受注数(マイナス200)"が入っている場合 =GetNum1(A5,"開始数") =GetNum1(A5,"受注数") とすると、それぞれ20、-200が返却されます。 Function GetNum1(p_Range As Variant, p_Str As String) As Variant Dim strText As String Dim i As Integer '処理対象の文字列をstrTextに設定 strText = p_Range 'マイナスを-に置き換え strText = Replace(strText, "マイナス", "-") '全角()を半角に strText = Replace(strText, "(", "(") strText = Replace(strText, ")", ")") 'スペースを削除 strText = Replace(strText, " ", "") strText = Replace(strText, " ", "") i = InStr(strText & "(", p_Str) If i > 0 Then GetNum1 = Val(Mid(strText, i + Len(p_Str) + 1)) Else GetNum1 = "" End If End Function VBAの設定の仕方がわからない場合は、また聞いてください。

a-ranranran
質問者

補足

回答ありがとうございます。 あまり詳しくないので更に質問を重ねてしまうようで申し訳ないのですが、VBAとはどのようなものなのでしょうか? 少し自分なりに調べてみましたが、マクロなどのようなものでしょうか? セルA1に"開始数(20)受注数(マイナス200)"を入力してマクロに下記を登録してみましたがうまく動きませんでした。 Dim rng As Range Dim strText As String Dim txtSplit As Variant Dim i As Integer Dim posMinus As Integer Set rng = ThisWorkbook.Worksheets(1).Range("A1") 私の設定方法が間違っているのかもしれませんよね。。。

  • bob_n
  • ベストアンサー率35% (610/1732)
回答No.3

一文字ずつ読んでいき 0~9が出てきたらその位置以降を取り出すようにするればいいと思います。

a-ranranran
質問者

お礼

アドバイスありがとうございます。 この作業は、実にメールが100件/日以上にも上るため、メールを1通ずつ読む作業は不可能なのです。。。

  • arata
  • ベストアンサー率49% (139/279)
回答No.2

関数じゃないとダメですか? A1に対象文字で、A2から下に取り出した文字を出力します。 Sub 数字取り出し() Dim rng As Range Dim strText As String Dim txtSplit As Variant Dim i As Integer Dim posMinus As Integer Set rng = ThisWorkbook.Worksheets(1).Range("A1") 'A1の文字列をstrTextに設定 strText = rng.Value 'マイナスを-に置き換え strText = Replace(strText, "マイナス", "-") '全角()を半角に strText = Replace(strText, "(", "(") strText = Replace(strText, ")", ")") '文字列を)で分割 txtSplit = Split(strText, ")") If UBound(txtSplit) = -1 Then Exit Sub End If For i = 0 To UBound(txtSplit) '(の位置を取り出し posMinus = InStr(txtSplit(i), "(") '(より左の文字列を設定 If posMinus > 1 Then rng.Offset(i + 1, 0).Value = Left(txtSplit(i), posMinus - 1) End If '(より右の文字列を取り出して設定 If posMinus > 0 And posMinus < Len(txtSplit(i)) Then rng.Offset(i + 1, 1).Value = Val(Mid(txtSplit(i), posMinus + 1)) End If Next End Sub

回答No.1

例として Excel を挙げられていますので、VBA だとすると・・・ 最近の Excel は正規表現を扱えるようなので、これを使って数値部分だけを抜き出すのが一番スマートかと思います。 参考 URL をどうぞ。

参考URL:
http://www.officetanaka.net/excel/vba/tips/tips38.htm
a-ranranran
質問者

補足

回答ありがとうございます。 VBAというものを知らないため、もう少し勉強しなければなりません。

関連するQ&A