IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

FileSearch sur Excel 2007 [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 11
    Points : 4
    Points
    4
    Par défaut FileSearch sur Excel 2007
    Bonjour à tous ! Je vous présente rapidement mon cas : je suis seconde année de DUT informatique. Pour valider mon diplôme, je termine l'année par un stage. On me demande de reprendre un programme VBA pour Excel. La 1ère version était codée pour Excel 2002 et 2003, et je dois l'adapter pour 2007.

    Jusqu'à maintenant, je n'ai rencontré aucun souci de compatibilité et tout marche correctement. Sauf que voilà, il fallait que ça arrive, j'ai (enfin ?) une erreur entre les versions : la fonction FileSearch des anciennes versions ne fonctionne plus sur 2007.

    J'ai cherché sur internet des solutions, et j'ai trouvé ceci :

    File Search ne fonctionne plus sous excel 2007. Voici une solution de contournement pour récupérer la liste des fichiers contenus dans un dossier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Public Function getDir(path As String, sortie As String) As Variant
     Dim fList() As String
     Dim iPosition As Long
     Dim iSize As Long
     Dim sFile As String
     Dim fRange As Excel.Range
     Const iIncrement As Long = 50
     
     iSize = iIncrement
     ReDim fList(1 To iSize)
     'vous pouvez indiquer *.* pour obtenir la liste de tous les fichiers ou filtrer par l'extension
     sFile = Dir(path & IIf(Right(path, 1) = "", "", "") & "*.xls")
     
     Do While Len(sFile)
     iPosition = iPosition + 1
     If iPosition > iSize Then
     iSize = iSize + iIncrement
     ReDim Preserve fList(1 To iSize)
     End If
     fList(iPosition) = sFile
     sFile = Dir
     Loop
     
     If iSize > iPosition Then
     ReDim Preserve fList(1 To iPosition)
     End If
     
     Set fRange = Range(sortie).Resize(iPosition, 1)
     fRange.Value = WorksheetFunction.Transpose(fList)
     fRange.Sort key1:=fRange.Cells(1), order1:=xlAscending
     getDir = fRange.Value
     
     End Function
    pour utiliser cette fonction depuis une macro, en utilisant l'adresse du répertoire située en A1 et pour restituer la liste des fichiers dans en E1, E2 ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub FileSearch2007()
     Dim v As Variant
     v = getDir(Feuil1.Cells(1, 1), "E1")
    end sub
    Si tu as besoin en plus de lister les sous répertoires utilise plutôt cette macro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Public Ligne As Long
     
    Sub RechercheFichiers()
       Ligne = 0
       racine = "e:\donnees\daniel\mpfe" 'Mets ici ton dossier pricipal
       Set fso = CreateObject("Scripting.FileSystemObject")
       Set dossier_racine = fso.getfolder(racine)
       Lit_dossier dossier_racine
    End Sub
    Sub Lit_dossier(ByRef dossier)
      For Each d In dossier.SubFolders
        Lit_dossier d
      Next
      For Each f In dossier.Files
           Ligne = Ligne + 1
           ActiveSheet.Hyperlinks.Add Cells(Ligne, 1), f.Path, 
    TextToDisplay:=f.Name
           'Cells(Ligne, 1) = f.Path
      Next
    End Sub
    La solution me parait bien compliquée par rapport au code de mon employeur...qui elle, tient en 3 lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Set fs = Application.FileSearch
     
    With fs
        .MatchTextExactly = True
        .Filename = nomcherche
     
        If .Execute > 0 Then
            MsgBox "Ce nom existe déjà " & .FoundFiles.Count & _
                " fiche(s) trouvée."
            For i = 1 To .FoundFiles.Count
    '            MsgBox .FoundFiles(i)
            Next i
        Else
    '        MsgBox "Création " & nomcherche
    ' on crée maintenant la fiche technique
            chemin_ftm = chemindonnees + "0FICHE TECHNIQUE MODELE.xls"
     
            Workbooks.Open Filename:=chemin_ftm
            Range("F2").Select
            ActiveCell = nomfiche
            Range("f5").Select
            Etc...
    A la place du "etc", on a la suite du "remplissage" de la table, donc rien ne change ici selon les versions, c'est pas le problème.

    Je n'arrive pas trop à voir la ressemblance entre la solution trouvée sur le net et le code de mon employeur. Je voudrais donc savoir s'il existe une fonction de recherche toute bête dans Excel 2007 pour éviter d'avoir à créer cinquante mille fonctions supplémentaires. Je souhaiterais une fonction qui fait une simple recherche par nom de fichier dans un seul et même dossier (toutes les fiches techniques sont sauvegardées dans le même dossier, il n'y a pas de sous dossier, d'autre dossier, etc...).

    Je vous remercie d'avance pour vos solutions.

  2. #2
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonsoir,
    je ne regarde pas ton code mais t'en envoies un, analyses le et adaptes à ton cas, mais il faut auparavant installer le composant classefilesearch que tu trouveras ici
    http://silkyroad.developpez.com/vba/classefilesearch/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Private Sub partienom_Change()
    Dim i As Long, stmessage As String
    '---------------------------------------------------------------------------------------------
    ListBoxARCHIVES.Clear
    nomfeuil = ActiveSheet.Name
    Set Recherche = ClFileSearch.Nouvelle_Recherche
    r = ThisWorkbook.Path & "\" & "archives_" & nomfeuil
    With Recherche
        'répertoire pour lancer la recherche
        .FolderPath = r
        'inclu les sous-dossiers dans la recherche
        .SubFolders = True
        'Option de tri:
        '(Sort_None, sort_Name, sort_Path, sort_Size, sort_DateCreated, sort_LastModified, sort_Type)
        'Pas de tri si le paramètre n'est pas spécifié.
        .SortBy = sort_DateCreated
        .Extension = "*" & partienom & "*.pdf"
        'procède à la recherche et capture le nombre de fichiers trouvés
        inombre = .Execute
        stmessage = VBA.Format(inombre, "0"" fichiers trouvés""")
        For i = 1 To .FoundFilesCount
            nom = .Files(i).strfileName
            'nom2 = .Files(i).strpathName & "\" & nom
            ListBoxARCHIVES.AddItem nom 'nom du fichier
        Next i
    End With
     
        If inombre = 0 Then
            MsgBox "0" & " fichier trouvé"
        End If
     
    End Sub
    bon courage
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Alors, j'ai également trouvé cette solution. Toutefois, elle ne correspond pas à ce que mon employeur réclame. En effet, ce programme sera diffusé à ses clients, et le programme seul. Si tous les utilisateurs doivent installer un composant supplémentaire et l'activer, je vais me faire taper sur les doigts car c'est tout sauf pratique, surtout pour l'utilisateur lambda.

    Résultat...bien compliqué pour peu de chose. Je ne comprend pas qu'une simple fonction de recherche ne soit pas livrée avec Excel...c'est assez surprenant :/

    Merci tout de même pour le lien (que je connaissait déjà en fin de compte), mais cela ne correspond pas à ma demande :/

  4. #4
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Je viens de voir ce fichier joint qui pourrait peut-etre te donner des idées
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Hum...je vais étudier ça, je vous redis demain ou jeudi ce qu'il en est (demain, je ne suis pas sûr de pouvoir m'occuper de ça, je dois partir en déplacement avec mon employeur). Merci encore !

  6. #6
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 696
    Points
    6 696
    Par défaut
    Bonjour,

    c'est bien de donner ton niveau, sinon c'est bien aussi de donner ce qui ne va pas, le nec serait d'y ajouter précisément ce que tu veux faire...

    Si c'est détecter si un dossier ou fichier existe pour renvoyer un message si oui ; ou le créer si non, tu peux faire appel aux bonnes vielles commandes MsDos ou assimilées avec un mixte du FSO qui reste compatible.

    pour te donner une piste, je te joint des exemples qui tournent piqués dans une de mes applis, mais vu ton environnement, tu dois voir le parallèle, sinon redemande

    Routine appelée pour lors de la création client, créée les dossiers et sous dossiers voulus avec tranferts de modèles ad-hoc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Sub CreaDosEtTransContainer(ByVal strCible As String, ByVal Chemcreados As String)
    Dim I As Integer
    Dim J As Integer
    Dim W As Integer
    Dim tabNomdos As Variant
    Dim strDosACop As String
    Dim pp
    Dim xfso As New FileSystemObject
    Dim objFold 'As Folder
    Dim objFichier As File
     
    tabNomdos = Array("CORRESPONDANCES", "ANALYSES", "PROPALS", "RENDEMENT COMMERCIAL")
     
    MkDir Chemcreados 'crée le dossier  Chemcreados passé en argument
        For W = 1 To UBound(tabNomdos) 'crée les sous dossiers fixes + argument
            MkDir Chemcreados & "\" & tabNomdos(W) & "--" & strCible
        Next W
     
    For I = 1 To UBound(tabNomdos)
        Set objFold = xfso.GetFolder(gvStrChemS0 & gvStrChemS8 & gvStrChemS9 & gvStrChemS11 & "Container " & tabNomdos(I) & "\") 'renvoie le dossier à traiter
        For Each objFichier In objFold.Files
                objFichier.Copy (Chemcreados & "\" & tabNomdos(I) & "--" & strCible & "\")
        Next objFichier
    Next I
    Set objFold = Nothing
    Set objFichier = Nothing
    End Sub
    Fonction qui évite les doublons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Function DoublonsDos(ByVal strCible As String, ByVal bytNbTestDoublon As Byte, Optional ByVal Chemcreados As String, Optional ByVal lstChoixCcialTrsft As String) As Boolean
    Dim Chemcreados2 As String
     
    DoublonsDos = True
    Select Case bytNbTestDoublon
        Case 1
            Chemcreados2 = Chemcreados & Mid(gvStrChemS5, 1, Len(gvStrChemS5) - 5) & "_" & lstChoixCcialTrsft & "\" & strCible
            If Dir(Chemcreados2, vbDirectory) <> "" Then MsgBox "Ce dossier existe déjà dans le répertoire Prospects de la cible." _
             & vbCrLf & vbCrLf & "Vérifiez vos données et recommencez ou abandonnnez", , gvStrCliS: DoublonsDos = False: Exit Function
            Chemcreados2 = Chemcreados & Mid(gvStrChemS6, 1, Len(gvStrChemS6) - 5) & "_" & lstChoixCcialTrsft & "\" & strCible
            If Dir(Chemcreados2, vbDirectory) <> "" Then MsgBox "Ce dossier existe déjà dans le répertoire Clients de la cible" _
             & vbCrLf & vbCrLf & "Vérifiez vos données et recommencez ou abandonnnez", , gvStrCliS: DoublonsDos = False: Exit Function
            Chemcreados2 = Chemcreados & Mid(gvStrChemS7, 1, Len(gvStrChemS7) - 5) & "_" & lstChoixCcialTrsft & "\" & strCible
            If Dir(Chemcreados2, vbDirectory) <> "" Then MsgBox "Ce dossier existe déjà dans le répertoire Contacts de la cible" _
             & vbCrLf & vbCrLf & "Vérifiez vos données recommencez ou abandonnnez", , gvStrCliS: DoublonsDos = False: Exit Function
        Case 2
            Chemcreados = gvStrChemS0 & gvStrChemS1 & gvStrChemS2 & gvStrChemS3 & gvStrChemS5 & strCible
            If Dir(Chemcreados, vbDirectory) <> "" Then MsgBox "Ce dossier existe déjà dans le répertoire Prospects." _
             & vbCrLf & vbCrLf & "Vérifiez vos données et - ou changez le nom dans la case ""nom du dossier serveur"" et recommencez ou abandonnnez", , gvStrCliS: DoublonsDos = False: Exit Function
            Chemcreados = gvStrChemS0 & gvStrChemS1 & gvStrChemS2 & gvStrChemS3 & gvStrChemS6 & strCible
            If Dir(Chemcreados, vbDirectory) <> "" Then MsgBox "Ce dossier existe déjà dans le répertoire Clients" _
             & vbCrLf & vbCrLf & "Vérifiez vos données et - ou changez le nom dans la case ""nom du dossier serveur"" et recommencez ou abandonnnez", , gvStrCliS: DoublonsDos = False: Exit Function
     '.../... ect...
    End Select
     
    End Function
    Celles-ci sont appelées dans divers endroits du code genre..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub cmdCreaProspect_Click()
    '.../...
    If DoublonsDos(strCible, bytNbTestDoublon) = False Then Exit Sub
    '.../...
    Case "ListSus"
            Chemcreados = gvStrChemS0 & gvStrChemS1 & gvStrChemS2 & gvStrChemS3 & gvStrChemS5 & strCible
    '.../...
            Call CreaDosEtTransContainer(strCible, Chemcreados)
    '.../...
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Houla, que d'aide d'un coup !

    Alors, je m'excuse de n'avoir spécifié toutes ces informations. Pour vous répondre :

    - je débute totalement dans le VB/VBA

    - ce qui ne va pas, c'est la fonction FileSearch qui ne fonctionne plus dans Excel 2007

    - ce que je cherche à faire : si je suis en train de créer une fiche technique, lorsque j'appuie sur "créer", s'enclenche alors la macro que j'ai cité ci dessus. Je suis sensé vérifier dans le dossier où sont stockées les fiches techniques qu'une fiche du même nom n'existe pas déjà, et si c'est le cas, la créer. Sinon, afficher un message d'erreur et ne rien créer.

    Voilà en fait pourquoi je ne cherche qu'une simple fonction de recherche : je souhaite vérifier que dans le dossier de sauvegarde, la fiche que j'essaye de créer n'existe pas déjà. L'enregistrement marche, seule la vérification (la recherche dans le dossier quoi) ne fonctionne pas (normal, FileSearch n'est pas pris en compte). Je cherche juste un équivalent à FileSearch quoi :/

  8. #8
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 696
    Points
    6 696
    Par défaut
    bonjour,

    décortique ce qui t'es donné ; plus simple sinon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Dir(gvStrChem0 & gvStrChem1 & gvStrChem3 & "Liste Suspects-" & Cell3 & ".xls") = "" Then
         MsgBox "La Liste concernant " & Cell3 & " n'existe pas, ses données ne seront pas ventilées", , gvStrCli 
    End If
    voir ici aussi

    cordialement,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Hum, la solution microsoft m'a l'air simple et c'est exactement le genre de chose que je recherche, vraiment une fonction toute bête qui dit si oui ou non un fichier dont on connait le nom existe dans un répertoire dont on fourni la destination.

    Je verrais ça quand je peux, là il est un peu tard. Merci encore, je vous tiens au courant de mes avancés.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    la solution donné sur le lien Microsoft marche parfaitement bien, toutefois, je crois qu'elle n'est adapté que pour une recherche dans le répertoire courant. N'ayant besoin que de ce type de recherche (tous mes fichiers sont et seront stockés dans le même dossier), je n'ai pas poussé mes recherches plus loin concernant la fonction "Dir".
    Mais dans mon cas, c'est LA solution parfaite.

    Merci encore pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. FileSearch sous Excel 2007
    Par laurent.mario dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/10/2007, 19h01
  2. Equivalent de Application.FileSearch sur Excel 2007
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/10/2007, 17h09
  3. Barre d'erreur et graphiques sur Excel 2007
    Par Killerboy dans le forum Excel
    Réponses: 4
    Dernier message: 08/08/2007, 16h23
  4. Pb d'insertion d'image avec une macro sur Excel 2007
    Par tigrou42 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/05/2007, 00h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo