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 SubCODE 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 Subbonjour
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.