Modifier une valeur (date) via userform renvoi du texte

Bonjour à tous,

J'ai trouvé tout à fait par hasard sur ce forum, il y a quelques mois, un userform qui m'est devenu très utile aujourd'hui.

Seulement voilà, je viens de m'apercevoir d'un HIC : le code utilisé convertit les dates en texte, ce qui parfois me cause des soucis pour calculer les intervalles entre 2 dates.

Je vous joint un fichier, mais me direz-vous : le calcul des intervalles fonctionne ici !

... Hé oui... et je n'y comprend rien, honnêtement.

13test-date.xlsm (22.42 Ko)

J'ai trouvé une solution alternative : ce serait de créer une seconde colonne (masquée) et de les formater avec DATEVAL, mais j'aimerais d'abord savoir si on peut régler le problème à la source

Merci par avance,

Cordialement.

Bonjour

Dans la sub Private Sub Modifier_Click(), ajoutez CDATE devant datedocument -->

CDate(datedocument)

Rem : je n'ai pas très bien compris votre demande par rapport à ce que vous écrivez en C6 dans la feuille du fichier

Si ok -->

Cordialement

edit : comme vous utilisez un tableau structuré vos codes devraient être adaptés. Exemple pour le chargement de l'USF

Private Sub UserForm_Initialize()
Dim tb As ListObject

Set tb = Sheets("Feuil1").ListObjects("Tableau1")
With Me.Ref
    If tb.ListRows.Count = 1 Then
        .AddItem tb.DataBodyRange(1, 1).Value
    Else: .List = tb.ListColumns(1).DataBodyRange.Value
    End If
End With
End Sub

Bonjour Dan,

Merci beaucoup ! C'est exactement ça.

Pour répondre à la question en C6 : En fait, dès qu'on charge le fichier, en C6, la valeur retournée (au format nombre) était 44844. Dès lors que j'utilisais l'userform , afin de modifier la date, ça devenait du texte. Grâce à la solution Cdate(datedocument), ça reste bien un nombre, ce qui me confirme que le format est préservé, donc c'est parfait.

_____________

Et doublement merci pour l'amélioration de la commande Userform_Initialize.

Par contre, pouvez-vous s'il vous plait me confirmer que cette adaptation ne causera pas de problème à long terme, en supposant que nous cherchons à afficher la 52ème colonne ?

Private Sub UserForm_Initialize()
Dim tb As ListObject

Set tb = Sheets("Feuil1").ListObjects("Tableau1")
With Me.Ref
    If tb.ListRows.Count = 1 Then
        .AddItem tb.DataBodyRange(1, 52).Value
    Else: .List = tb.ListColumns(52).DataBodyRange.Value
    End If
End With
End Sub

Je ne comprend pas précisément le sens de la ligne .AddItem ... , cela dit je crois comprendre que cette ligne ne servira que s'il n'y a qu'1 ligne dans le tableau (ce qui n'arrivera jamais) ?

En tout cas sujet résolu!

Cordialement

Grâce à la solution Cdate(datedocument), ça reste bien un nombre, ce qui me confirme que le format est préservé, donc c'est parfait.

Ok. Parfait

Par contre, pouvez-vous s'il vous plait me confirmer que cette adaptation ne causera pas de problème à long terme, en supposant que nous cherchons à afficher la 52ème colonne ?

Si cette colonne est dans le tableau structuré nommé "Tableau1", il n'y a aucun problème.

cela dit je crois comprendre que cette ligne ne servira que s'il n'y a qu'1 ligne dans le tableau

Vous avez bien compris.
Cela peut arriver en cas de suppression de lignes ou simplement si vous n'avez aucune donnée en ligne 1 parce que vous commencez à compléter votre tableau.

Il y a d'ailleurs d'autres codes qui devraient être adaptés (codes supprimer et Modifier) dans le fichier vu que vous utilisez un tableau structuré. Je n'en ai modifié qu'un seul mais cela peut fonctionner comme cela évidemment.

Bonjour,

Excusez-moi de remonter ce sujet :

Je n'avais pas fait attention à la remarque de Dan :

Il y a d'ailleurs d'autres codes qui devraient être adaptés (codes supprimer et Modifier) dans le fichier vu que vous utilisez un tableau structuré. Je n'en ai modifié qu'un seul mais cela peut fonctionner comme cela évidemment.

Je ne suis pas vraiment doué, pour améliorer le tableau, j'ai fais plusieurs essai, pour le bouton supprimer par exemple :

Private Sub Supprimer_Click()
Dim tb As ListObject
Set tb = Sheets("Feuil1").ListObjects("Tableau1")

If Not IsError(Application.Match(Ref, Sheets("Feuil1").tb.DataBodyRange(1, 1).Value, 0)) Then
ligne = Application.Match(Ref, Sheets("Feuil1").tb.DataBodyRange(1, 1).Value, 0)

Sheets("Feuil1").Rows(ligne).EntireRow.Delete

Unload Me 'permet de réactualiser la fenêtre UserForm
MsgBox "Ligne supprimée."

Userform1.Show
End If
End Sub

Je n'y arrive pas. Surtout, la commande "entirerow.delete" supprimera la ligne entière de la feuille ? Et non pas uniquement la ligne du tableau ?

Cordialement

Bonjour

Essayez ceci plutôt

1. Modifiez la macro Afficheruserform comme ceci

Sub AfficherUserform()
Load Userform1
Userform1.Show
End Sub

2. Remplacez le code supprimer par celui ci-dessous

Private Sub Supprimer_Click()
Dim tb As ListObject

Set tb = Sheets("Feuil1").ListObjects("Tableau1")
If Not IsError(Application.Match(Ref, tb.ListColumns(1).DataBodyRange.Value, 0)) Then
    ligne = Application.Match(Ref, tb.ListColumns(1).DataBodyRange.Value, 0)
    tb.ListRows(ligne).Delete

    MsgBox "Ligne supprimée."

    Unload Me 'permet de réactualiser la fenêtre UserForm
    Call AfficherUserform
End If
End Sub

Habituellement je ne décharge pas l'userform pour la réouvrir suite à une modification mais cela fonctionnera aussi comme je vous le propose.

NB : vous pouvez aussi modifier le code de recherche comme ceci

Private Sub Ref_Change()
Dim tb As ListObject

Set tb = Sheets("Feuil1").ListObjects("Tableau1")
If Not IsError(Application.Match(Ref, tb.ListColumns(1).DataBodyRange.Value, 0)) Then
    ligne = Application.Match(Ref, tb.ListColumns(1).DataBodyRange.Value, 0)
    Nom.Value = tb.DataBodyRange(ligne, 1).Value
    datedocument.Value = tb.DataBodyRange(ligne, 2).Value
End If
End sub

Cordialement

Bonjour,

Le bouton supprimer fonctionne à présent :) Je vais tenter de l'appliquer aux autres boutons "Modifier" et "Ajouter2" (qui n'est pas présent sur cet exemple)

Merci beaucoup!

Cordialement

Rechercher des sujets similaires à "modifier valeur date via userform renvoi texte"