Dates dans formulaire

Bonjour,

Ci-joint un formulaire tout simple qui permet de reporter une plage de données de la colonne C à la colonne L. Lorsque la plage saisie contient des lettres ça fonctionne, mais ça ne fonctionne pas quand il s'agit de dates...Comment faire ?

En attente de vos solutions.

Dadams51

13formulaire.xlsm (21.10 Ko)

Bonsoir,

Une TextBox contient du texte, et non une date, type de données particulier, et qui est stocké sous forme de nombre.

Tu déclares donc 2 variables de type Date, tu leur affectes la valeur des TextBox en les convertissant en dates avec CDate, et tu opères avec ces variables et non les TextBox...

Cordialement.

Bonsoir MFerrand,

D'accord pour le principe mais quel est le code avec CDate ?

Dadams51

Tu ne fais pas beaucoup d'effort ! J'avais pratiquement tout indiqué...

Mais si je dois entrer dans ton code, alors je réécris tout !

1) Pour avoir une indentation adéquate et systématique, telle qu'elle me convient, respectant tout les alignements d'instructions, un retrait initial de tout le code interne à la procédure sauf étiquettes de branchement, et pas de lignes sautées...

2) Déclarer toutes les variables.

3) Qualifier toutes les expressions (jamais de Range ou Cells sans référence à la feuille).

4) Introduire les éléments qui me paraissent manquants.

5) Modifier selon ce qui me paraît convenir le mieux... (je détaillerai plus loin).

Private Sub CommandButton1_Click()
    Dim d(1 To 2) As Date, i%
    For i = 1 To 2
        With Controls("TextBox" & i)
            If IsDate(.Value) Then
                d(i) = CDate(.Value)
            Else
                MsgBox "Saisir une date valide !", vbExclamation, "Date invalide"
                .Value = "": .SetFocus: Exit Sub
            End If
        End With
    Next i
    i = 2
    With ActiveSheet
        .Range("L2").CurrentRegion.Offset(1).ClearContents
        Do While .Cells(i, 3) <> ""
            If .Cells(i, 3).Value = d(1) Then
                Do While .Cells(i, 3) <> d(2) And .Cells(i, 3) <> ""
                    .Cells(i, 12) = .Cells(i, 3)
                    i = i + 1
                Loop
                .Cells(i, 12) = .Cells(i, 3)
            End If
            i = i + 1
        Loop
    End With
End Sub

J'ai substitué Do... Loop à While... Wend car quand j'ai débuté en VBA (il y a plus de 20 ans), Microsoft déclarait déjà cette instruction désuète et remplacée par Do... Loop qui fait la même chose en offrant plus de possibilité. J'ai donc toujours utilisé Do... Loop sans avoir à m'en plaindre et si j'écris, c'est ce que je fais...

Toute la fin de mon message à disparue ! Je vais devoir le réécrire !

Je complète donc mes commentaires :

J'ai retenu une variable tableau à 2 éléments pour recueillir les dates, au lieu de 2 variables, car en matière de dates il est toujours bon de tester si la saisie sera bien reconnue comme date, et si elle ne l'est pas la faire ressaisir. Le test devant se faire pour les deux, on le fait en boucle pour éviter de l'écrire deux fois, et la variable tableau est plus commode dans ce cas.

J'efface également la zone de réception... Cela me paraissait logique.

Je n'ai pas touché à ta façon d'opérer : tests d'égalité : = et son opposé <>. Mais je te fais remarquer que si la date saisie en 1 ne figure pas en col. C il ne se passera rien ! Si elle figure mais que la date saisie en 2 ne figure pas, il n'y a pas de condition d'arrêt, et tu génères une boucle infinie.

A cet égard j'ai introduit en condition supplémentaire pour la 2e boucle que .Cells(i, 3) <> "", afin d'éviter une boucle infinie dans ce cas.

Je n'ai pas bien compris pourquoi à l'arrêt de la 2e boucle tu inscris la ligne qui suit... mais tu as peut-être tes raisons.

Egalement le choix en 1re date de celle qui figure en C2 ne se verra pas inscrite en L2, cellule occultée par une fusion.

Si tu étais tenté par des comparaisons utilisant > ou <, sache que ta méthode actuelle ( = et <>) fait que tu n'as pas à te soucier des valeurs texte de ta liste, ce qui ne sera plus le cas avec une autre mode de comparaisons...

Cordialement.

MFerrand,

Merci, pour l'analyse en détail, le code propre fourni et le temps passé. Effectivement j'ai le tord de ne pas approfondir mon code. J'arrive souvent à mes fins pour des petites macros mais quand on creuse un peu y a encore du boulot...

a+

Rechercher des sujets similaires à "dates formulaire"