ファイル名一括置換のエラー解決方法

このQ&Aのポイント
  • VBA初心者がフォームから受け取ったディレクトリ内のファイル名を一括置換する際に、IF文を使用するとエラーが発生する問題について解決方法を紹介します。
  • フォームから受け取ったパスを使用せずに、ファイル名の末尾を「_ja.txt」から「_de.txt」に置換するだけなら問題なく動作します。
  • エラーメッセージ「実行時エラー'53' ファイルがありません。」の原因は、IF文の条件式が正しくないため、ファイルが存在しない場合にエラーが発生しています。
回答を見る
  • ベストアンサー

ファイル名の一括置換がIF文のときだけエラーになる

ファイル名の一括置換がIF文のときだけエラーになる こんにちは。VBA初心者です。 フォームから受け取ったディレクトリ内にあるファイルの名前を一括置換しようとして、以下のようなコードを書いたのですが、「実行時エラー'53' ファイルがありません。」となってしまします(だだし、1つ目のファイルだけは正しくリネームされます)。 フォームから受け取ったパスは使用せず(IF文は使用せず)、例えば、ファイル名の末尾を「_ja.txt」から「_de.txt」と固定的に置換するだけならちゃんと動くのですが、どこがいけないでしょうか。 ※VBEのローカルペインによると、エラー時の「myRename1」には「"D:\export\de\test_ja.txt"」、「myRename2」には「"D:\export\de\acn200_de.txt"」が格納されているので、問題ないように思えるのですが。。。 Sub ファイル名変更(myPath As String) Dim myFilename1 As String Dim myFilename2 As String Dim myRename1 As String Dim myRename2 As String myPath = myPath & "\" myFilename1 = Dir(myPath & "*_ja.txt") If myPath = "D:\export\de\" Then myFilename2 = Replace(myFilename1, "_ja.txt", "_de.txt") ElseIf myPath = "D:\export\en\" Then myFilename2 = Replace(myFilename1, "_ja.txt", "_en.txt") Else myFilename2 = Replace(myFilename1, "_ja.txt", "_fr.txt") End If myRename1 = myPath & myFilename1 myRename2 = myPath & myFilename2   Do While myFilename1 <> "" Name myRename1 As myRename2 Loop End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

Do~Loopの範囲が間違い myFilename1 = Dir(myPath & "*_ja.txt") Do While myFilename1 <> "" '★ここでループ判定     If myPath = "D:\export\de\" Then     = = = = 以下略 = = =     Name myRename1 As myRename2     myFilename1 = Dir '★次のファイルを受け取る Loop 掲題のプログラムではRenameを永久に繰り返すが、 最初のRenameで名前が変わってしまったので、2回目に 指定された旧ファイル名が見つけられないということ。

Kazu_creator
質問者

お礼

ありがとうございます!解決しました。 myFilename2のところで行っているReplaceの処理は、Do While のループの中で1回ずつやらいといけなかったのですね。それでIF文を挿入したとたんに動かなくなった理由が判りました。 それに、2回目の以降の検索をするための myFilename1 = Dir() が抜けていたのも致命的でした。消したつもりはなかったのに、いつの間にか削除してました。 はやく自分で気付けるようになりたいです。

その他の回答 (1)

  • WDY
  • ベストアンサー率28% (121/431)
回答No.1

myPathをメッセージBOXで表示してみてください。 ループした時にクリアされていないからつながったファイルパスになると思います。 一回目 D:\export\de\・・・・ 二回目 D:\export\de\・・・・D:\export\de\・・・・

