El siguiente código se ejecuta aproximadamente 19 veces más rápido que utilizando FileSystemObject. En mi máquina, encontrar 4000 archivos en tres drectories diferentes tomó 1,57 segundos usando FileSystemObject, pero solo 0.08 segundos usando este código.
Public Function CountFilesWithGivenExtension(_
i_strFolderWithTerminalBackslant As String, _
i_strExtensionIncludingPeriod As String _
) As Long
If Len(Dir$(i_strFolderWithTerminalBackslant & "*" _
& i_strExtensionIncludingPeriod)) > 0 Then
CountFilesWithGivenExtension = 1
While Len(Dir$) > 0
CountFilesWithGivenExtension = _
CountFilesWithGivenExtension + 1
DoEvents
Wend
Else
CountFilesWithGivenExtension = 0
End If
End Function
Ejemplo de uso:
Debug.Print CountFilesWithGivenExtension("C:\", ".ex*")
(el "DoEvents" no es necesario, pero le permite utilizar pausa/descanso si es necesario.)
para los curiosos lo que hace 'Debug.Print', mira esto: http://stackoverflow.com/questions/2916287/where-does-vba-debug-print-log-to – ecoe