MicrosoftScriptingRuntimeを参照してVBAを使用する。2つの異なるディレクトリのファイル名を比較して、同じファイルが両方のディレクトリにあるかどうかを確認しようとしています。ただし、完全に一致するものを探しているわけではありません。特定の種類のプレフィックスを削除したいので、たとえば、、、A-12234.pdf
および12234.pdf
はA_ 12234.pdf
互いに等しいと見なす必要があります。
stripPrefix()
ファイル名を他のファイルと比較できるバージョンに変更するために必要な文字列操作を実行する関数があるとします。前のケースでは、3つすべてstripPrefix()
が返さ12234.pdf
れます。次に、ディレクトリ内のファイル名を次のコードを使用してc:\dir1
比較できます。 c:\dir2
:
sub findMatchFilenames()
dim fso as fileSystemObject
dim dir1 as folder
dim dir2 as folder
dim file1 as file
dim file2 as file
set fso=new fileSystemObject
set dir1=fso.getfolder("c:\dir1")
set dir2=fso.getfolder("c:\dir2")
for each file1 in dir1.files
for each file2 in dir2.files
if stripPrefix(file1.name)=stripPrefix(file2.name) then
debug.print file1.name & " matches " & file2.name
end if
next file2
next file1
end sub
ここでの大きな問題:ループを繰り返すたびstripPrefix()
に同じファイル名を要求しています。各ファイル名の配列とストリップバージョンを作成することはできましたが、コレクションに数値インデックスがないため、それらをのコレクションと関連付けることができないようです。私が使ってみたので私は知っています:dir2
for..next file1
dir1Array
dir2Array
Files
dir1
dir2
Files
Set fso = New FileSystemObject
Set folderObj = fso.GetFolder("c:\data")
fileCount = folderObj.Files.Count
For c = 1 To fileCount
MsgBox c & " " & folderObj.Files(c).name
Next
から「無効なプロシージャ呼び出しまたは引数」を取得しましたfolderObj.Files(c).name
。ループに入るときにカウンターをインクリメントし、カウンターをfor..next
使用して配列を参照し直すことができると思います。
'after creating arrays of stripPrefix() for dir1 and dir2
ctr1=0
for each file1 in dir1.files
ctr2=0
for each file2 in dir2.files
if dir1array(ctr1)=dir2array(ctr2) then
debug.print file1.name & " matches " & file2.name
end if
ctr2=ctr2+1
next file2
ctr1=ctr1+1
next file1
しかし、それは本当に不格好なようです。このファイル名比較操作を処理するためのより良い方法はありますか?