Filtre de données ...acceptez vous les débutants?

Bonjour à tous, j’avais le projet naïf de rédiger une macro en VBA sur un tableur Excel pour filtrer des données d’une feuille d’un classeur en fonction des critères que je choisirais (pas nécessairement les mêmes à chaque fois).
Je pensais que c’était une démarche basique et que je trouverais un tuto pour débutant pour me guider pas à pas à pas…
j’ai créé un code mais il bloque en plusieurs endroits.
Comment dois-je procéder pour demander de l’aide sans être trop long? Expliquer le projet ? Mettre le classeur avec ce que j’ai déjà fait en pièce jointe et où? Copier le code que j’ai déjà rédigé dans une fenetre comme celle-ci ?
Merci à celui ou celle qui aura la gentillesse de me ramasser au bord de la route.

Cordialement
Quiceti

Bonjour
image

sauvegarde Portefeuille1.xlsm (26,6 Ko)

le projet est le suivant: je ne sais pas s’il faut le détailler (excusez la longueur du texte)

Nom de la macro FiltrerDonnees
Nom du classeur : « sauvegarde Portefeuille1.xlsm ».
Contient 2 feuilles de calcul appelées « contrats » et « résultats »
Chaque ouverture du classeur devra s’effectuer sur la feuille « contrats »

Dans la feuille de calcul : « contrats » on utilise un nombre illimité de cellules avec un nombre illimité de colonnes et de lignes.
La ligne numéro 1 permet d’attribuer un titre à chaque colonne.
Rôle de la macro
La macro devra filtrer des critères qui correspondent à des données présentes dans n’importe quelle cellule de la feuille "contrats » contenant des données. Ce pourront être des nombres, des dates, des textes, etc
Sélection des critères de filtre
Au lancement de la macro, une msgbox numéro 1 demande de définir en les écrivant dans la fenêtre de la même msgbox, tous les critères à filtrer existant dans la feuille « contrats », sans limite de nombre, sans casse particulière, de tous formats et séparés les uns des autres par une virgule. Le texte de la msgbox N°1 indiquera : «Inscrivez dans la fenêtre tous les critères que vous souhaitez filtrer en les séparant par une virgule »

Validation de la sélection par un bouton OK dans la même msgbox
Choix de la logique du filtre
Le fait de cliquer sur OK fait apparaitre une deuxième msgbox n°2 concernant le choix entre "et » et « ou » dans laquelle il y a 2 boutons
Intitulé des boutons : (« oui » et « non » ou si cela est possible un bouton « et » et un bouton « ou »).
Un texte explique : "en choisissant « oui » (ou « et ») le filtre sélectionnera uniquement les lignes dans lesquelles la totalité des critères sollicités seront présents simultanément, tandis qu’en choisissant « non » (ou « ou ») le filtre sélectionnera toutes les lignes dans lesquelles au minimum un critère sollicité sera présent.

déroulement du filtre en cas de réponse « oui » (« et »),

Si au moins une ligne contient la totalité des critères recherchés :
-copie de toutes ces lignes contenant la totalité des critères inscrits dans la msgbox 1

  • si l’action aboutit à la copie d’au moins une ligne, une msgbox n° 4 affichera le message « copie réussie ».
  • une fois la copie des lignes sélectionnées dans la feuille "contrats » effectuée,
  • ouverture de la feuille du classeur nommée « résultats »
  • effacement des données qu’elle contient s’il y en a, afin que la totalité des cellules de la feuille résultats soit vide.
  • collage sur la feuille « résultats », des lignes sélectionnées et copiées par le filtre dans la feuille « contrats » en commençant à la cellule A1
  • si des lignes contenant les paramètres recherchés sont collées dans la feuille « résultats » une message box n°5 indiquera "filtrage réussi», ce qui induira un retour à la feuille « contrats » par un bouton OK

si aucune ligne ne contient la totalité des critères recherchés une msgbox n°6 affichera le message: "il n’y a pas de données correspondant à votre recherche" et proposera un bouton "retour à la feuille « contrats ».

  • retour à la feuille « contrats » si ce bouton est activé
  • aucune ligne ne sera copiée

déroulement du filtre en cas de réponse « non » (« ou »), le modèle ci-dessus est repris de façon identique avec les différences logiques liées au choix.

Pour que vous ne pensiez pas que je nai pas essayé…Voici ce que j’ai écrit mais sans résultat :hot_face:

