Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Boucler sur toutes les feuilles de tous mes fichiers de façon dynamique

melouze

XLDnaute Nouveau
Bonjour à tous,

J'essaie de boucler sur les fichiers d'un répertoire, puis pour chaque fichier je dois boucler sur chaque feuille pour activer ou désactiver des protections.

VB:
Sub Bouton1_Cliquer()
Dim w As Worksheet
Dim Chemin As String
Dim Fichier As String
Chemin = "D:\Users\Rémi\Desktop\MPG\"
Fichier = Dir(Chemin & "Test*.xlsx", vbNormal)
Do While Fichier <> ""
    MsgBox Chemin & Fichier
    For Each w In Workbooks(Fichier).Sheets
    w.Protect Password:="********", AllowFiltering:=True
    Next
Fichier = Dir
Loop
End Sub

Le parcours des différents fichier fonctionne bien.

Mais cette ligne pose problème, avec une erreur d'éxécution 9, l'indice n'appartient pas à la selection :
VB:
For Each w In Workbooks(Fichier).Sheets

En plus la première itération fonctionne bien, mon premier fichier à bien toutes ses feuilles verrouillées...

L'erreur apparaît lors de la 2ème itération.

Si j'enlève la partie qui traite les feuilles, et que je laisse mon "MsgBox Chemin & Fichier", j'ai bien l'ensemble de mes fichiers qui s'affiche un par un.

Si je mets X fois en dur l'instruction "For Each w In Workbooks("Test_X.xlsx").Sheets", cela fonctionne.

Est-ce que quelqu'un à une idée de ce que je peux faire ?

Je vous remercie par avance et vous souhaite une bonne journée.

Rémi
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil, le forum

Dans ta boucle, tu n'ouvres jamais tes classeurs.
A mon avis, je dirai que cela est un problème manifeste

Retrouvé dans mes archives poussiéreuses
Ici c'est pour déprotéger les feuilles
A copier dans un module standard
VB:
'=>adapter le nom du chemin et du dossier
Const cStartFolder = "C:\Documents and Settings\Staple\NomDossierAvecClasseursADéprotéger" 
Const cFileFilter = "*.xlsx"
Const cPassword = "motdepasse " '<= mot de passe à adapter
Sub UnprotectAllWorksheets()
    Dim i As Long, j As Long, arr() As String, wkb As Workbook, wks As Worksheet

    ExtractFolder cStartFolder, arr()

    On Error Resume Next
    j = -1: j = UBound(arr)
    On Error GoTo 0

    For i = 0 To j
        Set wkb = Workbooks.Open(arr(i), False)
        For Each wks In wkb.Worksheets
            wks.Unprotect cPassword
        Next
        wkb.Save
        wkb.Close
    Next
End Sub

Sub ExtractFolder(Folder As String, arr() As String)
    Dim i As Long, objFS As Object, objFolder As Object, obj As Object

    Set objFS = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFS.GetFolder(Folder)

    For Each obj In objFolder.SubFolders
        ExtractFolder obj.Path, arr()
    Next

    For Each obj In objFolder.Files
        If obj.Name Like cFileFilter Then
            On Error Resume Next
            i = 0: i = UBound(arr) + 1
            On Error GoTo 0
            ReDim Preserve arr(i)
            arr(i) = objFolder.Path & Application.PathSeparator & obj.Name
        End If
    Next
End Sub
 
Dernière édition:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…