2010-06-10 15 views

Respuesta

12

Respondiendo a tu comentario "¿cuántas veces sé cómo ejecutarlo?", este ejemplo se ejecuta hasta que enumera todos los archivos cuyos nombres coinciden con strPattern. Cambie la constante strFolder.

Public Sub ListESY() 
Const strFolder As String = "C:\SomeFolder\" 
Const strPattern As String = "*.ESY" 
Dim strFile As String 
strFile = Dir(strFolder & strPattern, vbNormal) 
Do While Len(strFile) > 0 
    Debug.Print strFile '<- view this in Immediate window; Ctrl+g will take you there 
    strFile = Dir 
Loop 
End Sub 
+0

para los curiosos lo que hace 'Debug.Print', mira esto: http://stackoverflow.com/questions/2916287/where-does-vba-debug-print-log-to – ecoe

3

Dir ("C: \. YourPath \ * ESY", vbNormal) Devuelve el primer archivo con extensión ESY. Cada llamada subsiguiente a Dir() devuelve la siguiente.

+0

grande, así que ¿Cuántas veces te lo sé para ejecutarlo? –

+1

Pruebe la longitud del resultado en un bucle WHILE o DO. Cuando la longitud es 0 ha terminado. – mohnston

2

Opción alternativa: utilizar la biblioteca "Microsoft Scripting Runtime" (comprobarlo en herramientas ... Las referencias) para la familia de objetos FileSystemObject. Algo como lo siguiente, quizás:

Public Function ESYFileCount(dir_path as String) as Long 

Dim fil As File 

    With New FileSystemObject 
     With .GetFolder(dir_path) 
      For Each fil In .Files 
       If LCase(Right(fil.Name, 4)) = ".esy" Then 
        ESYFileCount = ESYFileCount + 1 
       End If 
      Next 
     End With   
    End With 

End Function 
+1

Este código sería mejor (y gana un +1 de mí) si utilizó el enlace tardío en lugar de requerir una referencia al FSO. –

+0

@ David-W-Fenton - No entiendo por qué la unión tardía sería mejor, me gustaría dilucidar? –

+2

La vinculación tardía es mejor debido a que las políticas de dominio pueden bloquear la automatización del FSO. La vinculación tardía es * siempre * mejor para cualquier componente que no forme parte del conjunto de referencias de acceso predeterminado (con muy pocas excepciones). El golpe de rendimiento se evita fácilmente almacenando en el caché una referencia al mismo, y usándolo en lugar de reiniciarlo cada vez que lo usa. –

1

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.)

Cuestiones relacionadas