Sub FiltrerDonnees()
Dim val As String
Dim valeurs() As String
Dim i As Long
Dim criteres() As String
Dim lastRow As Long
Dim filteredSheet As Worksheet
Dim choix As Integer
Dim filtreEt As Boolean

val = InputBox("Entrez les valeurs à filtrer, séparées par des virgules", "Filtrer les données")

If val = "" Then
    Exit Sub
End If

choix = MsgBox("Voulez-vous rechercher les valeurs avec la logique 'et' (bouton Oui) ou la logique 'ou' (bouton Non) ?", vbQuestion + vbYesNo, "Filtrer les données")

If choix = vbYes Then
    filtreEt = True
Else
    filtreEt = False
End If

valeurs = Split(val, ",")
ReDim criteres(UBound(valeurs))

For i = 0 To UBound(valeurs)
    criteres(i) = "(*" & UCase(CStr(valeurs(i))) & "*)"
Next i

' Effacer les filtres existants
If ActiveSheet.AutoFilterMode = True Then
    ActiveSheet.AutoFilterMode = False
End If

' Filtrer les données

Dim contratsSheet As Worksheet    ' Définit la feuille "contrats" comme feuille de travail active

Set contratsSheet = Nothing

On Error Resume Next
Set contratsSheet = ThisWorkbook.Sheets(« contrats »)
On Error GoTo 0

If contratsSheet Is Nothing Then
MsgBox « La feuille de calcul « « contrats » » n’a pas été trouvée. »
Else
criteres = Array(« Critère 1 », « Critère 2 », « Critère 3 ») ’ Exemple de critères de filtrage
lastRow = contratsSheet.Cells(Rows.Count, 1).End(xlUp).Row ’ Détermine la dernière ligne contenant des données dans la colonne A
contratsSheet.Range(« A1 », contratsSheet.Cells(lastRow, contratsSheet.Columns.Count)).AutoFilter Field:=1, Criteria1:=criteres, Operator:=xlFilterValues ’ Filtre les données en utilisant les critères de filtrage
End If

    ' Copier les résultats filtrés dans une nouvelle feuille
    Set filteredSheet = ThisWorkbook.Sheets("Resultats")
    
    If Not filteredSheet Is Nothing Then
        filteredSheet.Cells.Clear
    Else
        Set filteredSheet = ThisWorkbook.Sheets.Add(After:=ActiveSheet)
        filteredSheet.Name = "Resultats"
    End If
    
    lastRow = contratsSheet.Cells(contratsSheet.Rows.Count, 1).End(xlUp).Row
   contratsSheet.Range("A1", contratsSheet.Cells(lastRow, contratsSheet.Columns.Count)).SpecialCells(xlCellTypeVisible).EntireRow.Copy filteredSheet.Range("A1")
    
    ' Ajuster la largeur des colonnes dans la nouvelle feuille
    filteredSheet.Columns.AutoFit
    
    ' Désactiver le filtre
   ThisWorkbook.ActiveSheet.AutoFilterMode = False

End Sub

Oops,
je me suis trompé dans le texte, il fallait lire : … * si des lignes contenant les paramètres recherchés sont collées dans la feuille « résultats » une message box n°5 indiquera "filtrage réussi», ce qui induira un retour à la feuille « résultats» par un bouton OK

Bonjour,
Monter un fichier avec tes demandes de critères multiples avec en plus des conditions (et/ou) est pour moi un peu tirer par les cheveux (surtout pour un débutant)
Inspire toi de cette vidéo trés bien expliquée qui te permettra d’effectuer une bonne quantité de ta demande sans se prendre la tête
https://www.google.com/search?q=vba+filtre+bdd+sur+plusieurs+criteres+de+choix&rlz=1C1HLDY_fr&oq=vba+filtre+bdd+sur+plusieurs+criteres+&aqs=chrome.2.69i57j33i160l2.17985j0j7&sourceid=chrome&ie=UTF-8

Bonjour , merci de ta réponse.
Je n’ai évidemment pas su apprécier la complexité de la demande ou du projet.
Ce n’est pas comme si j’étais débutant😉
Je vais regarder la vidéo que tu me proposes et reviendrai sur le forum ensuite.
A très bientôt
Quiceti

Ce sujet a été automatiquement fermé après 30 jours. Aucune réponse n’est permise dorénavant.