[Excel VBA] recherche fichier en lecture seul

Fermé
kimclem Messages postés 12 Date d'inscription jeudi 13 mars 2008 Statut Membre Dernière intervention 19 août 2009 - 4 août 2009 à 14:41
tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 - 6 août 2009 à 11:42
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
A voir également:

8 réponses

kimclem Messages postés 12 Date d'inscription jeudi 13 mars 2008 Statut Membre Dernière intervention 19 août 2009
4 août 2009 à 16:29
pas de solution ? :(
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752
4 août 2009 à 16:35
Salut,
Peut être une piste ici
Cordialement,
0
kimclem Messages postés 12 Date d'inscription jeudi 13 mars 2008 Statut Membre Dernière intervention 19 août 2009
5 août 2009 à 15:26
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
5 août 2009 à 15:52
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 435
5 août 2009 à 15:53
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
kimclem Messages postés 12 Date d'inscription jeudi 13 mars 2008 Statut Membre Dernière intervention 19 août 2009
6 août 2009 à 10:37
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
tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 435
6 août 2009 à 11:27
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
kimclem Messages postés 12 Date d'inscription jeudi 13 mars 2008 Statut Membre Dernière intervention 19 août 2009
6 août 2009 à 11:33
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
tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 435
6 août 2009 à 11:42
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