[Excel VBA] recherche fichier en lecture seul

kimclem Messages postés 13 Statut Membre -  
tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour bonjour
je vous contacte car j'ai un petit souci,
J'ai une grande quantité de fichiers à modifier.
Tout les fichiers se trouvent dans des dossiers et sous dossiers, je voudrais faire une macro pour ouvrir les fichiers de ces dossiers et sous dossiers les uns apres les autres ( pas en même temps ...) afin de les traiter.
j'ai tenter d'utiliser la fonction dir, mais il semblerait qu'elle ne fonctionne pas lorsque les documents sont en lecture seule et je ne peux pas modifier cette propriété.
Je me suis renseigner sur les FSO mais à moins d'avoir mal lu je ne trouve pas ce que je recherche.
Par avance merci pour l'aide que vous pourrez me donner

Clément

8 réponses

  1. kimclem Messages postés 13 Statut Membre
     
    pas de solution ? :(
    0
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Salut,
    Peut être une piste ici
    Cordialement,
    0
  3. kimclem Messages postés 13 Statut Membre
     
    j'ai effectivement regarder et étudier ton code mais il semblerait que ce n'est pas possible d'utilser la fonction FileSearch sous 2007
    par avance merci pour chaque réponse, si je trouve quelque chose je vous en fait part
    0
  4. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Bonjour,

    Un petit exemple de code à adapter :

    Public Sub searchAllFiles()
    Dim myTabFolders()
    Dim myTabFiles
    Dim sChemin As String
    Dim i As Long
    Dim j As Long
    
    sChemin = "C:\Mon repertoire"
    
        If subFolderInFolder(sChemin, myTabFolders()) = False Then
            MsgBox "Erreur"
        Else
            For i = LBound(myTabFolders()) To UBound(myTabFolders())
                If AllFilesInFolder(myTabFolders(i), myTabFiles()) = False Then
                    MsgBox "Erreur"
                Else
                    For j = LBound(myTabFiles(j)) To UBound(myTabFiles(j))
                        Call FonctionQuiTraiteLeFichier(myTabFiles(j))
                    Next j
                End If
            Next i
        End If
    
        
        
    End Sub
    
    '*********************************************************************
    ' Fonction qui renvoie la liste de tous les fichier d'un répertoire
    ' Nécessite la référence Microsoft Scripting Runtime
    '*********************************************************************
    
    Public Function AllFilesInFolder(ByVal NomDossier As String, ByRef myTab, Optional ByVal ExtentionType As String) As Boolean
    Dim fso As Object, dossier As Object, Fich As Object
    Dim Files As Object, File As Object
    Dim max As Long, ext As String
    
        'Initialisation du tableau
        ReDim myTab(0)
        '
        ' Création de l'objet FSO
        On Error Resume Next ' AllFilesInFolder_Error
    
        Set fso = CreateObject("Scripting.FileSystemObject")
        ' Si le nom du dossier est vide, alors je sort de la fonction
        If NomDossier = "" Then Exit Function
        ' Stock les sous-répértoires dans l'objet dossier
        Set dossier = fso.GetFolder(NomDossier)
        
        ' stock dans l'objet Files tous les fichiers de l'objet dossier
        Set Files = dossier.Files
        ' s'il y a plus d'un fichier
        If Files.Count <> 0 Then
            max = 0
            ' pour tous les objets fichiers dans l'objet files
            For Each File In Files
              '
              ' je récupère le nom du fichier via l'objet Fich
              Set Fich = fso.GetFile(File)
              ' si l'extension n'est pas renseignée
              ext = ExtentionType
              If ExtentionType = "" Then ext = fso.GetExtensionName(File)
              '
              If UCase(fso.GetExtensionName(File)) = UCase(ext) Then
                max = max + 1
                ' j'augmente la taille de mon tableau résultat
                ReDim Preserve myTab(1 To max)
                ' Je stock en fin de tableau mon nom de fichier
                myTab(max) = File
              End If
            Next
            ' Je retourne le tableau complet des nom de fichiers
        End If
        '
        ' Libère tous les objets
        Set fso = Nothing
        Set dossier = Nothing
        Set Fich = Nothing
        Set Files = Nothing
        Set File = Nothing
        '
        
        If Err.Number = 0 Then
            AllFilesInFolder = True
            Exit Function
        Else
            AllFilesInFolder = False
        End If
        
    End Function
    
    '*********************************************************************
    ' Fonction qui renvoie la liste de tous les sous-répertoires d'un répertoire
    ' Nécessite la référence Microsoft Scripting Runtime
    '*********************************************************************
    
    Public Function subFolderInFolder(ByVal dossier As String, ByRef myTab) As Boolean
    Dim fso As FileSystemObject, monDossier As Folder, sousdossier As Folder
    Dim max As Long
    ReDim myTab(0)
    
        On Error Resume Next ' subFolderInFolder_Error
    
    Set fso = New FileSystemObject
    Set monDossier = fso.GetFolder(dossier)
        
        For Each sousdossier In monDossier.subFolders
            max = max + 1
            ' j'augmente la taille de mon tableau résultat
            ReDim Preserve myTab(1 To max)
            ' Je stock en fin de tableau mon nom de fichier
            myTab(max) = sousdossier
        Next
    
    
        If max = 0 Then
            subFolderInFolder = False
            Exit Function
        Else
            subFolderInFolder = True
        End If
    
    End Function
    


    Bon courage

    ;o)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    Bonjour,
    avec WMI et FSO (WMI permet d'éviter l'utilisation d'un fonction récursive FSO....tout comme office.filesearch ;) ) :
    ce code cherche ts les fichier en lecture seule sur C:\TEST et modifie cet attribut.
    Const READ_ONLY = 1
    
    strComputer = "."
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    
    Set colFiles = objWMIService.ExecQuery("Select * from CIM_DataFile where Path = '\\TEST\\' " & "AND Drive = 'C:' AND Writeable = FALSE")
    
    For Each objFile In colFiles
        Set objReadOnlyFile = objFSO.GetFile(objFile.Name)
        objReadOnlyFile.Attributes = objReadOnlyFile.Attributes Xor READ_ONLY 
    Next
    0
  7. kimclem Messages postés 13 Statut Membre
     
    Merci Tompols,
    Par contre je ne souhaite pas et ne peux pas modifier l'attribut lecture seule, je voulais contourner le souci.
    Je continue de regarder la piste WMI et FSO voir si cela peut m'aider.
    Merci de ta réponse en tout cas
    Clément
    0
  8. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    OK, c'est le "afin de les traiter" qui m'a fait penser que tu modifiais ces fichiers....Ds ce cas, suffit d'adapter le requete WMI pour obtenir la liste des fichiers(elever la clause "AND Writeable = 'FALSE'")....Tu peux aussi jeter un oeil ici (avec Office.filesearch) : https://forums.commentcamarche.net/forum/affich-481223-vba-liste-de-tous-les-fichiers-du-disque#4
    Bonne journée
    0
    1. kimclem Messages postés 13 Statut Membre
       
      Merci de prendre tout ce temps pour moi , je regarde ce que tu m'as dit pour le WMI ( qui est une découverte pour moi )
      mais pour office.filesearch, visiblement cela ne marche plus en VBA office 2007
      elle a été enlevé ou je ne sais pas trop
      je te tiens au courant :)
      0
  9. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    alors pour wmi : https://docs.microsoft.com/en-us/windows/win32/wmisdk/wmi-start-page?redirectedfrom=MSDN
    qqes exemples de scripts : http://www.microsoft.com/downloads/details.aspx?FamilyID=b4cb2678-dafb-4e30-b2da-b8814fe2da5a&DisplayLang=en
    et un ptit outil : http://www.microsoft.com/downloads/details.aspx?FamilyID=2cc30a64-ea15-4661-8da4-55bbc145c30e&displaylang=en
    bonne découverte ;)
    0