0

序文として、私は 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 がファイルをロックしているため、ファイルを移動または強制終了できないと思われます。しかし、古いバージョンのコードは問題なく移動できました。

4

1 に答える 1

2

ファイルが使用されているときにファイルの名前を変更しようとしているため、つまりobjFSO.OpenTextFile. これは元のコードとは異なりfs.GetFileますが、必要ですか? TextStreamその後使用していない を返します。

f1.Name = strFileNameいずれにせよ、ファイルを開く前に を移動するか、処理が完了したら呼び出しobjFile.Closeてから名前を変更します。

于 2013-08-08T15:52:50.267 に答える