Userform avec champs de recherches/filtres

Oups, j'ai oublié de t'indiquer que j'ai ajouté un textbox commun aux boutons de commande.

Daniel

Je vais tester ça et te redis ces prochains jours. Mais déjà merci infiniment!

Lorsque j'utilise la macro d'importation que tu as modifiée avec mon fichier .csv, j'ai une erreur "Erreur d'exécution 13: Incompatibilité de type".

J'ai comparé le fichier .csv que je t'ai transmis et il y a une légère différence au niveau du format des heures (je ne sais pas si ça peut avoir une influence).

Dans le fichier que je t'ai transmis, j'avais mis le format "18.01.2023 14:12:13". Dans le fichier que j'utilise, le format est "18.01.2023 14:12". En gros il n'y a pas les secondes qui apparaissent sur mon fichier de travail. Est-ce que tu penses que l'erreur peut venir de là? Si oui, je pense que je dois corriger sur les lignes:

.Cells(6) = DateValue(Replace(Split(lineitems(5), " ")(0), ".", "/"))

.Cells(7) = TimeValue(Split(lineitems(5), " ")(1))

Mais de quelle manière?

Bonjour,

Est-ce que quelqu'un aurait la réponse à ma question précédente?

Merci d'avance!

Bonjour,

Je n'avais pas vu ton post de jeudi. Désolé. Sur quelle ligne se produit l'erreur ? Le mieux, si c'est possible, serait que tu postes le fichier csv.

Daniel

Pas de problème!

L'erreur se produit sur la ligne

.Cells(6) = DateValue(Replace(Split(lineitems(5), " ")(0), ".", "/"))

Voici un fichier .csv

9csv-copie.csv (3.60 Ko)

8modele.xlsm (42.53 Ko)

Bon, ce n'est pas grave. C'est parce que le fichier a une ligne d'entêtes, contrairement au précédent. Teste le classeur modifié.

Daniel

T'es trop fort, merci infiniment pour ton aide!

Encore une question par rapport aux filtres automatiques. La Textbox est pratique pour certains d'entres eux, toutefois pour la plupart, j'utilise des filtres "standard".

Par exemple, comment pour faire qu'un des boutons filtre automatiquement (sans textbox) selon certains caractères contenus dans ma cellule. J'ai essayé avec:

ActiveSheet.Range("A6").AutoFilter _
Field:=5, Criteria1:=Array("*J*", "*G*", "*H*", "*X*", "*W*"), Operator:=xlFilterValues

