Effettivamente il codice rischia di schiantarsi in diverse occasioni, probabilmente anche complici nuove prestazioni di sicurezza introdotte sui S.O. piu' recenti...
Ho quindi preparato una versione che mi pare piu' robusta:
- Codice: Seleziona tutto
Dim myFso As FileSystemObject, ccAll As Long 'RIGOROSAMENTE IN TESTA AL MODULO
Dim noDirs
Function RecurDir(ByVal ccDir As String, myExt As Variant, ByRef cStore As Variant) As String
Dim myItm, Dbg As Boolean
'
If myFso Is Nothing Then Set myFso = CreateObject("Scripting.FileSystemObject")
If myFso Is Nothing Then Beep
DoEvents
'
Dbg = False '<<< Se True allora abilita Debug.Print
'
If Dbg Then Debug.Print ccDir
If myFso.FolderExists(ccDir) Then
On Error Resume Next
For Each myItm In myFso.GetFolder(ccDir).Files
If Err.Number = 92 Then
If Dbg Then Debug.Print "# 92", ccDir
Err.Clear
GoTo eFor
ElseIf Err.Number > 0 Then
If Dbg Then Debug.Print "# " & Err.Number, ccDir
Err.Clear
GoTo Bohh
End If
On Error GoTo 0
ccAll = ccAll + 1
mySplit = Split(" " & myItm, ".", , vbTextCompare)
If Not IsError(Application.Match(mySplit(UBound(mySplit)), myExt, 0)) Then
myind = UBound(cStore)
ReDim Preserve cStore(1 To myind + 1)
cStore(myind) = myItm
End If
Bohh:
On Error GoTo 0
DoEvents
If IsEmpty(myItm) Then GoTo eFor
Next myItm
eFor:
On Error GoTo 0
End If
On Error Resume Next
For Each myItm In myFso.GetFolder(ccDir).SubFolders
If Err.Number > 0 Then GoTo eFun
On Error GoTo 0
nobb = False
For I = 0 To UBound(noDirs)
If InStr(1, myItm & " ", noDirs(I), vbTextCompare) > 0 Then
nobb = True
Exit For
End If
Next I
If nobb = False Then Call RecurDir(myItm, myExt, cStore)
Next myItm
eFun:
Err.Clear
End Function
Sub prova()
Dim strFile As String
Dim stdPic As StdPicture
Dim lngWidth As Long
Dim lngHeight As Long
Dim strPath As String, mySplit
Dim intRow As Integer, AllPics, StrDir As String, I As Long
'
Dim FArr() As String
Sheets("Foglio1").Select '<<< Il foglio dei risultati
ReDim FArr(1 To 1)
'
AllPics = Array("jpg", "png", "gif") '<<< Altri formati? '***
StrDir = "C:\" '<<< Il Percorso iniziale
noDirs = Array("\$", "\Program", "\Windows", "\AppData") '<<< Path da escludere
'
Call RecurDir(StrDir, AllPics, FArr)
Range("A1").Resize(UBound(FArr), 1).Value = FArr 'Finalmente scrive da A1 l'elenco
Stop
GoTo eSub 'Termina la sub, se basta l'elenco dei file
'Da qui in poi estrae prorprieta' delle immagini elencate
Application.ScreenUpdating = False
For I = 1 To UBound(FArr)
DoEvents
If Len(FArr(I)) > 0 Then
intRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
mySplit = Split(FArr(I), "\", , vbTextCompare)
If UBound(mySplit) > 0 Then Range("B" & intRow).Value = mySplit(UBound(mySplit))
Range("A" & intRow).Value = Replace(FArr(I), "\" & mySplit(UBound(mySplit)), "\", , , vbTextCompare)
Range("E" & intRow).Value = myFso.getfile(FArr(I)).Size
On Error GoTo piPP
Set stdPic = LoadPicture(FArr(I)) '
Range("C" & intRow).Value = Round(stdPic.Width / 26.4583)
Range("D" & intRow).Value = Round(stdPic.Height / 26.4583)
piPP:
Resume poPP
poPP:
End If
Next I
eSub:
On Error Resume Next
Application.ScreenUpdating = True
Set myFso = Nothing
On Error GoTo 0
MsgBox ("Elenco completato...")
End Sub
Le modifiche riguardano soprattutto la prima parte, compresa la Function RecurDir.
Tra l'altro ho introdotto la possibilita' di dichiarare un elenco di percorsi da skippare, vedi noDirs = Array("\$", "\Program", etc etc
Attenzione che di quelle chiavi ne viene controllata la presenza in qualsiasi posizione del percorso che viene scandagliato.
Da lanciare e' la Sub Prova, che (col codice pubblicato) scrivera' sul foglio selezionato l'elenco dei file rilevati; poi si ferma sullo Stop e, riavviandola, esce.
Vedo che a te interessa raccogliere informazioni diverse da quelle che raccoglievo io, ma puoi benissimo sostituire la seconda parte di Sub Prova con quello che ti interessa.
Ciao