Использование VBA со ссылкой на Microsoft Scripting Runtime. Я пытаюсь сравнить имена файлов в двух разных каталогах, чтобы определить, находится ли один и тот же файл в обоих каталогах. Однако я не ищу точного соответствия; Я хотел бы удалить определенные типы префиксов, поэтому, например, A-12234.pdf
, 12234.pdf
и A_ 12234.pdf
следует считать равными друг другу.
Допустим, у меня есть функция stripPrefix()
, которая выполняет необходимые строковые операции, чтобы изменить имя файла на версию, которую можно сравнить с другими - в предыдущем случае stripPrefix()
вернул бы 12234.pdf
для всех 3. Тогда я мог бы сравнить имена файлов в каталогах 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
но это кажется действительно неуклюжим. Есть ли лучший способ обработать эту операцию сравнения имен файлов