• 締切済み

ExcelVBA テキストファイルの文字列置換え

VBA初心者のものです。 複数のフォルダの中にある同名テキストファイル(INIファイル)の中の特定の文字列 を置換えるマクロを作成していますが、うまくいかずエラーになります。 フォルダは毎回名前が変わるのでこれを変数にしてパスの中に入れて、その下の 階層のINIファイルを文字列置換えするというものです。 文字列置換えはReplace関数を使って、テキストファイルの読み込みと別ファイルとして書き出して、元ファイルを削除、新ファイルの名前を元ファイルの名前に変更するというもので、 置換える文字列はエクセルシートのB2・B3セルを読み取ってます。 テキストを開く際にパスを変数でなくフォルダ名を指定して作ると文字列置換えは出来るので、パスへの変数の組み込み方か条件設定がおかしいのかなと思うんですが、エラーはパスが不明といった内容のものが出ます。 エクセルファイルはデスクトップにあるNew Projectフォルダの中に置いて、同階層にresultフォルダがありその中に複数のフォルダ(このフォルダ名を変数にしようとしています)、それぞれの中の2つ下層に同名テキスト(INI)ファイルがあります。 もしくは違う良い方法があるのか、浅学で稚拙なコードですがどうかご教示をお願いします。 Sub MyMacro1() Dim a As String Dim z As String Dim MyF As String Dim DirName As String Dim MyIniNo As Integer Dim YourIniNo As Integer MyIniNo = FreeFile YourIniNo = FreeFile DirName = "C:¥Documents and Settings¥AAA¥デスクトップ¥NewProject¥result¥" MyF = Dir(DirName, 16) If MyF <> "" Then Do Until MyF = "" Open "C:¥Documents and Settings¥AAA¥デスクトップ¥NewProject¥result¥" & MyF & "¥EzInst¥SETUP.INI" For Input As MyIniNo Open "C:¥Documents and Settings¥AAA¥デスクトップ¥NewProject¥result¥" & MyF & "¥EzInst¥SETUP2.INI" For Input As YourIniNo b = Range("B2") c = Range("B3") While Not EOF(1) Line Input #MyIniNo, a z = Replace(a, b, c) Print #YourIniNo, z Wend Close MyIniNo Close YourIniNo Kill "C:¥Documents and Settings¥AAA¥デスクトップ¥NewProject¥result¥" & MyF & "¥EzInst¥SETUP.INI" Name "C:¥Documents and Settings¥AAA¥デスクトップ¥NewProject¥result¥" & MyF & "¥EzInst¥SETUP2.INI" As "C:¥Documents and Settings¥AAA¥デスクトップ¥NewProject¥result¥" & MyF & "¥EzInst¥SETUP.INI" Loop End If End Sub

みんなの回答

  • kybo
  • ベストアンサー率53% (349/647)
回答No.3

ちゃんと検証してないですが、以下で一度お試しください。 Sub MyMacro1() Dim a As String Dim z As String Dim MyF As String Dim DirName As String Dim MyIniNo As Integer Dim YourIniNo As Integer MyIniNo = FreeFile DirName = "C:\Documents and Settings\AAA\デスクトップ\NewProject\result\" MyF = Dir(DirName, 16) If MyF <> "" Then Do Until MyF = "" If MyF <> "." And MyF <> ".." Then ’★サブフォルダと親フォルダを無視 Open "C:\Documents and Settings\AAA\デスクトップ\NewProject\result\" & MyF & "\EzInst\SETUP.INI" For Input As MyIniNo YourIniNo = FreeFile ’★これの位置変更 Open "C:\Documents and Settings\AAA\デスクトップ\NewProject\result\" & MyF & "\EzInst\SETUP2.INI" For Input As YourIniNo b = Range("B2") c = Range("B3") While Not EOF(MyIniNo) Line Input #MyIniNo, a z = Replace(a, b, c) Print #YourIniNo, z Wend Close MyIniNo Close YourIniNo Kill "C:\Documents and Settings\AAA\デスクトップ\NewProject\result\" & MyF & "\EzInst\SETUP.INI" Name "C:\Documents and Settings\AAA\デスクトップ\NewProject\result\" & MyF & "\EzInst\SETUP2.INI" As "C:\Documents and Settings\AAA\デスクトップ\NewProject\result\" & MyF & "\EzInst\SETUP.INI" End If MyF = Dir ’次のフォルダへ Loop End If End Sub

noname#154650
noname#154650
回答No.2

ステップイン実行をご存知でしょうか? 実行するプロシージャにカーソルを置いてF8キーです。 一行ずつ実行するので、どの行でどんなエラーになるのか分かります。

benaonana
質問者

お礼

ご返答ありがとうございます。 遅くなり申し訳ありません。 ステップイン試しました。 テキストファイルを開けるところでパスが不明と出ます。 このパスに変数を入れ込んでるんですが、 変数でなく直接指定したパスにするとうまくいくのです。 なんでやはり変数の設定のところがおかしいんでしょうか。

  • kybo
  • ベストアンサー率53% (349/647)
回答No.1

動作確認はしていませんが、★の行を追加してみてはどうでしょうか? Do Until MyF = "" If MyF <> "." And MyF <> ".." Then ’★サブフォルダと親フォルダを無視する MyF = Dir ’★次のフォルダを取得 Loop

benaonana
質問者

お礼

ご返答ありがとうございます。 遅くなり申し訳ありません。 入力してみましたが同じくエラーが出てしまいます。 パスが不明というものです。

関連するQ&A