• 締切済み

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

  • VBA フォルダ内にファイルが存在するか確認したい

    OS: WindowsXP Office: 2003 ExcelVBAについて教えてください。 VBAで特定のフォルダー内でファイルが存在するかの確認をしたいのです。 例えば、以下のようなフォルダーに営業日がファイル名に付いた複数のファイルがあります。  C:\Documents and Settings\aaa\デスクトップ\作業\報告書20120201.xls  C:\Documents and Settings\aaa\デスクトップ\作業\報告書20120202.xls  C:\Documents and Settings\aaa\デスクトップ\作業\報告書20120203.xls  C:\Documents and Settings\aaa\デスクトップ\作業\報告書20120206.xls  C:\Documents and Settings\aaa\デスクトップ\作業\報告書20120207.xls  C:\Documents and Settings\aaa\デスクトップ\作業\報告書20120208.xls 処理は20120201(2012年2月1日)から順番に行うのですが、その際、 報告書20120203.xlsはファイルが存在しているので変数1を返す。 報告書20120204.xlsは休日のためファイルが存在しないので変数0を返す。 次の処理で変数1の場合は処理をし、変数0の場合は処理を飛ばすと言った内容のマクロを考えています。 要はフォルダー内にファイルが存在するかしないかの部分のマクロ記述を知りたいのです。 どなたか、よろしくお願いします。

  • 結合した文字列をファイル名に使えない

    Excel上に入力されているパス名とファイル名のデータを組み合わせて、 様々なファイルを開いたりコピーしたりするVBAのコードを作ろうとしています。 仮にシート上のA1セルに、C:\Documents and Settings\デスクトップ というパス名 A2セルに URIAGE.xls というファイル名が入力されていたとして、 A1の文字列データとB1の文字列データを結合する場合、 Sub FileSousa()  Dim a As String  Dim b As String  Dim c As String  a = Cells(1, "A").Value  b = Cells(2, "A").Value  c = Chr(34) & a & "\" & b & Chr(34)  Range("A3") = c としてみると、確かにA3セルには、"C:\Documents and Settings\デスクトップ\URIAGE.xls" と出力され、文字列が結合されたことがわかるのですが、その変数cのデータを使って  Workbooks.Open Filename:=c として、そのファイルを開こうとすると、ファイル名が見つからないとしてエラーになります。 ファイルはデスクトップ上の確かにその名前で存在しており、直接 Workbooks.Open Filename:="C:\Documents and Settings\デスクトップ\URIAGE.xls" とすると開きます。 " を Chr(34)によって入力したのがいけないのでしょうか、 Workbooks.Open Filename:=××× には、変数を置いてはいけないのでしょうか。 そもそも文字列の結合は、"あ" & "い" → "あい" となるのが基本だと思うのですが、 a="あ"、b="い"、c=a&b → c="あい"として結合した変数cについては、ファイル操作上のファイル名の設定項目として使えないのでしょうか。

  • 文字列を特定文字で分割したい

    はじめまして。宜しくお願いします。 現在Access2002のVBAをつかってタイトルのようなことを実現したいと思っています。 Dim a As String Dim b As String という二つの変数を用意して 「C:\Documents and Settings\デスクトップ\test.csv」という文字列が与えられているとき 変数aには「test.csv」を、変数bには「C:\Documents and Settings\デスクトップ\」を 格納しようとしています。 スマートなやり方がわからず、 文字列の右から一文字ずつ比較して行き、何文字目に「¥」が出てくるかをカウントして、right関数とleft関数で分割を行っています。 このような処理を行う場合、なにか適した関数があると思い探しているのですが、 なかなか見つからず、行き詰っています。(そのような関数があるのかも分からず・・) もしもなにかお気づきの方が居られましたら、ご教授宜しくお願いします。

  • フォルダ&ファイルをこのように効率的にコピーや削除するbatファイルは?

    Windows2000の環境です。 192.168.0.1(ファイルサーバ) | |─192.168.0.2 | 192.168.0.3 という環境です。 192.168.0.2や192.168.0.3のファイル&フォルダ環境を出来るだけ統一したく思っています(192.168.0.2と192.168.0.3を同時に使用することはありません)。 ログオフ時に \\192.168.0.2(3)\Documents and Settings\root\デスクトップ\ 下の子フォルダ&孫フォルダ&ファイルを \\192.168.0.1\Documents and Settings\root\デスクトップ\ に移して ログイン時には逆に \\192.168.0.1\Documents and Settings\root\デスクトップ\ 下の子フォルダ&孫フォルダ&ファイルを \\192.168.0.2(3)\Documents and Settings\root\デスクトップ\ に移したいのですが 単にログオフ時に \\192.168.0.1\Documents and Settings\root\デスクトップ\ の子フォルダ&孫フォルダ&ファイルを全削除して \\192.168.0.2(3)\Documents and Settings\root\デスクトップ\ の子フォルダ&孫フォルダ&ファイルを全コピーするとフォルダサイズとかが大きい場合にはログイン完了やログオフ完了までかなりの時間がかかってします。 それでタイムスタンプが同じファイルは無視して \\192.168.0.2(3)\Documents and Settings\root\デスクトップ\ 下にあってタイムスタンプが新しいものは \\192.168.0.1\Documents and Settings\root\デスクトップ\ 下にコピー そして \\192.168.0.2(3)\Documents and Settings\root\デスクトップ\ 下に存在してなくて \\192.168.0.1\Documents and Settings\root\デスクトップ\ にあるものは削除するようにする。 ログイン時には同様の逆の手順で行えば単時間で \\192.168.0.2\Documents and Settings\root\デスクトップ\ と \\192.168.0.3\Documents and Settings\root\デスクトップ\ ともコピー&削除作業時間を浪費せずに同じフォルダ&ファイル環境を築けると考えます。 このようにするにはbatファイルをどのように記述すれば宜しいでしょうか?

  • ExcelInputBoxの文字をファイル名にする

    こんにちは。 Excel2007を使用しています。 マクロであらかじめ読み込んだファイルに、InputBoxに日付を入力して "20120723_Summary.xlsx"のように名前をつけたいのですが、 InputBoxに入力した文字をActiveWorkbookに渡す部分が書けません Dim NewName As String NewName = InputBox("名前を入力","","_Summary") 'ここで20120723_Summaryと入力する ChDir "C:\Documents and Settings\$user$\デスクトップ" ActiveWorkbook.SaveAs Filename:= _ "C:\Documents and Settings\$user$\デスクトップ\20120723_Summary.xlsx", FileFormat:= _ xlOpenXMLWorkbook, CreateBackup:=False デスクトップに20120723_Summary.xlsxが作成される この部分の書き方がおわかりの方お教えください。 よろしくお願いいたします。

  • 【バッチファイル】コマンド上で書いた文字をテキストに表示

    コマンド上で入力した文字を、元々あるテキスト(メモ帳)に 書き出したいのですが、どなたかご存知の方、ご教授願いますm(_ _)m 例)、 ping 192.168.*.***>"C:\Documents and Settings\=====\デスクトップ\%COMPUTERNAME%.txt" ipconfig /all>>"C:\Documents and Settings\=====\デスクトップ\%COMPUTERNAME%.txt" "C:\Documents and Settings\=====\デスクトップ\%COMPUTERNAME%.txt">notepad.exe ↑で作成したテキストに、サービスタグ(仮に、XTZ1234とします)を追記したい ということです。 よろしくお願いいたします。

  • ExcelVBAでファイルの名前をつけて保存

    こんばんは! Workbooks.Add ChDir "C:\Documents and Settings\test\My Documents\住所録" ActiveWorkbook.SaveAs Filename:= _ "C:\Documents and Settings\test\My Documents\住所録\友達.xls", FileFormat _ :=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:= _ False, CreateBackup:=False ActiveWindow.Close として現在開いているファイルから、新規ファイルを作成してデータを写しこみたいと考えているのですが、この書き方だと自分のパソコンでしか出来ないので困っています。 ThisWorkbook.Pathを使うんだろうと思うのですが、どの様に使えばよいのか判らず困っています。 現在開いているファイルと同じフォルダの中に住所録というフォルダを更に作成し、その住所録フォルダの中に新しいファイルを作りたいのですが。。 ご伝授願います。

  • ExcelVBA+xdoc2txtでデスクトップのファイルをコンバートしたい。

    ExcelVBA+xdoc2txtを使い、以下の手順でPDFをtxtに変換します。 ・xdoc2txt.exeがいるフォルダを指定させる。 ・PDFがいるフォルダを指定させる。 ・以上を組み合わせxdoc2txt.exeを起動する。 この手順ですが、xdoc2txt.exe及びpdfがDドライブ直下などに 存在する場合は実現出来ています。 問題は両者がデスクトップに存在する場合です。 おそらくデスクトップのフルパスがスペースを含んでいるので 上手く行かないではないかと想像しています。 xdoc2txtのヘルプには「※空白を含むファイル名の場合、""で囲ってください」とあるので、例えば、 "C:\Documents and Settings\hogehoge\デスクトップ\xdoc2txt\xdoc2txt.exe -f C:\Documents and Settings\hogehoge\デスクトップ\PDF\xxx.pdf" あるいは C:\Documents and Settings\hogehoge\デスクトップ\xdoc2txt\xdoc2txt.exe -f "C:\Documents and Settings\hogehoge\デスクトップ\PDF\xxx.pdf" という風にダブルコーテーションで囲ってみたのですが、上手く動作しません。 その実現方法についてご教示いただけると幸いです。

  • ExcelVBAでデスクトップのPATHを取得するには

    こんにちわ。ExcelVBAで、ワークシートのA列に入力されているデータをTextファイルに保存するプログラムを作りました。下記のものです。 ================================= Sub Expo_TXT() Dim Rows As Long Dim StrData As String Dim Fs As Object, A As Object Set Fs = CreateObject("Scripting.FileSystemObject") Set A = Fs.CreateTextFile("c:\test.txt", True) For Rows = 1 To 10 StrData = Worksheets("Sheet1").Cells(Rows, 1).Value A.WriteLine StrData Next Rows A.Close End Sub ================================= しかし見てのとおりcドライブのルートにtest.txtという名前で保存するようになっています。 できれば、そのパソコンのデスクトップに保存したいのですが、どうすれば、パソコンのデスクトップのPATHを取得できるでしょうか? それぞれのパソコンのデスクトップは c:\windows\デスクトップという様にWin98マシンもあれば c:\Documents and Settings\Hanako\デスクトップや c:\Documents and Settings\Taro\デスクトップという場合もあります。多分APIとか使うんだろうなと思い、Webの解説ページを読んだりしましたがAPI使ったことが無いのでチンプンカンプンでした。 できれば具体的なコーディング例をご提示いただければ助かります。

  • デスクトップ上の全ファイル取得

    開発環境 WindowsXP,SP2 Visual Studio 2005 VC++ SDK SHGetFolderPath()でデスクトップのパスを取得した後、FindFirstFileによってデスクトップ上の全ファイル及びディレクトリの名前を取得したいと考えております。 SHGetFolderPathで取得したパスは、 C:\Documents and Settings\...\デスクトップ となっており、この文字列をwsprintfで次のように加工しました。 wsprintf(output,"%s\\*.*","C:\Documents and Settings\...\デスクトップ"); このoutputをFindFirstFile,FindNextFile,FindCloseを組み合わせたプログラムでディレクトリ内の全てのファイル及びディレクトリの名前を取得しています。 このプログラムは普通(?)のディレクトリでは有効で、こちらの期待通りの動きをしてくれるのですが、取得したデスクトップのパスを渡すと、デスクトップフォルダ内にはデスクトップという名前のフォルダしかないと出力されます。以下のような感じです。 調査ディレクトリ:C:\Documents and Settings\...\デスクトップ 調査結果 "C:\Documents and Settings\...\デスクトップ"ディレクトリ内のファイル及びディレクトリ:デスクトップ これはWindowsの仕様の動作なのでしょうか。 特殊フォルダであるデスクトップは、FindFirstFileでは調査出来ないのでしょうか? 他に方法はありますか? どうか教えてください。

専門家に質問してみよう