文字列から数字だけを抽出する

 文字列から数字のみを取り出すというとVal関数が思いつきますが、数字以外の文字が含まれているとそれ以降は取り出してくれないなど、使い勝手はかなり限られたものです。一方、CInt関数やCLng関数を使えば\やカンマは取り除けますが漢字などが含まれているとエラーとなってしまいます。
 そこで文字列に含まれる数字だけをすべて抽出する、ということを各種関数の組み合わせで実現してみます。
 ただし、この方法では文字列が長い(57文字以上)とエラーになりますのであしからず;_ _)

f:id:accs2014:20170701134136p:plain:right:w550

 例としてこのようなテーブルを用います。対象となるのは「住所」列です。半角数字と全角数字、漢字ひらがな、英字、記号が混在しており、手作業で数字を取り出すのもなかなか困難です。
 この列から、全角数字と半角数字をすべて(半角数字として)抽出します。最初の数字が0であっても消さずに取り出します。


f:id:accs2014:20170711002630p:plain:right:w600

 クエリデザインです。
 次のような列を設けます。



数字のみ: Eval(Replace(Replace(Format([住所],Replace(String(Len([住所]),"&"),"&","{&}")),"{","Mid(Val(1 & StrConv('"),"}","',8)),2)&") & "''")

※式中で中括弧({})を用いている関係上、対象となる文字列に中括弧が含まれている場合は式中の中括弧を別の記号に置き換えるなどの対策が必要です。


f:id:accs2014:20170711002627p:plain:right:w550

 データシートビューです。無事にすべての数字が取り出されていることがわかります。


f:id:accs2014:20170711002622p:plain:right:w600

 さて、上記の式だけを見ても訳が分からないと思われますので少し補足しますと、Format関数により1文字ずつ区切り、Mid関数等の組み合わせにより数字だったらそのまま、数字以外は空文字列にしてくっつけるということをしています。
 なお、最も外側にあるEval関数を取り除いた時の出力はこのようになりますので参考まで。