ACCESS Replace関数で文字を置換する方法(VBAコード公開)

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

ACCESSで文字列を一定のルールに沿って置換する際に使用するのがReplace関数です。
Replace関数の機能と実務での利用シーンをご紹介します。


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

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

構文

Replace ( 置換前の文字列全体 , 置換対象文字列 , 置換後文字列 , 検索開始位置 , 置換回数 , 比較方法 )

引数は多いですが、比較的理解しやすい構文でしょう。

日本語で記載すると、

「①置換前の文字列全体」を対象に、
「④検索開始位置」から
「⑤置換回数」分だけ
「⑥比較方法」に基づいて、
「②置換対象文字列」を
「③置換後文字列」に変換する、

となります。

それぞれの引数の意味を解説します。

引数説明
置換前の文字列全体置換対象の文字列や文章全体を指定します。実務では直接テキストを指定するよりは、変数で指定する場合が多いでしょう。
置換対象文字列置換する対象の文字を指定します。上記の置換前の文字列全体に含まれる置き換える文字です。
置換後文字列置換対象文字列を置き換えたい、結果の文字列です。
検索開始位置置換対象文字列の検索を開始する位置です。省略可能で、省略すると「置換前の文字列全体」の最初から検索します。
置換回数置換を行う回数です。省略可能で、省略した場合は可能な置換を全て行います。実務では省略することが多いでしょう。
比較方法文字列の比較方法です。詳しくは後述します。

最後の引数である比較方法は以下のパターンがあります。
デフォルト値は-1ですが、バイナリとテキストのどちらで比較するかだけを意識しておけばよいでしょう。

定数説明
vbUseCompareOption-1Option Compare ステートメント(モジュールの先頭の記述する、文字列の比較方法を規定するステートメント)の設定を利用して比較。
vbBinaryCompare0バイナリモーで比較。大文字 / 小文字、全角 / 半角、ひらがな / カタカナを区別して比較。
vbTextCompare1テキストモーで比較。大文字 / 小文字、全角 / 半角、ひらがな / カタカナを区別せず比較。
vbDatabaseCompare2Microsoft Office Access 2007 のみ。 データベース内の情報に基づいて比較。

利用例

では実際の利用例を見てみましょう。

ここでは「base_string」という変数に、「ああいいううええおお」という文字列が入っている前提です。

置換前置換内容構文置換後
ああいいううええおお「い」を「き」に変更Replace(base_string, “い”, “き”)ああききううええおお
ああいいううええおお「あ」を一度だけ「か」に変更Replace(base_string, “あ”, “か”, 1, 1)かあいいううええおお
ああいいううええおお2つ目のうだけを「く」に変更Replace(base_string, “う”, “く”, 6, 1)くええおお

Replace関数を利用したcsvファイルの文字置換

ACCESSには標準機能で更新クエリがあります。
更新クエリを使えばデータベース内の特定の文字を検索して置換することができますので、あえてReplace関数を使う必要はありません。

では、どんな時にRepalce関数を使用するかというと、データベースに入れる前のデータを扱う際に使用することが多いです。
具体的には、csvからACCESSへデータをインポートする前の、テキスト上でのデータ整形処理で最もよく利用します。

例えば、下記のようにimp_txtというcsvファイルを、IMP_TBLというテーブルに取り込みたいとします。

しかし、imp_txtの一行目(フィールド列)の文字に「/」が入っていました。
ACCESSのフィールド名にこのような特殊文字が入るとうまく動作せず、エラーの原因となります。

そこで、取り込み前にReplace関数を使って、「/」を置換して除去する、という処理をしています。


'変数定義
Dim FSO As Object
Set FSO = CreateObject("scripting.FileSystemObject)
Dim filepath As String
Dim file_name As String
Dim imp_file As Object
Dim exp_file As Object
Dim tmp_txt As String
Dim tmp_line As String
Dim file_name As String

'ファイル指定
filepath = "C:import"
file_name = "test.csv"

'テキストの読み込み
Set imp_txt = FSO.openTextFile(filepath & "\" & file_name & "_", ForReading)
                    
  '一行目(フィールド列)の読み込み
  tmp_line = imp_txt.ReadLine
                        
  '「/」の置換処理
  tmp_line = Replace(tmp_line, "/", "", 1)
  tmp_txt = tmp_line

  '二行目以降の読み込み
  Do Until imp_txt.AtEndOfStream

    '一行読み込み
    tmp_line = imp_txt.ReadLine

    '一行分追加
    tmp_txt = tmp_txt  & vbCrLf & tmp_line

  Loop

    '出力用ファイル作成
    Set exp_file = FSO.createTextFile(filepath & "\" & file_name & "_exp", True)

  'ファイル書き込み
  exp_file.Write tmp_txt
  exp_file.Close

'ACCESSへのインポート処理
DoCmd.TransferText acImportDelim, "インポート定義", "IMP_TBL", filepath & "\" & file_name & "_exp", False

処理を解説しましょう。
まず処理全体としてはACCESSにインポートする前のcsvファイルを操作しますので、FileSystemObjectを使用します。

csvファイルの内容を imp_txt という変数に読み込みます。
そして、tmp_line という変数に ReadLine メソッドを使って、csvファイルを一行ずつ読み込んでいきます。


tmp_line = imp_txt.ReadLine

読み込み後に、1行目のみReplace関数で「/」を削除する処理を行っています。


tmp_line = Replace(tmp_line, "/", "", 1)

そして、変更した tmp_line の内容を、テキストデータの蓄積用変数である tmp_txt に一行ずつ書き込んでいきます。


tmp_txt = tmp_line

2行目以降は特に処理をしていませんが、Do Loop構文で、一行読み込み→一行追加を繰り返して、 tmp_txt にデータを入れていきます。


  Do Until imp_txt.AtEndOfStream

    ’一行読み込み
    tmp_line = imp_txt.ReadLine

    ’一行分追加
    tmp_txt = tmp_txt & vbCrLf & tmp_line

  Loop


最後に、出来上がった tmp_txt を出力用ファイルである exp_file に書き込み、ACCESSへのインポート処理を行います。


exp_file.Write tmp_txt
exp_file.Close

'ACCESSへのインポート処理
DoCmd.TransferText acImportDelim, "インポート定義", "IMP_TBL", filepath & "\" & file_name & "_exp", False

以上、Replace関数で文字を置換する方法をご紹介しました。


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

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

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

サービス一覧

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

コメントを残す

メールアドレスが公開されることはありません。