ACCESS VBA InStr関数で文字列を検索する方法

InStr関数で文字列を検索する方法

ACCESS VBA処理内で、ある文字列の中から特定の文字を検索する際に使用できるのがInStr関数です。
今回はこのInStr関数を使って文字を検索する方法をご説明します。


こんにちは。
はこにわガジェット (@hakoniwagadget) です。

ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは使いこなすために少しスキルが必要なものの、うまく活用すればExcelよりも業務の効率化が図れます。
この記事ではACCESSをもっと使いこなしたい方向けにACCESSの関数をご紹介していきます。

構文

InStr関数は以下の構文で使用します。

被検索文字列を開始位置から検索し、検索文字列が見つかった文字の位置(先頭からの文字数)を数値で返します。
見つからなかった場合は0が戻り値となります。

InStr ( [ 開始位置 ] , 被検索文字列 , 検索文字列 , [ 比較方法 ] )

上記の内、[]になっているものは省略可能な引数です。
以下にそれぞれの意味と設定方法をご説明します。

引数説明
開始位置検索の開始位置を設定する数式。 省略した場合、先頭の文字から検索されます。
被検索文字列検索文字列を探す元となる文字列です。実務で使用する際は変数で指定することが多くなります。
検索文字列探したい文字列です。
比較方法文字の比較方法です。下記に設定値を示します。

比較方法は以下の設定値を使用します。
基本は vbBinaryCompare か vbTextCompare しか使用しないでしょう。

定数説明
vbUseCompareOption-1Option Compare ステートメントの設定を使用して、比較を実行します。
vbBinaryCompare0バイナリの比較を実行します。全角 / 半角、大文字 / 小文字、ひらがな / かたかなを判別します。
vbTextCompare1テキストの比較を実行します。全角 / 半角、大文字 / 小文字、ひらがな / かたかなを判別しません。
vbDatabaseCompare2Microsoft Office Access 2007 のみ。 データベース内の情報に基づいて比較を実行します。

利用例

いくつか利用例を示します。

コードに記載の通りに記述して実行すると、戻り値の値が得られます。

コード戻り値備考
InStr(“ACCESS”, “A”)1
InStr(“ACCESS”, “C”) 2同じ文字が複数ある場合は、最初に見つかった文字位置が返される
InStr(“ACCESS”, “B”) 0検索文字列が見つからない場合は0が返される
InStr(3,”ACCESS”, “C”) 33文字目以降で最初に見つかった文字位置が返される

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関数の使い方についてはこちらの記事をご覧ください。

Replace関数で文字を置換する方法

以上、InStr関数で文字列を検索する方法をご紹介しました。


ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。

そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。

ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

サービス一覧

最後までお読みいただき、ありがとうございました。