序文として、私は Access 2003 でコードを書いていますが、Access 2013 を使用するユーザーがいるため、両方と互換性がある必要があります。Application.FileSearch を使用してディレクトリ内の多数のファイルをループするループがあります。これは新しいバージョンの Access では推奨されていないことを理解しているため、「For Each」を使用してファイルをループする必要があります。
変更するコードは次のとおりです。
strPath = CurrentProject.Path & "\Files\"
strFileName = "SourceCode.txt"
With Application.FileSearch
.FileName = "*.txt"
.LookIn = strPath
.Execute
intFileCount = .foundfiles.Count
For x = 1 To intFileCount
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFile(.foundfiles(x))
strNewFileName = Right((.foundfiles(x)), Len((.foundfiles(x))) - (InStr((.foundfiles(x)), "Files\") + 5))
fs.MoveFile f, strPath & strFileName
'Run the Process() function
Process
FileCopy strPath & strFileName, strPath & "Processed\" & strNewFileName
Kill strPath & strFileName
Next x
End With
そして、ここに私がそれを置き換えるコードがあります:
strPath = CurrentProject.Path & "\Files\"
strFileName = "SourceCode.txt"
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFolder(strPath)
Set fc = f.Files
For Each f1 In fc
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strPath & f1.Name, 1)
strNewFileName = f1.Name
f1.Name = strFileName
'Run the Process() function
Process
FileCopy strPath & strFileName, strPath & "Processed\" & strNewFileName
Kill strPath & strFileName
Next
このコードは、各ファイルをループしてから、ファイルに変更を加える Process() 関数を起動します。したがって、私がそれを機能させる方法は、アクティブなファイルを「SourceCode.txt」という名前に変更し、Process() 関数がその名前のファイルを操作することを認識していることです。次に、ファイルを元のファイル名で「処理済み」サブフォルダーに移動します。
これは元のコードではうまくいきました。Process() を起動する前に、ファイルの名前を「SourceCode.txt」に変更する方法が見つからないことを除いて、新しいコードはほとんど機能しているようです。いくつかの方法を試しましたが、エラーが発生し続けます。上記のコードでは、「f1.Name = strFileName」を試しました。これにより、「許可が拒否されました」というエラーが表示されます。別の方法として FileCopy を使用してから、元のファイルに対して Kill コマンドを使用しようとしましたが、Kill コマンドはエラーを返しました。FileSystemObject がファイルをロックしているため、ファイルを移動または強制終了できないと思われます。しかし、古いバージョンのコードは問題なく移動できました。