ちょっと先の未来クイズ第4問

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

A 回答 (5件)

#1です。


先に投稿した関数の補足ですが、
私には、質問文からは、Excel なのか Access なのか、または Word のVBAなのかとかは判断がつきませんでしたので、
単に、「文字列から指定桁の数値のみ抜き出して返す」関数です。
(質問文の「見つけ出して表示する」という表現ではよく分からないので、
とりあえず、見つけ出した数値をすべてカンマ区切りにした文字列を返すことにしました)

なので、例えば検索文字列(第1引数)を「wtあ1234あい亜阿12345お6789」、桁数(第2引数)を「4」と指定した場合、「1234,6789」が返り、
桁数を「5」にすると「12345」が返るというだけのものです。

以上、補足でした。
    • good
    • 0
この回答へのお礼

ありがとうございます
当初の お聞きしたいことが
すべて満たされて おります
質問の表現が 曖昧で
ご迷惑お掛けしました

お礼日時:2008/04/14 10:55

ちょっとインチキな関数


以下は文字列中にある全ての数字列を配列で返す関数です。

Function GetNumericArray(ByVal Text)
Dim Script
Dim RegExp
Dim Temp As String
'==Scriptオブジェクトを作成する
Set Script = CreateObject("ScriptControl")
Script.Language = "VBScript"
'==正規表現オブジェクトを生成する
Set RegExp = Script.Eval("new RegExp")
'==前方と後方の非数字を除去する
RegExp.Global = True '★全体にパターン検索することを指定
RegExp.Pattern = "^\D+|\D+$" '前方に連続する非数字 or 後方に連続する非数字
Temp = RegExp.Replace(Text, "") '空文字列に置き換える
'==途中の非数字をカンマにする
RegExp.Pattern = "\D+" '連続する非数字
Temp = RegExp.Replace(Temp, ",")
'==カンマで区切って配列にする
GetNumericArray = Split(Temp, ",")
End Function

'===使用例
Dim X, Y
X = GetNumericArray("今日は2008年(平成20年)4月21日です")
For Each Y In X
  Debug.Print Y
Next

戻り値は文字型データの配列になっています。この中から桁数や数値範囲などで、目的のものを見つけます。
話は変わりますが、正規表現をScriptControlを使わずに求める方法を知っている人がいたら、是非そのやり方を教えてほしいものです。
    • good
    • 0
この回答へのお礼

詳しいご解説 誠に 有り難うございました。
今後とも 宜しくお願い致します。

お礼日時:2008/04/23 11:15

質問は#2のご回答のような内容ではないと思う。


質問の書き方が悪いからそういうことにもなる。
ーー
数字・漢字・かなの混じった文字列がセル(A列でよいのかな、複数列かな)にある。
数字だけ、数字の固まりだけ、抜き出すVBの関数はない。
1文字が数字かどうかの判別は出来ても、
(A)文字コードを判別
(B)IsNumeric関数利用
など
「数字の連なり(切れ目)」は自分で割り出すロジックを生みださないといけない。
>5桁の11456 と 14523のみ 見つけ出して 
ここが紛らわしい表現だ。
5桁の数字のものを書き出したいではないの。
11456と例で修飾をつけるから、指定した数字列だけ出せばよいのと思っちゃう。
もしそれなら存在するセルの番地等が必要(求めるもの)になるでしょう。
    • good
    • 0
この回答へのお礼

ご指摘の通りで
御座います

質問の表現が 曖昧で
諸氏先生方には
ご迷惑お掛けしました

お礼日時:2008/04/14 10:58

instr が使えると思います。


ある文字列 (string1) の中から指定した文字列 (string2) を検索し、最初に見つかった文字位置 (先頭からその位置までの文字数) を返す文字列処理関数です。
例えばBunという文字列の中に14523が在るかどうか調べるには
InStr(Bun, "14523")
となります。もし、在ればその位置がこの関数の値になります。
    • good
    • 0
この回答へのお礼

ありがとうございます

質問の表現が 曖昧で
すみません

このたびの貴殿の
御回答も
学習させて 頂きます

お礼日時:2008/04/14 10:59

そのような組込関数はありませんので、自分で関数を作るしかありません。


一文字づつ見ていけばいいと思います。

以下、例です。
何を返せばいいのか不明(数値の配列?、文字列?)なので、文字列(数値をカンマ区切り)を返す関数を考えてみました。

Private Function searchExNum(strSearch As String, nNumLen As Integer) As String
Dim nLen As Long
Dim n As Long
Dim i As Integer
Dim sss As String
Dim s As String
Dim sRet As String
searchExNum = ""
If nNumLen < 0 Then Exit Function
sss = strSearch & "a"
nLen = Len(sss)
i = 0
n = 1
Do While n <= nLen
s = Mid(sss, n, 1)
If IsNumeric(s) Then
i = i + 1
Else
If i = nNumLen Then
If Len(sRet) > 0 Then sRet = sRet & "," 'カンマで区切ることに
sRet = sRet & Mid(sss, n - nNumLen, nNumLen)
End If
i = 0
End If
n = n + 1
Loop
searchExNum = sRet
End Function


※この関数の呼び出し例(第2引数の「5」は桁数の指定です)
MsgBox searchExNum("erq23aefawefae333334df33345faf56789", 5)
    • good
    • 0
この回答へのお礼

詳細な ご回答
有り難うございました。
活用させて頂きます

お礼日時:2008/04/14 11:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報