Cela fonctionne mais uniquement si je mets 2 critères. Au delà (comme dans l'exemple ci-dessus), mon filtre n'affiche plus rien...

Effectivement, ça ne fonctionne pas avec plus de deux arguments génériques. Il faudra procéder autrement. Dis-moi ce que tu veux précisément.

Daniel

Bonjour le fil,

Quand un fil est marqué comme résolu, merci de ne pas continuer dessus SVP

Ou alors désactivez la coche

Merci de votre compréhension

Je pense avoir trouvé un contournement sur le forum stackoverflow.com. Il faut mettre les composants de l'array dans un dictionnaire :

Sub hide_numbers()

    Dim criteriaDictionary As Object
    Set criteriaDictionary = CreateObject("Scripting.Dictionary")

    Dim criteriaArray As Variant
    criteriaArray = Array("*1*", "*2*", "*3*", "*4*", "*5*", "*6*", "*7*", "*8*", "*9*")

    Dim databaseWorksheet As Worksheet
    Set databaseWorksheet = Worksheets("DataBase")

    With databaseWorksheet

        Dim fieldIndex As Long
        fieldIndex = .Rows("1:1").Find(what:="Check_Column", lookat:=xlWhole).Column

        Dim currentCell As Range
        Dim currentItem As Variant
        For Each currentCell In .Range(.Cells(2, fieldIndex), .Cells(.Rows.Count, fieldIndex).End(xlUp)).Cells
            For Each currentItem In criteriaArray
                If currentCell.Value Like currentItem Then
                    criteriaDictionary(currentCell.Value) = ""
                    Exit For
                End If
            Next currentItem
        Next currentCell

        If criteriaDictionary.Count > 0 Then
            With .UsedRange
                .AutoFilter field:=fieldIndex, Criteria1:=criteriaDictionary.keys(), Operator:=xlFilterValues
            End With
        Else
            MsgBox "No records found!", vbExclamation
        End If

    End With

    Set criteriaDictionary = Nothing
    Set databaseWorksheet = Nothing

End Sub

Code à adapter à ton cas. précise ce que tu veux exactement comme filtre.

Daniel

Je recherche à faire un filtre qui agit de la sorte sur la colonne "N° de série":

1. Affiche que les cellules qui contiennent au moins une des lettres: G, H, J, K, L, N, P, R, S, T, X, Z.

2. N'affiche pas les cellules qui contiennent une des lettres: A, B, C, D, E, F, I, M, U, V, W

3. N'affiche pas les cellules dont le nombre de caractères est différents de 6

Pour illustrer, si j'ai le numéro de série XD6899, cela ne doit pas s'afficher car il ne rentre pas dans le critère 2. Par contre, si le numéro de série est XZ6899 alors il faudra qu'il soit affiché... C'est compréhensible?

J'ai ajouté les macros "Test" pour filtrer et "Affiche" pour effacer les lignes masquées.

Daniel

11modele-230302.xlsm (47.68 Ko)

Je t'avoue que je ne comprends rien à ce que tu as fait dans cette macro.... mais ça m'a tout l'air de fonctionner! Je teste encore ça ces prochains jours et te tiens au courant. Merci beaucoup!

Tout fonctionne, c'est top!!!

Si je peux encore abuser de ton temps... J'aimerais encore faire un dernier filtre de ce genre:

7 caractères, commence par les chiffres 1 ou 2, suivi par 3 lettres, suivi par 3 chiffres. En gros un format de ce genre: 1CUB123 ou encore 2BAY456. Saurais-tu comment faire?

Après j'arrête, promis...

Essaie la macro test1 sur la colonne O.

Daniel

10modele-230306.xlsm (47.77 Ko)

Correction :

Sub Test1()
  Dim C As Range, Tabl(), Test1 As Boolean, Test2 As Boolean
  Dim test3 As Boolean
  ActiveSheet.Cells.EntireRow.Hidden = False
  Tabl = Application.Transpose(ActiveSheet.ListObjects(1).DataBodyRange.Offset(, 14).Resize(, 1).Value)
  For I = 1 To UBound(Tabl)
    Test1 = False
    If Len(Tabl(I)) <> 7 Then Test1 = True
    If Left(Tabl(I), 1) <> "1" And Left(Tabl(I), 1) <> "2" Then Test1 = True
    For j = 2 To 4
      If Mid(Tabl(I), j, 1) < "A" Or Mid(Tabl(I), j, 1) > "Z" Then
        Test1 = True
        Exit For
      End If
    Next j
    For j = 5 To 7
      If Not IsNumeric(Mid(Tabl(I), j, 1)) Then
        Test1 = True
        Exit For
      End If
    Next j
    If Test1 = True Then Rows(I + 5).Hidden = True
  Next I
End Sub

Daniel

J'ai testé la macro. Elle fonctionne toutefois je n'avais pas tous les résultats (les cellules qui contiennent les lettres A et Z n'apparaissaient pas). En utilisant la fin de la macro, j'ai réussi à bricoler quelque chose concernant les lettres du milieu. J'ai mis

For j = 2 To 4
If IsNumeric(Mid(Tabl(i), j, 1)) Then
Test1 = True
Exit For

et cela fonctionne!

Même si la macro est lente à s'exécuter lorsque j'utilise des tableaux avec parfois 300'000 lignes, je gagne un temps énorme!

C'est vraiment la classe... Merci infiniment pour ton aide Daniel, tu ne te rends sûrement pas compte à quel point cela va me faciliter la vie :-)

Mon post de 10:54 a dû croiser le tien. J'avais corrigé l'erreur pour A et Z ainsi que pour la longueur du string. Sinon, ta correction est bonne, sauf si tu as des caractères spéciaux. On doit pouvoir accélérer la macro en copiant les valeurs de Test1 dans un tableau mémoire, puis en copiant le tableau dans une colonne et en filtrant celle-ci.

Daniel

Rechercher des sujets similaires à "userform champs recherches filtres"