Boucle if et ou logique

Bonjour à toutes et à tous,

Je suis en train d’écrire un programme de recherche documentaire par nom, emplacement, date de création, date de modification et/ou auteur/propriétaire du fichier. A l'heure actuelle ma recherche s'effectue comme un OU logique alors que je voudrais que ce soit un ET logique. Je pourrais réécrire tous les If dans chaque If pour balayer tous les cas possibles et imaginables mais ça me paraît trop lourd pour qu'il n'y ait pas une autre méthode. Quelqu'un pourrait-il m'aider ?

Voici mes codes :

CODE 1 : Recherches de tous les fichiers du dossier 'dossier' qui peut être modifié manuellement

Dim i
Sub arborescence()
  Application.ScreenUpdating = False

  racine = "D:\Documents\n.dervaux\Documents\Mes images" 'Répertoire à parcourir

  If racine = "" Then Exit Sub

  'Réinitialise le tableau sur 20.000 lignes
  'Range("A2:E20000").ClearContents

  Set fs = CreateObject("Scripting.FileSystemObject")
  Set dossier_racine = fs.GetFolder(racine)

  i = 2 'numéro de la ligne à remplir

  Lit_dossier dossier_racine, 1

End Sub
Sub Lit_dossier(ByRef dossier, ByVal niveau)

   'Boucle sur tous les fichiers du répertoire
    For Each FileItem In dossier.Files
        'Inscrit le nom du fichier dans la cellule
        Sheets("Liste").Range("A" & i).Value = FileItem.Name
        'Ajoute un lien hypertexte vers le fichier
        ActiveSheet.Hyperlinks.Add Anchor:=Sheets("Liste").Range("A" & i), _
            Address:=FileItem.ParentFolder & "\" & FileItem.Name
        'Indique le type
        Sheets("Liste").Range("B" & i).Value = FileItem.ParentFolder
        'Indique la date deù création
        Sheets("Liste").Range("C" & i).Value = FileItem.DateCreated
        'Indique la date de dernière modification
        Sheets("Liste").Range("D" & i).Value = FileItem.DateLastModified
        'Indique le nom de l'auteur
        Sheets("Liste").Range("E" & i).Value = ActiveWorkbook.BuiltinDocumentProperties("Last Author") '.Value ?
        'Encadrer les cellules
        Sheets("Liste").Range("A" & i & ":E" & i).Borders.Weight = xlThin
        i = i + 1
   Next

   'Boucle sur tous les sous-dossiers du répertoire
   For Each d In dossier.SubFolders
     Lit_dossier d, niveau + 1
   Next

    'Nombre de fichiers
    Sheets("Liste").Range("I1").Value = i - 2 'on soustrait 2 car on ne commence pas à la première ligne [i-1] et lors du dernier passage dans la boucle i=i+1 (ce qu'on ne veut pas, d'où [(i-1)-1]

End Sub

CODE 2 : Sélection et copie des lignes qui correspondent à la recherche