関連するQ&A

  • フォルダ内のファイル名の末尾7文字を一括置換

    フォルダ内のファイル名の末尾7文字を一括置換 こんにちは、VBA初心者です。 D:\test フォルダに test_jp.txt、sample_jp.txt、testsample_jp.txt といった名前のファイルが格納されているとします。 これらのファイル名の「_jp.txt」の部分(末尾7文字の部分)を「_en.txt」に置換したいのですが、うまくいきません。 以下のようなプログラムを書いてみたのですが、どこがいけないのでしょうか。 ※「実行時エラー53 ファイル名が見つかりません。」となります。 ※ VBEのローカルペインによると、エラー時には filename 変数に sample_jp.txt が格納されています。 Sub ファイル名置換() Dim fileName As String fileName = Dir("D:\test\*_ja.txt") Do Until fileName = "" Name "D:\test" & fileName As "D:\test" & Left(fileName, Len(filename) - 7) & "_de.txt" filename = Dir() Loop End Sub

  • テキストファイルを読み込み 偶数行の特定の文字を置換するには?

    お世話になります。 vb6なんですけどテキストファイルを読み込んで 偶数行のある文字を置換したいんですけど このサンプルをどういう風に改変して偶数行の文字列をある文字列に 置換するコードを書いてよいのかわかりません。 置換するのはreplace関数を使うと思うのですが。 教えて下さい。お願いします。 Dim n As Long, tmp As String n = FreeFile Open "D:\Test.txt" For Input As #n Line Input #n, tmp Close #n

  • 位置の指定をすることは可能ですか?

    VBAでテキストファイルを生成するコードを作ったのですが その際位置の指定をすることは可能ですか? Sub test() Dim myFSO As New FileSystemObject Dim ts As TextStream Dim MyFileName As String Dim MyPath As String MyPath = MyDesktop & "\" MyFileName = "test.txt" Set myFSO = CreateObject("Scripting.FileSystemObject") Set ts = myFSO.CreateTextFile(MyPath & MyFileName, True) CreateObject("Shell.Application").ShellExecute MyPath & MyFileName 'ここで位置の指定をしたい Set ts = Nothing Set myFSO = Nothing End Sub こんな感じのコードは作成しました。 With MyFileName .Top = 100 .Left = 100 End With みたいな感じで位置の指定は可能ですか? APIを使わないと無理ですか?

  • (VBA) Dir 関数で取得するファイル一覧の順序

    タイトルの通り、下記のサンプルコードを実行して取得するファイル一覧の順序についての質問です。 Public Sub Test1() Dim WSH As Object Dim MyPath As String Dim MyFileName As String Set WSH = CreateObject("WScript.Shell") MyPath = WSH.SpecialFolders("MyDocuments") MyFileName = Dir(MyPath & "\" & "*.*") Do Until MyFileName = "" MsgBox MyFileName MyFileName = Dir Loop Set WSH = Nothing End Sub (質問) ファイル名の昇順では取得できないようですが、もしファイル名の昇順に並べ替えるとしたら、 どのように処理したらよいのでしょうか?

  • 特定の名前のシートがあるか確認するには

    1つのフォルダの中に 4つのエクセルファイルがあります。 そのエクセルファイルの中に12というファイル名がある場合は メッセージを出したいと考えて以下のコードを書きました。 この4つのファイルのうち1つのファイルに12のシートを 存在させてみて、以下のコードで実行しました。 Sub シートの確認2() Const MyPath As String = "C:\test\" Dim MyBook As Workbook Dim MyFileName As String Dim MyRng As Range Dim i As Long Dim ws As Worksheet, flag As Boolean MyFileName = Dir(MyPath & "*.xlsx") Do While MyFileName <> "" If ThisWorkbook.Name <> MyFileName Then Set MyBook = Workbooks.Open(MyPath & MyFileName) For i = 1 To Worksheets.Count If Worksheets(i).Name <> "12" Then MsgBox "[12]シートが存在しません。" Else MsgBox "[12]シートが存在します。" End If Next i MyBook.Close End If MyFileName = Dir() Loop End Sub すると、 12という名前のあるシートを持つブックの場合、 "[12]シートが存在しません。" "[12]シートが存在します。" の両方のメッセージが出てきます。 おそらく考えるに そのブックにはシートが2枚あり、 そのうち1つが12という名前のシートであり もう一つは違う名前なので このような現象が出てくるのではないかと。 ただ単純に、その同一フォルダ内のブックに12というがあるかないかを 取得するにはどうしたらよいでしょうか?

  • Excelでの Dir

    excel VBAにて Dir関数を用いて、フォルダに存在するファイルを つかむのに、下記のスクリプトがあります。(渡辺ひかる氏のサンプル集)。 質問は、このスクリプトで引っ張り出されるファイルの順番です。本を色々調べたのですが、順番は、「不明」とあります。 しかし、現実は、アルファベット順? に並んでいるように思われます。 本当のところは、どうなんでしょう? 「不明」なのか、それとも「順番が成立している」のか? よろしくお願いします。 ---------------------------------------- Option Explicit Sub P_Sample003() Dim myPath As String Dim myFileName As String Dim i As Long myPath = ThisWorkbook.Path & "\" '任意のフォルダ myFileName = Dir(myPath, 0) Do While Len(myFileName) > 0 Debug.Print myPath & myFileName myFileName = Dir() Loop End Sub

  • FileDateTime

    Dim MyFileName As String Dim MyPath As String Dim NewName As String Dim objFS As FileSystemObject Dim objFol, shellObj, folderObj, MyFolderName, myFile Dim New撮影日時 As String Sub test() MyFileName = "C:\Users\写真" Set objFS = CreateObject("Scripting.FileSystemObject") Set shellObj = CreateObject("Shell.Application") With objFS With .GetFolder(MyFileName) For Each MyFolder In .SubFolders MyPath = MyFileName & "\" & MyFolder.Name & "\" Set objFol = objFS.GetFolder(MyPath) Set folderObj = shellObj.Namespace(MyPath) MyFileName = Dir(MyPath & "*.*") Do While MyFileName <> "" ’ここでエラー New撮影日時 = FileDateTime(MyPath & folderObj.ParseName(MyFileName)) MyFileName = Dir() Loop Next End With End With Set objFS = Nothing End Sub このコードは何が変ですか? 写真フォルダに入っているサブフォルダの写真ファイルの撮影日時を取得したいのですが FileDateTime(MyPath & folderObj.ParseName(MyFileName)) で 実行時エラー_91「オブジェクト変数またはWithブロック変数が設定されていません」 になります。 原因がわかりません。 オフィス2010、アクセスです。

  • Excel 2010 VBA:ファイル名を読み込む

    下は複数のcsvファイルを一つに合体するVBAです。これにシートの右端に読み取ったファイル名を追加するにはどうしたらよいでしょうか。 よろしくお願いします。 Sub macro1() Dim myPath As String Dim myFile As String Dim s As String myPath = ThisWorkbook.Path & "\" On Error Resume Next Kill myPath & "合体版.csv" On Error GoTo 0 myFile = Dir(myPath & "*.csv") If myFile = "" Then Exit Sub Open myPath & "合体版.csv" For Output As #1 Do Until myFile = "" Open myPath & myFile For Input As #2 Do Until EOF(2) Line Input #2, s Print #1, s Loop Close #2 myFile = Dir() Loop Close #1 End Sub

  • VBA 一つのフォルダの中のフォルダ名とファイル名

    一つのフォルダの中のフォルダ名とファイル名を取得したい場合は ************************************** Sub test() Dim MyFileName As String Dim MyFolderName As String Dim myFSO As Object Dim MyFolder As Scripting.Folder MyFolderName = "C:\" 'フォルダを取得 MyFileName = Dir(MyFolderName & "*.*") Do While MyFileName <> "" Debug.Print MyFileName MyFileName = Dir() Loop 'ファイルを取得 Set myFSO = CreateObject("Scripting.FileSystemObject") With myFSO With .GetFolder(MyFolderName) For Each MyFolder In .SubFolders Debug.Print MyFolder.Name Next End With End With Set myFSO = Nothing End Sub ************************************** の様に ファイル名・フォルダ名をそれぞれループして取得しないとダメでしょうか? もうちょっとスマートなコードはありますか?

  • IF文で。。

    Dim 当月 As String Dim 結果 As Range Dim i As String Dim X As String Dim Nen as integer 当月 = Format(Date, "m") & "月"  Nen = 2009 Set 結果 = Range("D4:O4").Find(what:=当月, lookat:=xlWhole) If Not 結果 Is Nothing Then i = Left(当月, 1) If 結果 <> "4月" And Year(Date) = Nen + 1 Then ・            ・ ・ Findで取得した当月を結果に入れ、結果が4月で2010年でなければ Then以下のプログラムを実行させるというものを作成したのですが 結果は4月でYear(Date)は2009年なので実行されるはずなのですが 実行されません。 MsgboxでNen+1を表示させてみたのですが、2010年でした。 この場合結果は4月で2010年ではないのでthen以下は実行されるはずだと思われるのですがどこかおかしいでしょうか? 何かご指摘あればお願いします。

専門家に質問してみよう