Effectuez tous les files et un dossier et tous les sous-dossiers sont lisibles

J'ai un dossier contenant plusieurs dossiers contenant plusieurs files. J'aimerais utiliser une macro depuis Excel 2010 pour que tous les files soient lus dans tous les dossiers. J'ai essayé le code ci-dessous, mais à mesure que je l' sFile je trouve que sFile ne se peuplent pas avec une string et que le stagiaire ne fonctionne pas.

 Sub setFileReadOnly() Dim sPath As Ssortingng Dim sFile As Ssortingng sPath = "c:\temp\" sFile = Dir(sPath & "*.*") Do Until sFile = "" SetAttr sPath & sFile, vbReadOnly sFile = Dir Loop End Sub 

Vous avez besoin d'une procédure récursive pour cette procédure et une autre qui l'appelle pour démarrer le process. La fonction Dir ne doit pas être utilisée de manière récursive. Essayez ce code, après avoir ajouté une reference (devises -> Références) au Microsoft Scripting Runtime.

 Sub Main() Dim sPath As Ssortingng sPath = "c:\temp\" Call setFileReadOnly(sPath) End Sub Sub setFileReadOnly(sPath As Ssortingng) Dim sFile As Ssortingng Dim sSubFolder As Ssortingng Dim fsoObject As Scripting.FileSystemObject Dim folderObject As Scripting.Folder Dim fileObject As Scripting.File Set fsoObject = New Scripting.FileSystemObject For Each folderObject In fsoObject.GetFolder(sPath).SubFolders Debug.Print folderObject.Path Call setFileReadOnly(folderObject.Path & "\") Next folderObject For Each fileObject In fsoObject.GetFolder(sPath).Files Debug.Print sPath & fileObject.Name SetAttr sPath & fileObject.Name, vbReadOnly Next fileObject End Sub 

Je suis parti dans les instructions Debug.Print .

La manière la plus simple de le faire est avec FileSystemObject dans l'exécution de scripts. Vous devrez append une reference à Microsoft Scripting Runtime ou modifier le code pour utiliser la binding tardive. Après avoir configuré votre dossier de départ, vous pouvez facilement recopyr tous les sous-dossiers:

 Sub SetFilesReadOnly(Optional location As Folder) Dim fso As Scripting.FileSystemObject Set fso = New Scripting.FileSystemObject If location Is Nothing Then Set location = fso.GetFolder("C:\Temp") End If Dim target As File For Each target In location.Files target.Atsortingbutes = target.Atsortingbutes + ReadOnly Next target Dim directory As Folder For Each directory In location.SubFolders SetFilesReadOnly directory Next directory End Sub