ACCESS VBA 文字列から数値のみを取り出す機能
ACCESSでは文字列と数値データは明確に区別されます。
例えば、「test_123」などのように文字列の中に数値が入っている場合に、数値だけを取り出したいときがあります。
今回は、このような場合に使える、文字列から数値のみを取り出す機能をVBAで作成する方法をご紹介します。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは使いこなすために少しスキルが必要なものの、うまく活用すればExcelよりも業務の効率化が図れます。
この記事ではACCESSで実際に作成したフォームやレポートを、その作成方法と共にご紹介していきます。
完成形
最初に、完成形から見ていきましょう。
上記のフォームは、入力欄に入力した値から、数値のみを抽出して数値欄に出力するフォームです。
見ていただくと、上段に入力された値から数値のみが抽出されていることがお分かりになると思います。
フォームの準備
では、作成方法を見ていきましょう。
まずはフォームの準備です。
先ほどのフォームをデザインビューで見てみましょう。
入力と数値のテキストボックスを配置しており、入力テキストボックスの更新後処理にイベントプロシージャを設定してあります。
このイベントプロシージャで、入力欄に入力された文字から数値のみを抽出して、数値欄に入力しています。
VBAプログラミング
次に、上記のイベントプロシージャの内容を見ていきます。
ここには以下のプロシージャを設定してあります。
Private Sub 入力_AfterUpdate()
Dim str_len As Long
Dim tmp_number As String
Dim i As Long
str_len = Len(Me!入力)
For i = 1 To str_len
If IsNumeric(Mid(Me!入力, i, 1)) = True Then
tmp_number = tmp_number & Mid(Me!入力, i, 1)
End If
Next i
Me!数値 = tmp_number
End Sub
内容を見てみましょう。
最初にstr_len変数でMe!入力、つまりフォームで入力されたテキストの値の文字数を格納しています。
str_len = Len(Me!入力)
その上で、ループ処理を使ってMe!入力文字の桁数分だけ処理を繰り返します。
For i = 1 To str_len
この際の繰り返し回数を図るために、最初にMe!入力の文字数を調べているのです。
ループ処理では1文字ずつ数値か否かの判定を行っており、この際に利用しているのがIsNumeric関数です。
IsNumeric関数は引数に指定した値が数値ならTrue、それ以外ならFalseを返す関数です。
If IsNumeric(Mid(Me!入力, i, 1)) = True Then
IsNumeric関数の引数としてMe!入力の文字を1文字ずつ取り出すようにMid関数を使っています。
変数iが1ずつ増えていきますので、これをMid関数の2つ目の引数である開始文字位置に利用し、ループを繰り返すごとに文字を1つずつ移動させながらIsNumeric関数の引数に指定しているのです。
数値だった場合は以下の処理を行います。
tmp_number = tmp_number & Mid(Me!入力, i, 1)
tmp_numberは最終的に数値データのみにした値を格納するための変数です。
この変数に対して、Mid関数を使って先ほどのIsNumeric関数でチェックしたものと同じ値を入れていきます。
この際、ループ処理でチェックした値を蓄積していくために、すでにあるtmp_numberに&でつないでいく処理となっています。
ここでtmp_numberの変数宣言部分を見てください。
Dim tmp_number As String
普通に考えるとtmp_numberは数値なのでLong型で宣言しそうなものです。
しかし、String、つまりテキスト型で宣言しています。
これは、数値型の変数にすると上記のループ処理で値を蓄積する際に桁数を考えなければならなくなるのが面倒だからです。
例えばtmp_numberにすでに「1」という値が入っている際、次のループ処理で「2」がこれば、tmp_numberの値は「12」になるのが正解です。
しかし、数値型で単純に足すと「3」になってしまいます。
これを防ぐためには「1」に10をかけて「10」にしたうえで「2」を足す処理が必要です。
これだけなら単純ですが、問題は最終桁数が何桁になるかわからないので、さらにその次に「3」が足された場合は、「1」に100を掛け、「2」に10を掛け、「3」を足すという処理が必要になるのです。
実現はできますがコードが複雑になってきます。
そこでACCESSではテキスト型データでも数値に見えるものは数値としても扱えるという微妙な仕様を利用して、上記のように値を蓄積する際はテキスト型データとして利用し、最終的にはそれを数値型のテキストボックスに代入して数値変換する方法を採っているのです。
以上、文字列から数値のみを取り出す機能をご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。
最後までお読みいただき、ありがとうございました。