プログラミング

【VBAで文字列を一括置換】複数のテキストファイルを1回で変更

  • このエントリーをはてなブックマークに追加
  • LINEで送る

あなたは日々のお仕事で

『テキストファイルの中身をチョット置換したいだけ』

なんだけど…

『置換するファイル数が膨大でウンザリ!』

といった経験はないでしょうか?

こんな時は、プログラムで一気に置換してサッサと仕事を終わりたいですよね!

サッサと終わる手段として、職場でインストールされてるExcelのVBAが使えます。

『VBAでテキストファイルを一括置換する方法は?』

こんな疑問に答えます。

SE歴25年のオッサンが解説するぞい!
SEおっさん
SEおっさん



スポンサーリンク

VBAのReplace関数文字列の置換

VBAで文字列を置換したい場合は、Replace関数を使用します。

テキストファイル内の文字列や、Excel内の文章の一括置換もReplace関数で置換できます。
※オートシェイプ図形のテキスト文字はReplace関数で置換できません。一括置換したい場合はこちら
 【VBAで文字列を一括置換】Excelのセルとオートシェイプ図形

たろちゃん
たろちゃん
Replace関数を使って文字を置換するんだね!
Replace関数の基本形

置換後の文字列 = Replace(置換前の文字列, 検索文字列, 置換文字列)

戻り値
  • 戻り値:置換後の文字列
SEおっさん
SEおっさん
大文字・小文字等を区別は、
引数6番目の比較するモード[compare]で設定するぞい
引数

【必須】

  • 引数1:expression
    置換前の文字列
  • 引数2:find
    検索する文字列
  • 引数3:replace
    置換する文字列

【任意:省略可】

  • 引数4:start
    検索の開始位置
    既定値:1(1文字目から開始)
  • 引数5:count
    置換する回数
    既定値:-1(全て置換)
  • 引数6:compare
    比較するモード
    既定値:vbBinaryCompare(大文字・小文字などを区別)

Replace関数:文字列の置換の使用例

Replace関数の使用例も欲しいナ…
たろちゃん
たろちゃん
SEおっさん
SEおっさん
使用例を紹介するぞい

使用例1(必須引数のみ)

置換結果 = Replace("abcde", "bc", "XY")

置換結果は”abXYe”となります。

使用例2(必須引数のみ)

置換結果 = Replace("abcde", "BC", "XY")

置換結果は”abcde”となります。

必須引数のみの場合、バイナリモードで比較します。

バイナリモードは大文字・小文字を区別するモードです。

検索する文字列”BC”に対し、置換前の文字列には小文字の”bc”しか存在しませんので、検索対象外となり置換されません。

使用例3(任意引数あり)

次に指定が任意である引数6「比較モード(compare)」を指定する使用例を紹介します。

以下、比較モード(compare)の設定例です。

置換結果 = Replace("abcde", "BC", "XY", compare:=vbTextCompare)

置換結果は”abXYe”となります。

良く使う比較モードは2つのみ。他は覚えなくてOK。

比較モード:compare
  1. vbBinaryCompare:バイナリモードで比較
    半角と全角、ひらがなとカタカナ、アルファベットの大文字と小文字を区別する
  2. vbTextCompare:テキストモードで比較
    半角と全角、ひらがなとカタカナ、アルファベットの大文字と小文字を区別しない

Replace関数は引数を設定しなければ、半角・全角などを区別するバイナリモード置換します。

半角・全角、大文字・小文字を区別をしたくない場合は、引数のcompareをvbTextCompareに指定します。

4番目の引数にvbTextCompareを設定していますが…

6番目の引数の名前である”compare:=”と指定することで「引数6:比較方法」であることを認識させます。

任意引数の名前指定は、ちょっとしたテクニックです。

SEおっさん
SEおっさん
Replace関数は理解できたかのぅ


スポンサーリンク

VBAで複数のテキストファイルから文字列を一括置換する

VBAで文字列を置換するにはReplace関数を利用しますが、テキストファイル内の文字列を置換してファイル出力するためには、テキストファイルの操作が必要です。

