need a faster way to match these data sets
===

I have a set of Excel sheets, each set up as follows:

    ID | imageName
    --------------
    1    abc.jpg
    2    def.bmp
    3    abc.jpg
    4    xyz123.jpg

This sheet corresponds to a folder with contents like:

    abc.pdf
    ghijkl.pdf
    def.pdf
    def.xls
    x-abc.pdf

I'm trying to generate a report that matches the instance of each `imageName` with the lowest `ID` with the PDFs that match it, and also identifies unmatched `imageName` in the sheet and unmatched PDFs in the folder.  A filename with an "x-" prefix is equivalent to one without the prefix, so the report for this data set would be as follows:

    ID  imageName   filename
    -----------------------
    1   abc.jpg     abc.pdf
    1   abc.jpg     x-abc.pdf
    2   def.bmp     def.pdf
    4   xyz123.jpg 
                    ghijkl.pdf

My current solution is as follows:

    '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

This program outputs the report successfully, but it's very slow.  Because of the nested For loops, as the number of `imageName` entries and files grows, the time to process them grows exponentially.

Is there a better way to check for matches in these sets?  It might be faster if I make `fileArray` into a Dictionary, but a dictionary can't have duplicate keys, and this data structure needs to have duplicate entries in its fields, as a filename may match multiple imageNames and vice versa.