Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Microsoft 365)
エクセルVBAを使ってテキストファイルの文字列を一斉に置換したい。
投稿日時: 22/02/18 21:37:22
投稿者: monolith_91

https://fastclassinfo.com/entry/replace_texts_in_folder/
 
↑のページを参考にして、B2セルで指定のフォルダ配下のテキストファイルに対して、
B5セル等で指定した文字列をC5セル等の文字列に置換したうえで、
別フォルダに置換後の文字列で新しいテキストとして出力することに成功しました。
 
しかしながら置換元のテキストファイルに日本語が含まれていると、
文字化けして出力されます。文字化けされずに出力する方法はないでしょうか?
 
 

回答
投稿日時: 22/02/18 22:01:53
投稿者: simple

コードを提示してもらえますか?
それを拝見しないと見当がつきません。

回答
投稿日時: 22/02/18 22:12:04
投稿者: よろずや

monolith_91 さんの引用:
https://fastclassinfo.com/entry/replace_texts_in_folder/
 
↑のページを参考にして

ちょっと記事が古いですね。
 
ADODB.Stream
でWeb検索してみましょう。

回答
投稿日時: 22/02/18 22:17:18
投稿者: simple

文字コードは事前にわかっているんですか?
どんな種類の文字コードを扱っているのですか?
事前に分かっていれば、ADODB.Streamで如何様にでもコード変換可能ですね。
ただし、事前に不明だとすると、ADODB.Streamの自動判定機能には限界があった気がします。

投稿日時: 22/02/20 23:16:14
投稿者: monolith_91

下記の変数を加えたうえで、
 

    Dim tmp As String
    Dim buf As String
    Dim fname As String
    Dim tobj As Object
    Dim tobj2 As Object

 
リンク先のページの、プログラム10〜プログラム17の内容を、
下記のように「ADODB.Stream」を使って修正することで解決しました。
 
皆さん、どうもありがとうございました!m(__)m
 
    'プログラム10|テキストファイルのみを取得
    Dim myfile As Scripting.File
    For Each myfile In myfiles
        If fs.GetExtensionName(myfile) = "ttl" Then
            
            'プログラム11|テキストファイルを読み込む
            fname = myfile.Path
            Set tobj = CreateObject("ADODB.Stream")
            tobj.Charset = "UTF-8"
            tobj.LineSeparator = 10
            tobj.Open
            tobj.LoadFromFile fname
            
            'プログラム12|新しいテキストファイルを作成し、開く
            newfilepath = folderpath2 & "\new_" & myfile.Name
            Set tobj2 = CreateObject("ADODB.Stream")
            tobj2.Charset = "UTF-8"
            tobj2.LineSeparator = 10
            tobj2.Open
            
            'プログラム13|プログラム11で開いたテキストファイルに1行ずつ、エクセルの置換表をもとに変換
            Do Until tobj.EOS
               tmp = tobj.ReadText(-2)
               
                For j = LBound(myrange1) To UBound(myrange1)
                    tmp = Replace(tmp, myrange1(j, 1), myrange1(j, 2))
                Next
               
               'プログラム14|新しいテキストファイルのバッファに置換後の内容を(1行分)書き込み
               tobj2.WriteText tmp

            Loop
            
            'プログラム15|新しいテキストファイルに置換後の内容をバッファからダンプし閉じる
            tobj2.SaveToFile newfilepath, 2
            tobj.Close
            tobj2.Close
        
        End If
    
    Next
[/code]