VBAでテキストファイルを操作する方法は2つあります。

  1. ステートメントを使用する
  2. FileSystemObjectを使用する

ここでは、シンプルなステートメントを使用する方法を紹介します。

ステートメントって何?
たろちゃん
たろちゃん
SEおっさん
SEおっさん
ステートメントは命令の構文という意味じゃ
あまり深く考えなくて良いぞ

テキスト内の文字列を置換してファイル出力には、テキストファイル操作ステートメントとReplace関数を使用します

以下、テキスト内の文字列を一括置換してファイル出力する流れです。

一括置換といっても、内部処理としては1行ずつ処理します。

最終的に、一括置換してファイル出力される動きになるんです。

  1. 入力ファイルを開く
  2. 出力ファイルを開く
  3. 入力ファイルから1件を読み込む
    最終行まで繰り返す
  4. 読み込んだ文字列を置換する
  5. 出力ファイルへ置換文字列を書き込む
  6. 入力ファイルを閉じる
  7. 出力ファイルを閉じる
やること結構いっぱいあるね
たろちゃん
たろちゃん
SEおっさん
SEおっさん
1つ1つは簡単じゃよ
いまから詳しく説明するぞい

VBAでテキストファイルを操作するステートメント(命令)と順番

VBAでテキストファイルを操作する手順と使用するステートメントです。

テキストファイルを操作する手順
  1. テキストファイルを開く
    Openステートメント
  2. データを読み込む/書き込む
    Line Inputステートメント(読む)
    Printステートメント(書く)
  3. テキストファイルを閉じる
    Close ステートメント

Openステートメント(テキストファイルを開く)

テキストファイルを開く処理はOpenステートメントを使います。

ファイル操作で最初に行う処理です。

Open ステートメントの書式

Open [ファイルの場所] For [開くモード] As #[ファイル番号]

[ファイルの場所]

ファイルを開く場所です。
ダブルクォーテーションで囲った文字列で指定します。

[開くモード]

ファイルを開くモードです。

  • Input
    入力モード(読み込みで使用)
  • Output
    出力モード(書き込みで使用)
  • Append
    追加モード(書き込みで使用)

OutputもApeendも書き込みで使用しますが、以下の違いがあります。

  • Output…既存データは無視して書き込み
  • Append…既存データに追記して書き込み
たろちゃん
たろちゃん
読み込むファイル or 書き込むファイルは
開くモードで設定するんだね
[ファイル番号]

ファイル番号は開くファイルをプログラム上で特定させるために使用します。

このように他には存在しない値のことを、ユニーク値といいます。

未使用の番号を設定し、#(シャープ)を先頭に付与します。

一般的にはFreeFileで空いているファイル番号を取得します。
⇒ファイル番号はユニーク値

変数xにファイル番号を格納する例

'変数xに空いているファイル番号を格納
dim x as integer
x= FreeFile
SEおっさん
SEおっさん
Openステートメントは理解できたかのぅ

Line Inputステートメント(データを読む)

テキストファイルからデータを1行読み込む処理は、Line Inputステートメントを使います。

読み込みは、先頭行から最終行まで順番に1行ずつ順番に処理されます。

テキスト内の全行を読み込むには…

行数の数だけLine Inputステートメントを呼び出す必要があるということです。

Line Inputステートメントの書式

Line Input #[ファイル番号], [変数]

[ファイル番号]

Openステートメントで設定したファイル番号を指定します。

ファイル番号は開いたファイルを特定する番号です。

つまり、特定できるファイル番号を指定すると…

『どのファイルを対象に処理したら良いかわかる』という訳です。

この考え方は、次で説明するPrintステートメントでも、Closeステートメントでも同じです。

[変数]

開いたテキストファイルから1行を読み込んだ文字列が格納されます。

たろちゃん
たろちゃん
Line Inputステートメントは入力ファイルで使うんだね!

Printステートメント(データを書く)

