ACCESS VBA InStr関数で文字列を検索する方法
ACCESS VBA処理内で、ある文字列の中から特定の文字を検索する際に使用できるのがInStr関数です。
今回はこのInStr関数を使って文字を検索する方法をご説明します。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは使いこなすために少しスキルが必要なものの、うまく活用すればExcelよりも業務の効率化が図れます。
この記事ではACCESSをもっと使いこなしたい方向けにACCESSの関数をご紹介していきます。
構文
InStr関数は以下の構文で使用します。
被検索文字列を開始位置から検索し、検索文字列が見つかった文字の位置(先頭からの文字数)を数値で返します。
見つからなかった場合は0が戻り値となります。
InStr ( [ 開始位置 ] , 被検索文字列 , 検索文字列 , [ 比較方法 ] )
上記の内、[]になっているものは省略可能な引数です。
以下にそれぞれの意味と設定方法をご説明します。
引数 | 説明 |
開始位置 | 検索の開始位置を設定する数式。 省略した場合、先頭の文字から検索されます。 |
被検索文字列 | 検索文字列を探す元となる文字列です。実務で使用する際は変数で指定することが多くなります。 |
検索文字列 | 探したい文字列です。 |
比較方法 | 文字の比較方法です。下記に設定値を示します。 |
比較方法は以下の設定値を使用します。
基本は vbBinaryCompare か vbTextCompare しか使用しないでしょう。
定数 | 値 | 説明 |
vbUseCompareOption | -1 | Option Compare ステートメントの設定を使用して、比較を実行します。 |
vbBinaryCompare | 0 | バイナリの比較を実行します。全角 / 半角、大文字 / 小文字、ひらがな / かたかなを判別します。 |
vbTextCompare | 1 | テキストの比較を実行します。全角 / 半角、大文字 / 小文字、ひらがな / かたかなを判別しません。 |
vbDatabaseCompare | 2 | Microsoft Office Access 2007 のみ。 データベース内の情報に基づいて比較を実行します。 |
利用例
いくつか利用例を示します。
コードに記載の通りに記述して実行すると、戻り値の値が得られます。
コード | 戻り値 | 備考 |
InStr(“ACCESS”, “A”) | 1 | |
InStr(“ACCESS”, “C”) | 2 | 同じ文字が複数ある場合は、最初に見つかった文字位置が返される |
InStr(“ACCESS”, “B”) | 0 | 検索文字列が見つからない場合は0が返される |
InStr(3,”ACCESS”, “C”) | 3 | 3文字目以降で最初に見つかった文字位置が返される |
InStr関数の利用シーン
InStr関数はVBA上でテキストデータを対象に実施するものです。
ACCESSでInStr関数を利用する場合は、テーブルの値を対象にすることはほぼありません。
よく利用するのは、csvデータをACCESSにインポートする前に、テキストデータの段階でデータの整形や修正を行う場合です。
csvデータをACCESSに取り込む場合は、ACCESSが値を自動で判別してデータ型を変更してしまったり、フィールドレイアウトに合わないデータがあると取り込みができないことが多々あります。
こうした場合でもcsv取り込みを自動化させるために、テキスト側でデータの整形処理を行う際に使用することが大半です。
csvを手動で直してからACCESSに取り込んでもよいのですが、それだとどうしても人の手が入るため、ミスやもれ、業務の属人化が発生してします。
自動化するのが業務効率の面でも望ましいでしょう。
サンプルコード
今回はサンプルとして以下のcsvデータを準備しました。
こちらをACCESSに取り込む際に、金額欄の「,(カンマ)」を削除したいと思います。
なぜなら、csvデータはカンマでフィールドの区切りを示すため、金額のカンマがあるとそこで別のフィールドと扱われてしまうのです。
業務用パッケージソフトなどからcsvデータを出力してACCESSに取り込もうとする際、金額にカンマが合ったら要注意です。
上記のデータをメモ帳で開くと下記のようになってしまいます。
本来であれば数字は一つのフィールドとして見せたいのですが、「,」で区切られてしまうのです。
では、金額の「,」を削除する方法を考えましょう。
簡単に考えればReplace関数を使って「,」を消していけばよいだけです。
ただし、「,」の数が固定ではないので、Relplace関数の繰り返し回数が決定できません。
そのため、まずは行ごとに「,」の数を数えていく必要があります。
作成したプロシージャは下記になります。
'csvデータの各行の文字を記録する変数
Dim tmp_line As String
'csvデータの「,」の数を調査する際の文字位置を記録する変数
Dim string_locate As Long
'csvデータ一行に含まれる「,」の数を記録する変数
Dim comma_count As Long
'「'」の数を調査
Do
string_locate = InStr(string_locate + 1, tmp_line, ",")
'「,」が見つからない場合
If string_locate = 0 Then
Exit Do
'「,」が見つかった場合
Else
comma_count = comma_count + 1
End If
Loop
InStr関数を使って、文字列(tmp_line)に含まれる「,」を検索します。
「,」が見つかった場合にはInStr関数の戻り値である文字位置をstring_locateに格納します。
string_locateに値が入っているということは「,」が見つかったということですので、これを判定条件にしてIf文で条件分岐させます。
「,」がない場合は処理終了、「,」が見つかった場合はcomma_count変数に1を足します。
ここでループの最初に戻って、string_locateの次の文字位置から再度InStr関数で検索を開始し、「,」が見つからなくなるまで繰り返します。
最終的にはtmp_lineの最後まで行ってしまうとstring_locate = 0になりますので、ループを脱出します。
この時点でcomma_countに「,」の数が格納されていますので、あとはこれを使ってReplace関数で「,」を削除する処理を作成し、csvファイルの最初の行から最後の行までLoop処理させれば完成です。
Replace関数の使い方についてはこちらの記事をご覧ください。
以上、InStr関数で文字列を検索する方法をご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。
最後までお読みいただき、ありがとうございました。