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.
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 SubBonjour 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 SubJe 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 SubJe 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 Sub2. 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 SubHabituellement 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 subCordialement
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