テキストファイルへデータを1行書き込む処理は、Printステートメントを使います。

Print ステートメントの書式

Print #[ファイル番号], [データ]

[ファイル番号]

Openステートメントで設定したファイル番号を指定します。

[データ]

テキストファイルへ書き込むデータを設定します(変数でもOK)

SEおっさん
SEおっさん
Printステートメントは出力ファイルで使うんじゃ

Closeステートメント(テキストファイルを閉じる)

テキストファイルを閉じる処理はCloseステートメントを使います。

Close ステートメントの書式

Close #ファイル番号

[ファイル番号]

Openステートメントで設定したファイル番号を指定します。

たろちゃん
たろちゃん
Closeステートメントは簡単だね!

例1)VBAでテキストファイルを開いて読み込む

VBAでファイルを開いて読み込むサンプルです。

'ファイルを開いて読み込むサンプル
Dim ni as integer
Dim v as string

'// ファイル番号取得
ni = FreeFile

'// シーケンシャル入力モードでファイルを開く
Open "D:sample_input.txt" For Input As #ni

'// 入力ファイルのEOFまでループ
Do Until EOF(ni)

    '// 入力ファイルの行を読み込み
    Line Input #ni, v

    '// VBAのイミディエイトウィンドウに読み込んだ行を表示
    Debug.Print v

Loop

'// ファイルを閉じる
Close #ni
SEおっさん
SEおっさん
Debug.Print文はVBA開発環境のみ表示されるコマンドじゃ
イミディエイトウィンドウと呼ばれるエリアに表示される
イミディエイトウィンドウはCtrl+Gキーで表示されるぞい

例2)VBAでテキストファイルを開いて書き込む

VBAでファイルを開いて書き込むサンプルです。

'ファイルを開いて書き込むサンプル
Dim no as integer

'// ファイル番号取得
no = FreeFile

'// シーケンシャル出力モードでファイルを開く
Open "D:sample_output.txt" For Output As #no

'// 出力ファイルのデータを書き込み
Print #no, "abcdef"
Print #no, "ghijkl"
Print #no, "mnopqr"

'// ファイルを閉じる
Close #no
SEおっさん
SEおっさん
テキストファイル操作のステートメントは理解できたかのぅ

次は、テキスト操作と置換操作を組み合わせた一括置換のコードをご紹介します。

VBAでテキストファイルの文字を一括置換するサンプルコードとフローチャート

VBAでテキストファイルの文字を一括置換して出力する関数(サンプルソース)とフローチャートです。

ソースコードを見ても理解できない時、フローチャートが理解を助けてくれます。

プログラミング初心者にフローチャートは必要【実証済のメリット5つ】

【記号は5つ】フローチャートの書き方【初心者向け簡単マニュアル】

VBAでテキストファイルの文字を一括置換して出力するフローチャート

VBAでテキストファイルの文字を一括置換して出力フローチャートです。

入力ファイルが終端か確認しながら1行づつ読み込んで、置換後の文字列を出力します。

たろちゃん
たろちゃん
フローチャートは理解しやすいね!

VBAでテキストファイルの文字を一括置換して出力する関数

VBAでテキストファイルの文字を一括置換して出力のサンプルソースです。

関数名は(CNV_TXTFILE)としています。

#サンプルソースはGithubにあります。

'入力ファイルから出力ファイルへ文字列を置換して出力する関数
'引数1:入力ファイルパス
'引数2:出力ファイルパス
'引数3:置換前文字列
'引数4:置換後文字列
Private Sub CNV_TXTFILE(ByVal path_i  As String, ByVal path_o As String, search_str As String, replace_str As String)
    
    Dim ni as integer
    Dim no as integer
    Dim v  as string

    '// ファイル番号取得(入力ファイル)
    ni = FreeFile
    
    '// ファイルを開く(入力モード)
    Open path_i  For Input As #ni
    
    '// ファイル番号取得(出力ファイル)
    no = FreeFile

    '// ファイルを開く(出力モード)
    Open path_o For Output As #no

    '// 入力ファイルの終端までループ
    Do Until EOF(ni)
        '// 入力ファイルの読み込み(1行)
        Line Input #ni, v
        '// 読み込んだ文字列を置換
        v = Replace(v, search_str, replace_str)
        '// 出力ファイルを書き込み(1行:置換済)
        Print #no, v
    Loop
    
    '// ファイルを閉じる(入力ファイル)
    Close #ni
    '// ファイルを閉じる(出力ファイル)
    Close #no