Sub LancerRecherche()

    Dim MC1 As String
    Dim MC2 As String
    Dim MC3 As String
    Dim T As String
    Dim DCMin As Date
    Dim DCMax As Date
    Dim DMMin As Date
    Dim DMMax As Date
    Dim A As String
    Dim k As Long
    Dim j As Long
    Dim c As Long
    Dim v As Long

     Worksheets("Feuil1").Activate

    MC1 = Sheets("Feuil1").Range("B3").Value 'Récupère ce qui a été entré dans la case 'Mot-clé 1' et le stocke dans la variable MC1
    MC2 = Sheets("Feuil1").Range("C3").Value 'Récupère ce qui a été entré dans la case 'Mot-clé 2' et le stocke dans la variable MC2
    MC3 = Sheets("Feuil1").Range("D3").Value 'Récupère ce qui a été entré dans la case 'Mot-clé 3' et le stocke dans la variable MC3
    T = Sheets("Feuil1").Range("B4").Value 'Récupère ce qui a été entré dans la case 'Type' et lestocke dans la variable T
    DCMin = Sheets("Feuil1").Range("C5").Value 'Récupère ce qui a été entré dans la case 'Date de création min' et le stocke dans la variable DCMin
    DCMax = Sheets("Feuil1").Range("E5").Value 'Récupère ce qui a été entré dans la case 'Date de création max' et le stocke dans la variable DCMax
    DMMin = Sheets("Feuil1").Range("C6").Value 'Récupère ce qui a été entré dans la case 'Date de modification min' et le stocke dans la variable DMMin
    DMMax = Sheets("Feuil1").Range("E6").Value 'Récupère ce qui a été entré dans la case 'Date de modification max' et le stocke dans la variable DMMax
    A = Sheets("Feuil1").Range("B7").Value 'Récupère ce qui a été entré dans la case 'Auteur' et le stocke dans la variable A
    c = 0
    i = Sheets("Liste").Range("I1").Value

    If Sheets("Feuil1").Range("B3") = "" And Sheets("Feuil1").Range("C3") = "" And Sheets("Feuil1").Range("D3") = "" And Sheets("Feuil1").Range("C5") = "" And Sheets("Feuil1").Range("E5") = "" And Sheets("Feuil1").Range("E5") = "" And Sheets("Feuil1").Range("C6") = "" And Sheets("Feuil1").Range("E6") = "" And Sheets("Feuil1").Range("B7") = "" Then

        MsgBox "Veuilliez remplir au moins une case du tableau"

    End If

    Worksheets("Liste").Activate

    For j = 2 To i 'j va parcourir la liste de tout les fichiers référencés précédemment

        v = 0

        'MOTS-CLE
       If Sheets("Liste").Range("A" & j).Value Like "*" & MC1 & "*" Then
            k = 18 + c
            Sheets("Liste").Range("A" & j & ":E" & j).Copy Sheets("Feuil1").Range("A" & k & ":E" & k) 'Remplit la k-ième ligne du tableau de résultat
            v = v + 1

        'TYPE
        ElseIf Sheets("Liste").Range("B" & j).Value Like "*T" Then 'Détecte si le type du j-ème fichier est celui saisi dans les critères de recherche
            k = 17 + c
            Sheets("Liste").Range("A" & j & ":E" & j).Copy Sheets("Feuil1").Range("A" & k & ":E" & k) 'Remplit la case Type du tableu de résultats
            Sheets(Feuil1).Range("B" & k).Value = T
            v = v + 1

        'DATE DE CREATION
        ElseIf Sheets("Feuil1").Range("C5") <> "" Or Sheets("Feuil1").Range("E6") <> "" Then '/!\ Si une des deux dates n'est pas remplie
            If DCMin >= DC Or DCMax <= DC Then
                k = 17 + c
                Sheets("Liste").Range("A" & j & ":E" & j).Copy Sheets("Feuil1").Range("A" & k & ":E" & k) 'Remplit la case Date de création du tableu de résultats
                v = v + 1
            End If
        ElseIf Sheets("Feuil1").Range("C5") <> "" And Sheets("Feuil1").Range("E6") = "" Then 'Si uniquement la date min de création est renseignée
            If DCMin >= DC Then
                k = 17 + c
                Sheets("Liste").Range("A" & j & ":E" & j).Copy Sheets("Feuil1").Range("A" & k & ":E" & k) 'Remplit la case Date de création du tableu de résultats
                v = v + 1
            End If
        ElseIf Sheets("Feuil1").Range("E6") <> "" And Sheets("Feuil1").Range("C5") = "" Then 'Si uniquement la date max de création est renseignée
            If DCMax <= DC Then
                k = 17 + c
                Sheets("Liste").Range("A" & j & ":E" & j).Copy Sheets("Feuil1").Range("A" & k & ":E" & k) 'Remplit la case Date de création du tableu de résultats
                v = v + 1
            End If

        'DATE DE MODIFICATION
        ElseIf Sheets("Feuil1").Range("C6") <> "" And Sheets("Feuil1").Range("E6") <> "" Then 'Si les deux dates sont renseignées
            If DMMin >= DM Or DMMax <= DM Then
                k = 17 + c
                Sheets("Liste").Range("A" & j & ":E" & j).Copy Sheets("Feuil1").Range("A" & k & ":E" & k) 'Remplit la case Date de modification du tableu de résultats
                v = v + 1
            End If
        ElseIf Sheets("Feuil1").Range("C6") <> "" And Sheets("Feuil1").Range("E6") = "" Then 'Si uniquement la date min de modification est renseignée
            If DMMin >= DM Then
                k = 17 + c
                Sheets("Liste").Range("A" & j & ":E" & j).Copy Sheets("Feuil1").Range("A" & k & ":E" & k) 'Remplit la case Date de modification du tableu de résultats
                v = v + 1
            End If
        ElseIf Sheets("Feuil1").Range("E6") <> "" And Sheets("Feuil1").Range("C6") = "" Then 'Si uniquement la date max de modification est renseignée
            If DMMax <= DM Then
                k = 17 + c
                Sheets("Liste").Range("A" & j & ":E" & j).Copy Sheets("Feuil1").Range("A" & k & ":E" & k) 'Remplit la case Date de modification du tableu de résultats
                v = v + 1
            End If

        'AUTEUR
        ElseIf Sheets("Liste").Range("E" & j).Value Like A Then 'Détecte si l auteur du j-ème fichier est celui saisi dans les critères de recherche
            k = 17 + c
            Sheets("Liste").Range("A" & j & ":E" & j).Copy Sheets("Feuil1").Range("A" & k & ":G" & k) 'Remplit la case Auteur du tableu de résultats
            v = v + 1
        End If

        If v >= 1 Then
            c = c + 1
        End If

     Next

     Feuil1.Cells(15, 2).Value = c 'Nombre de résultats trouvés

     If c = 0 Then MsgBox "Aucun résultat ne correspond à votre recherche. Élargissez les recherches… (ex : supprimez des critères de recherche, rajoutez un auteur, augmenter la période…)"

     Worksheets("Feuil1").Activate 'Affiche la feuille de résultats

