あなたは日々のお仕事で
『テキストファイルの中身をチョット置換したいだけ』
なんだけど…
『置換するファイル数が膨大でウンザリ!』
といった経験はないでしょうか?
こんな時は、プログラムで一気に置換してサッサと仕事を終わりたいですよね!
サッサと終わる手段として、職場でインストールされてるExcelのVBAが使えます。
『VBAでテキストファイルを一括置換する方法は?』
こんな疑問に答えます。
VBAのReplace関数文字列の置換
VBAで文字列を置換したい場合は、Replace関数を使用します。
テキストファイル内の文字列や、Excel内の文章の一括置換もReplace関数で置換できます。
※オートシェイプ図形のテキスト文字はReplace関数で置換できません。一括置換したい場合はこちら
【VBAで文字列を一括置換】Excelのセルとオートシェイプ図形
置換後の文字列 = Replace(置換前の文字列, 検索文字列, 置換文字列)
- 戻り値:置換後の文字列
引数6番目の比較するモード[compare]で設定するぞい
【必須】
- 引数1:expression
置換前の文字列 - 引数2:find
検索する文字列 - 引数3:replace
置換する文字列
【任意:省略可】
- 引数4:start
検索の開始位置
既定値:1(1文字目から開始) - 引数5:count
置換する回数
既定値:-1(全て置換) - 引数6:compare
比較するモード
既定値:vbBinaryCompare(大文字・小文字などを区別)
Replace関数:文字列の置換の使用例
使用例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。
- vbBinaryCompare:バイナリモードで比較
半角と全角、ひらがなとカタカナ、アルファベットの大文字と小文字を区別する - vbTextCompare:テキストモードで比較
半角と全角、ひらがなとカタカナ、アルファベットの大文字と小文字を区別しない
Replace関数は引数を設定しなければ、半角・全角などを区別するバイナリモード置換します。
半角・全角、大文字・小文字を区別をしたくない場合は、引数のcompareをvbTextCompareに指定します。
4番目の引数にvbTextCompareを設定していますが…
6番目の引数の名前である”compare:=”と指定することで「引数6:比較方法」であることを認識させます。
任意引数の名前指定は、ちょっとしたテクニックです。
VBAで複数のテキストファイルから文字列を一括置換する
VBAで文字列を置換するにはReplace関数を利用しますが、テキストファイル内の文字列を置換してファイル出力するためには、テキストファイルの操作が必要です。
VBAでテキストファイルを操作する方法は2つあります。
- ステートメントを使用する
- FileSystemObjectを使用する
ここでは、シンプルなステートメントを使用する方法を紹介します。
あまり深く考えなくて良いぞ
テキスト内の文字列を置換してファイル出力には、テキストファイル操作ステートメントとReplace関数を使用します
以下、テキスト内の文字列を一括置換してファイル出力する流れです。
一括置換といっても、内部処理としては1行ずつ処理します。
最終的に、一括置換してファイル出力される動きになるんです。
- 入力ファイルを開く
- 出力ファイルを開く
- 入力ファイルから1件を読み込む
最終行まで繰り返す - 読み込んだ文字列を置換する
- 出力ファイルへ置換文字列を書き込む
- 入力ファイルを閉じる
- 出力ファイルを閉じる
いまから詳しく説明するぞい
VBAでテキストファイルを操作するステートメント(命令)と順番
VBAでテキストファイルを操作する手順と使用するステートメントです。
- テキストファイルを開く
Openステートメント - データを読み込む/書き込む
Line Inputステートメント(読む)
Printステートメント(書く) - テキストファイルを閉じる
Close ステートメント
Openステートメント(テキストファイルを開く)
テキストファイルを開く処理はOpenステートメントを使います。
ファイル操作で最初に行う処理です。
Open [ファイルの場所] For [開くモード] As #[ファイル番号]
[ファイルの場所]
ファイルを開く場所です。
ダブルクォーテーションで囲った文字列で指定します。
[開くモード]
ファイルを開くモードです。
- Input
入力モード(読み込みで使用) - Output
出力モード(書き込みで使用) - Append
追加モード(書き込みで使用)
OutputもApeendも書き込みで使用しますが、以下の違いがあります。
- Output…既存データは無視して書き込み
- Append…既存データに追記して書き込み
開くモードで設定するんだね
[ファイル番号]
ファイル番号は開くファイルをプログラム上で特定させるために使用します。
このように他には存在しない値のことを、ユニーク値といいます。
未使用の番号を設定し、#(シャープ)を先頭に付与します。
一般的にはFreeFileで空いているファイル番号を取得します。
⇒ファイル番号はユニーク値
変数xにファイル番号を格納する例
'変数xに空いているファイル番号を格納
dim x as integer
x= FreeFile
Line Inputステートメント(データを読む)
テキストファイルからデータを1行読み込む処理は、Line Inputステートメントを使います。
読み込みは、先頭行から最終行まで順番に1行ずつ順番に処理されます。
テキスト内の全行を読み込むには…
行数の数だけLine Inputステートメントを呼び出す必要があるということです。
Line Input #[ファイル番号], [変数]
[ファイル番号]
Openステートメントで設定したファイル番号を指定します。
ファイル番号は開いたファイルを特定する番号です。
つまり、特定できるファイル番号を指定すると…
『どのファイルを対象に処理したら良いかわかる』という訳です。
この考え方は、次で説明するPrintステートメントでも、Closeステートメントでも同じです。
[変数]
開いたテキストファイルから1行を読み込んだ文字列が格納されます。
Printステートメント(データを書く)
テキストファイルへデータを1行書き込む処理は、Printステートメントを使います。
Print #[ファイル番号], [データ]
[ファイル番号]
Openステートメントで設定したファイル番号を指定します。
[データ]
テキストファイルへ書き込むデータを設定します(変数でもOK)
Closeステートメント(テキストファイルを閉じる)
テキストファイルを閉じる処理はCloseステートメントを使います。
Close #ファイル番号
[ファイル番号]
Openステートメントで設定したファイル番号を指定します。
例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
イミディエイトウィンドウと呼ばれるエリアに表示される
イミディエイトウィンドウは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
次は、テキスト操作と置換操作を組み合わせた一括置換のコードをご紹介します。
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です。
VBAでテキストファイル内の文字列を一括置換して出力する方法じゃよ
わかったかのぅ
Excelファイルのセル文字や図形を一括置換したい場合はこちら
複数ファイルの文字列を一括置換するVBAツール【無料で公開】
筆者が自作した文字列の一括置換をGithubに公開していますので紹介いたします。
本記事で記載した内容を使ってExcelVBAでツールとして作成したものです。
- ファイル置換ツール.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 …
コメントでご指摘いただき気付きました。
VBAで複数のテキストファイルから文字列を一括置換! まとめ
いかがでしたでしょうか?
VBAで複数のテキストファイルから文字列を一括置換する方法をご紹介しました。
ポイントを振り返りましょう。
- 文字列の置換はReplace関数を使用する
- テキストファイルの入出力はファイル操作ステートメントを使用する
VBAで複数ファイルを一括置換して、速く仕事が終わってビールが飲めれば良いですね!
#サンプルソースはGithubにあります。
「記事を読んでもわからないトコがある」「内容が変だよ」
という時は、お気軽にコメントください♪
「もっとSEおっさんに詳しく聞きたい。何かお願いしたい!」
という時は、ココナラまで。メッセージもお気軽に♪
LINEでのお問合わせも受付中!
LINE公式アカウント
メッセージをお待ちしています!
- 応用情報技術者
- Oracle Master Gold
- Java SE Gold
- Java EE Webコンポーネントディベロッパ
- Python エンジニア認定データ分析
- 簿記2級
テキストファイルの文字列を一斉置換するマクロをdownloadしたいのでお願いします。
コメントありがとうございます。
返信が遅れてすみません。
下記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がダウンロードできます。
ツールを開くと使用方法を説明しておりますのでご参照ください。
こちらでツール実行結果の検証も行っておりますが、ご利用は自己責任でお願いいたします。
【追伸】
複数ファイルの文字列を一括置換ツールのダウンロード手順も記事に追記してみました。
よろしければ、そちらもご参照ください。
こんにちは、初めまして。
まだ、プログラミング始めたてで大変勉強になります。
教えていただきたいのですが、こちらのマクロで出力ファイルをテキストファイルとした場合に、UTF-8で出力したいのですが、どうすればいいのでしょうか?
「FILE_IN_OUT」部分で指定すればいいかと思っているのですが、どうすればいいか全くわかりません。
お時間のある時に教えていただけると助かります。
コメントありがとうございます。
そうですね。場所は「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)
では、頑張ってみて下さい。
お忙しい中、早速回答いただきありがとうございます!
頑張ってみます!
Declare Function SHCreateDirectoryEx Lib “shell32” Alias
の部分がPtrSafeが書かれておらずエラーになります。
すみません。
返信が大幅に遅れてしまいましたm(_ _)m
ご指摘ありがとうございます!
PtrSafe属性をしていしないと64bit版officeでコンパイルエラーになるということですね。
近々、Githubも更新予定です。
× Declare Function SHCreateDirectoryEx …
○ Declare PtrSafe Function SHCreateDirectoryEx …