End Sub

上記の自作関数(CNV_TXTFILE)の呼び出し例です。

call CNV_TXTFILE("D:sample_input.txt", "D:sample_output.txt", "おはよう", "こんにちは")

sample_input.txtに記載された全ての”おはよう”を”こんにちは”に置換してsample_output.txtに出力します。

 

 

複数ファイルの文字列を置換する場合
引数1番目のファイルパスだけ変更して、ファイルの数だけ自作関数(CNV_TXTFILE)呼び出せばOKです。

SEおっさん
SEおっさん
ここまでが、
VBAでテキストファイル内の文字列を一括置換して出力する方法じゃよ
わかったかのぅ

Excelファイルのセル文字や図形を一括置換したい場合はこちら

【VBAで文字列を一括置換】Excelのセルとオートシェイプ図形
【VBAで文字列を一括置換】Excelのセルとオートシェイプ図形
あなたは日々のお仕事で 『Excelの図形の文字をチョット置換したいだけ』 なんだけど… 『置換する数が膨大でウンザリ!』 といった経験はないでしょうか? こん.....


スポンサーリンク

複数ファイルの文字列を一括置換するVBAツール【無料で公開】

筆者が自作した文字列の一括置換をGithubに公開していますので紹介いたします。

本記事で記載した内容を使ってExcelVBAでツールとして作成したものです。

GitHubのファイル説明
  • ファイル置換ツール.xlsm【メイン】
    文字列の一括置換ツールです
  • CNV_FILE.bas
    本記事のサンプルソース「CNV_TXTFILE」です。
    入力テキストから出力テキストへ文字列を置換して出力する関数
  • XLS_IN_OUT.bas
    本記事のサンプルソース「XLS_IN_OUT」です。
    入力ブックから出力ブックへ文字列を置換して出力
ファイル置換ツールの説明
  • 用途
    設計書やソースの単純コンバージョンなど
  • 機能
    ファイル内の文字を一括置換で出力
    ファイルの種類:テキストファイル/Excel(図形テキストもOK)
  • 使用方法
    ボタンをクリックすると一括置換します。
    詳細はシートを参照ください

複数ファイルの文字列を一括置換ツールのダウンロード手順

複数ファイルの文字列を一括置換ツールのダウンロードする手順です。

1.こちら(Github)をクリック

2.「ファイル置換ツール.xlsm」をクリック

 

3.DownloadボタンをクリックするとPCへダウンロードされます

 

ダウンロードした「ファイル置換ツール.xlsm」を開くと…

こんな感じです。説明も記入しておりますのでご参照ください。

 

もしコンパイルエラーが出る場合は、下記の部分を修正してみてください。
近々、Githubも更新予定です。

×Declare Function SHCreateDirectoryEx …
○Declare PtrSafe Function SHCreateDirectoryEx …

コメントでご指摘いただき気付きました。

SEおっさん
SEおっさん
ご使用は自己責任でお願いするぞい

VBAで複数のテキストファイルから文字列を一括置換! まとめ

いかがでしたでしょうか?

VBAで複数のテキストファイルから文字列を一括置換する方法をご紹介しました。

ポイントを振り返りましょう。

ポイントまとめ!
  • 文字列の置換はReplace関数を使用する
  • テキストファイルの入出力はファイル操作ステートメントを使用する

VBAで複数ファイルを一括置換して、速く仕事が終わってビールが飲めれば良いですね!

#サンプルソースはGithubにあります。

SEおっさん
SEおっさん
ここまで読んでくれてありがとう!

