Date dans userform

Bonjour mferrand, oui c'est bien là le problème de récupérer la date car c'est elle qui conditionne le tri par la suite.

Le fichier joint est en fait un bout du fichier d'origine.

Le but étant de pouvoir valider des actions qui seront ensuite trier par date et type d'action pour fournir des éléments comptable.

C'est pourquoi la date est très importante.

Après le format en lui même je m'en fout un peut : "dd/mm/yy" ou "dd/mm/yyyy" ou voir même un chiffre.

Ce qui m'importe c'est que lorsque je valide l'userform, excel reconnaisse la date lorsque je filtre mes données du tableau.

Voila j’espère être clair dans mes explications et je vous remercie de vous pencher sur mon problème.

Du coup, je vois que c'est un poil compliquer, donc pour simplifier le truc, pensez vous qu'il serait plus simple de mettre dans la macro "filtre" une ligne au départ qui prend une cellule de valeur 1 et par collage spécial, on multiplie avec la colonne A.

En ne sélectionnant que les cellules pleines, et remettre le format de date?

Merci

Bonjour,

Manifestement ... le sujet a beaucoup évolué ...

Peux-tu joindre... avec l'aide de ton fichier ... un exemple qui illustre exactement ce que tu veux accomplir ...

Ok j'essaie de faire cela

Voila je vous joint un fichier avec le vrai userform et les vrai pages à quelles details pret car il y a plusieurs cultures.

Donc le souhait : saisir via l'userform une action de pulvérisation dans les champs.

Cette action est stocké dans la liste.

Après plusieurs action le but est sur la page répartitions de ventiler les données par cultures.

Donc avec le bouton filtre je filtre les produits par action et sans doublons.

Puis grâce aux formules je retrouve les produits sur chaque culture et détermine ainsi le prix par culture.

Donc pour filtrer il me faut impérativement une date valide.

J’espère être clair et en tout cas merci à tous de bien vouloir m'aider.

3classeurv3.xlsm (34.16 Ko)

Bonjour,

Je n'ai pas travaillé sur ton dernier fichier, désolé ! Tu adapteras...

Voilà ce que je préconise pour ton Userform (en l'état de réalisation, car il faudra revoir si tu le complètes...)

Private Sub CommandButton1_Click()
    Dim Lgi(5), lg%, i%
    Lgi(0) = CDate(TextBox1.Value)
    For i = 1 To 4
        Lgi(i - (i > 2)) = Controls("TextBox" & i + 1).Value
    Next i
    With Sheets("liste")
        lg = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
        .Cells(lg, 1).Resize(, 6) = Lgi
        .Cells(lg, 6) = .Cells(lg, 6) * 1
    End With
    MsgBox "Ligne ajoutée à liste.", vbInformation, "Insertion"
    For i = 1 To 5
        Controls("TextBox" & i).Value = ""
    Next i
    TextBox1.SetFocus
End Sub

Principales modifications :

  • Affectation utilisant un tableau : on sert le tableau, on affecte le tableau à la feuille (et non affectation directe cellule par cellule...)
  • La date est convertie... !
NB- Test à la saisie pour vérifier que la date sera reconnue comme date :
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    If TextBox1.Value = "" Then Exit Sub
    If Not IsDate(TextBox1.Value) Then
        MsgBox "Saisir une date valide !", vbExclamation, "Date invalide"
        Cancel = True
    End If
End Sub

- L'affectation des autres éléments en boucle au tableau se heurte à une petite difficulté : les valeurs des TextBox 2, 3, 4, 5 doivent être affectées aux éléments de tableau 1, 2, 4, 5, ta colonne type de la base ne correspondant à aucune TextBox. On fait donc une boucle de 1 à 4 (4 éléments à affecter), mais on affecte l'élément i - (i >2) du tableau [on pondère i par une expression booléenne qui va renvoyer 0 pour i=1 et 2 et -1 pour i=3 et 4], ce qui fait donc affecter les éléments 1, 2, 4, 5 (en sautant le 3). Parallèlement, la valeur affectée est celle de la textBox i+1, donc 2 à 5...

Evidemment, si tu introduisais une nouvelle TextBox pour saisir le Type, il faudra modifier ce montage !

- Recherche de la ligne et affectation dans la foulée. Une ligne supplémentaire pour que la quantité en dernière colonne demeure bien un nombre. Ici la multiplication par 1 te garantit en cas de saisie décimale, quel que soit le séparateur utilisé (. ou ,) que le résultat sera un nombre.

- Petit ajout d'un message de confirmation, que tu peux supprimer si ça te dérange... et réinitialisation (vidage des TextBox) pour que tu puisses recommencer une saisie dans la foulée.

Petite modification à opérer sur ton fichier réel : ajuster l'ordre de tabulation, faire passer les bouton en queue, de façon que TextBox1 ait le focus à l'ouverture.

Pour ce qui est du filtre, j'ai déjà dit que je ne comprenais pas ta façon de faire, mais je n'ai rien modifié. Je me suis contenté d'épurer un peu le code :

Sub filtre()
    With Sheets("repartition")
        Sheets("liste").Range("A1:F28").AdvancedFilter xlFilterCopy, .Range("Q7:S8"), _
         .Range("A15")
    End With
End Sub

Evidemment, suppression du dernier argument à True ! Tu n'es pas dans un cas où tu filtres une colonne pour en extraire une liste d'éléments uniques ! C'est la base que tu filtres (même si tu n'affiches qu'une colonne), et l'argument doit rester à sa valeur False par défaut. Tu ne peux d'ailleurs en principe pas avoir de doublon sur la totalité des champs de la base...

Cordialement.

Merci le boulot que tu as fait est parfait. Je voyais l'affaire beaucoup plus simple mais visiblement sans votre aide j'aurais laisser tomber.

Un grand merci à vous.

Je vais tester sur mon fichier ça devrait le faire.

Rechercher des sujets similaires à "date userform"