1

MicrosoftScriptingRuntimeを参照してVBAを使用する。2つの異なるディレクトリのファイル名を比較して、同じファイルが両方のディレクトリにあるかどうかを確認しようとしています。ただし、完全に一致するものを探しているわけではありません。特定の種類のプレフィックスを削除したいので、たとえば、、、A-12234.pdfおよび12234.pdfA_ 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()に同じファイル名を要求しています。各ファイル名の配列とストリップバージョンを作成することはできましたが、コレクションに数値インデックスがないため、それらをのコレクションと関連付けることができないようです。私が使ってみたので私は知っています:dir2for..next file1dir1Arraydir2ArrayFilesdir1dir2Files

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

しかし、それは本当に不格好なようです。このファイル名比較操作を処理するためのより良い方法はありますか?

4

2 に答える 2

1

ディレクトリ2の辞書オブジェクトを作成し、ディレクトリ1を使用して検索してみませんか。辞書オブジェクトに挿入するときにプレフィックスを削除できます。

唯一の問題は、辞書に一意のファイル名がない可能性があることです

たとえば、A-12345は、プレフィックスを削除した後のA12345と同じになります。

于 2011-11-16T03:08:15.637 に答える
1

DIR を使用してワイルドカードを使用しないのはなぜですか?

次のようなもの(テストされていません):

myFile = Dir("C:\*1234.pdf")
Do While myFile <> ""
If myFile <> "." And MyFile <> ".." Then
Msgbox myFile
End If
MyFile = Dir 
Loop

これを配列に入れます。他のディレクトリについても同じことを行い、2 つの配列を比較します。

于 2011-11-16T16:21:34.507 に答える