「記事を読んでもわからないトコがある」「内容が変だよ」
という時は、お気軽にコメントください♪

「もっとSEおっさんに詳しく聞きたい。何かお願いしたい!」
という時は、ココナラまで。メッセージもお気軽に♪

LINEでのお問合わせも受付中!
LINE公式アカウント

メッセージをお待ちしています!

取得資格
  • 応用情報技術者
  • Oracle Master Gold
  • Java SE Gold
  • Java EE Webコンポーネントディベロッパ
  • Python エンジニア認定データ分析
  • 簿記2級


スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • LINEで送る

コメント

  1. 錦織邦博 より:

    テキストファイルの文字列を一斉置換するマクロをdownloadしたいのでお願いします。

    1. SEおっさん より:

      コメントありがとうございます。
      返信が遅れてすみません。

      下記URLからDownloadボタンをクリックしてください。
      https://github.com/baritus-g/vba-file-conversion/blob/master/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E7%BD%AE%E6%8F%9B%E3%83%84%E3%83%BC%E3%83%AB.xlsm

      ファイル置換ツール.xlsmがダウンロードできます。
      ツールを開くと使用方法を説明しておりますのでご参照ください。

      こちらでツール実行結果の検証も行っておりますが、ご利用は自己責任でお願いいたします。

      【追伸】
      複数ファイルの文字列を一括置換ツールのダウンロード手順も記事に追記してみました。
      よろしければ、そちらもご参照ください。

  2. やすだひろし より:

    こんにちは、初めまして。
    まだ、プログラミング始めたてで大変勉強になります。

    教えていただきたいのですが、こちらのマクロで出力ファイルをテキストファイルとした場合に、UTF-8で出力したいのですが、どうすればいいのでしょうか?
    「FILE_IN_OUT」部分で指定すればいいかと思っているのですが、どうすればいいか全くわかりません。

    お時間のある時に教えていただけると助かります。

    1. SEおっさん より:

      コメントありがとうございます。

      そうですね。場所は「FILE_IN_OUT関数」であってると思います。

      UTF-8への変換はADODB.Streamを利用するしかなさそうです。

      ザクッとサンプルを記載しましたのでご参考までに。
      (間違っていたらごめんなさい!)

      ‘ADODB.Streamオブジェクトを生成
      Dim adoSt As Object
      Set adoSt = CreateObject(“ADODB.Stream”)

      ‘ UTF8でオープン(Open s2 For Output As #n2の代わり)
      adoSt.Charset = “UTF-8”
      adoSt.LineSeparator = adLF
      adoSt.Open

      ~do loopの箇所
      ‘// 出力ファイルのデータを書き込み(Print #n2, vの代わり)
      adoSt.WriteText v, adWriteLine
      ~do loopの箇所

      ‘出力ファイルをUTF8でクローズ(Close #n2の代わり)
      adoSt.SaveToFile s2, adSaveCreateOverWrite
      adoSt.Close

      ※補足
      ADODBは参照設定を行う必要があると思います
      下記を参考にしてください。
      VBEのメニュー[ツール]-[参照設定]

      「Microsoft ActiveX Data Objects x.x Library」をOn
      (x.xはバージョンです最新版をON)

      では、頑張ってみて下さい。

      1. やすだひろし より:

        お忙しい中、早速回答いただきありがとうございます!
        頑張ってみます!

  3. yahoo知恵袋ユーザ より:

    Declare Function SHCreateDirectoryEx Lib “shell32” Alias
    の部分がPtrSafeが書かれておらずエラーになります。

    1. SEおっさん より:

      すみません。
      返信が大幅に遅れてしまいましたm(_ _)m

      ご指摘ありがとうございます!
      PtrSafe属性をしていしないと64bit版officeでコンパイルエラーになるということですね。
      近々、Githubも更新予定です。

      × Declare Function SHCreateDirectoryEx …
      ○ Declare PtrSafe Function SHCreateDirectoryEx …

コメントを残す

*