End Sub

bonjour

pourquoi du gros VBA ?

un filtre élaboré devrait suffire (quitte à le lancer avec du petit VBA )

Bonjour jmd,

pourriez-vous être plus explicite svp ?

Re bonjour,

et sii je ne gardais que les doublons ? Je devrais juste spécifier en plus de ne garder les doublons uniquement si au moins deux critères sont renseignés, non ?

re

joins un extrait de ton fichier et un exemple de recherche

Comment je fais ?... (j'ai honte de demander ça...)

re

sous sa zone de saisie des réponses, il y a un onglet joindre un fichier sur fond jaunasse

merci


Voici le fichier (enfin je crois)


mon fichier est trop volumineux...

re

ne fais qu'un fichier exemple, avec 20 lignes de données et un descriptif de la recherche à faire

Cette fois c'est la bonne !

re

voir zone de critères dans laquelle tu rentres les critères

puis menu Données Filtre avancé, cocher Copier vers un autre emplacement

Re jmd,

Je n'avais pas pensé à ça, c'est pratique ! En revanche, j'ai besoin que les utilisateurs (plus que novices avec excel) ne fassent qu'un nombre limité d'opérations. En effet les personnes n'ont que très peu de temps pour retrouver les documents et ne sont pas du tout à l'aise avec l'outil informatique...

re

essaye de faire une zone de saisie, un peu comme celle que tu as dans ton premier fichier

et dans la zone de critères, tu mets des = qui lisent les valeurs saisies

ceci dit, Excel n'est pas un bon outil pour des novices total en informatique, trop de risques de bidouillage, et pas assez de sécurisation. Sans compter la difficulté de travailler à plusieurs.

Rechercher des sujets similaires à "boucle logique"