Excel シートのセットがあり、それぞれ次のように設定されています。
ID | imageName
--------------
1 abc.jpg
2 def.bmp
3 abc.jpg
4 xyz123.jpg
このシートは、次のような内容のフォルダーに対応しています。
abc.pdf
ghijkl.pdf
def.pdf
def.xls
x-abc.pdf
imageName
それぞれのインスタンスとそれに一致する最も低いPDF を一致させるレポートを生成しようとしています。また、シート内の一致しないものとフォルダー内の一致しない PDF をID
識別します。imageName
「x-」接頭辞が付いたファイル名は、接頭辞がないファイル名と同等であるため、このデータ セットのレポートは次のようになります。
ID imageName filename
-----------------------
1 abc.jpg abc.pdf
1 abc.jpg x-abc.pdf
2 def.bmp def.pdf
4 xyz123.jpg
ghijkl.pdf
私の現在の解決策は次のとおりです。
'sheetObj is the imageName set, folderName is the path to the file folder
sub makeReport(sheetObj as worksheet,folderName as string)
dim fso as new FileSystemObject
dim imageDict as Dictionary
dim fileArray as variant
dim ctr as long
'initializes fileArray for storing filename/imageName pairs
redim fileArray(1,0)
'returns a Dictionary where key is imageName and value is lowest ID for that imageName
set imageDict=lowestDict(sheetObj)
'checks all files in folder and populates fileArray with their imageName matches
for each file in fso.getfolder(folderName).files
fileFound=false
'gets extension and checks if it's ".pdf"
if isPDF(file.name) then
for each key in imageDict.keys
'checks to see if base names are equal, accounting for "x-" prefix
if equalNames(file.name,key) then
'adds a record to fileArray mapping filename to imageName
addToFileArray fileArray,file.path,key
fileFound=true
end if
next
'checks to see if filename did not match any dictionary entries
if fileFound=false then
addToFileArray fileArray,file.path,""
end if
end if
next
'outputs report of imageDict entries and their matches (if any)
for each key in imageDict.keys
fileFound=false
'checks for all fileArray matches to this imageName
for ctr=0 to ubound(fileArray,2)
if fileArray(0,ctr)=key then
fileFound=true
'writes the data for this match to the worksheet
outputToExcel sheetObj,key,imageDict(key),fileArray(0,ctr)
end if
next
'checks to see if no fileArray match was found
if fileFound=false then
outputToExcel sheetObj,key,imageDict(key),""
end if
next
'outputs unmatched fileArray entries
for ctr=0 to ubound(fileArray,2)
if fileArray(1,ctr)="" then
outputToExcel sheetObj,"","",fileArray(0,ctr)
end if
next
このプログラムはレポートを正常に出力しますが、非常に遅いです。For ループがネストされているため、imageName
エントリとファイルの数が増えると、それらを処理する時間が指数関数的に増加します。
これらのセットで一致を確認するより良い方法はありますか? ディクショナリにすると高速になる可能性がありますfileArray
が、ディクショナリに重複キーを含めることはできず、ファイル名が複数の imageName に一致する可能性があるため、このデータ構造にはフィールドに重複するエントリが必要です。