Macro saisie date et saisie heure

Bonsoir à tous,

Voilà mes 2 problèmes:

J'ai un fichier excel dans lequel j'ai inséré une macro me permettant de saisir par exemple 050916 pour donner comme résultat Lundi 05 septembre 2016.

Le problème c'est que parfois la date saisie n'est pas celle qui s'affiche dans la cellule(voir exemple fichier joint)

Le second problème est que je voudrais que quand je saisi 730(par exemple) il s'affiche 07:30, cela fonctionne parfaitement sauf que le résultat obtenu dans la cellule ou j'ai mis une formule toute simple est tronqué au lieu d'afficher 10:45 il est affiché 10:85

Vous comprendrez mieux en regardant le fichier.

D’où vient cette erreur de date dans le temps ?

Est-il possible d'insérer une seconde macro qui me permettrait en tapant 730 dans une cellule qu'il s'affiche automatiquement 07:30 ou 07h30 peu importe mais que le calcul donne bien le résultat souhaité.

En espérant avoir été suffisamment clair et précis dans mes explications et demandes.

Un grand merci par avance à celles et ceux qui voudront bien se pencher sur mes deux problèmes et m'apporter je l'espère la solution.

Bonne soirée.

Mike.

Bonjour,

Quelque chose d'un peu plus simple que tes procédures actuelles, à tester :

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim dt, j%
    If Target.Count > 1 Then Exit Sub
    If IsNumeric(Target) Then
        dt = Target
        Select Case Len(dt)
            Case 3, 4
                j = (dt \ 100) \ 24
                dt = TimeSerial((dt \ 100) Mod 24, dt Mod 100, 0)
                If j > 0 Then dt = CSng(dt) + j
                Target.NumberFormat = IIf(dt < 1, "hh:mm", "[h]:mm")
            Case 5, 6
                dt = DateSerial((dt Mod 100) + 2000, (dt \ 100) Mod 100, dt \ 10000)
                Target.NumberFormat = "dddd d mmmm yyyy"
        End Select
        Application.EnableEvents = False
        Target = dt
        Application.EnableEvents = True
    End If
End Sub

Je conseille de tester sur une nouvelle feuille.

Je n'ai pas délimité de plage d'application, donc tout nombre de 3 ou 4 chiffres sera converti en valeur horaire, et tout nombre de 5 ou 6 chiffres sera convertie en valeur date.

A toi de délimiter des plages selon tes besoins...

Une autre possibilité serait de l'appliquer à tout un classeur, en faisant précéder le nombre d'un préfixe (1 caractère) servant de reconnaissance pour opérer la conversion, éventuellement plusieurs caractères pourrait être utilisés afin de définir des formats différents... La macro serait un peu allongée, mais on n'aurait plus à se soucier de plage délimitée pour l'appliquer.

NB- Ton classeur gagnerait à être nettoyé sans attendre de tous les éléments inutiles qui l'encombrent...

Cordialement.

Bonjour MFerrand ,

Merci beaucoup pour ta réponse rapide.

La macro fonctionne parfaitement à quelques détails près.

En effet,lorsque je modifie les heures d'arrivée, la formule de calcul en P17 et S17 (en rouge) ne fonctionne plus.

Celles qui additionnent les heures de la journée marchent normalement (P12:P16)

D'ailleurs,à la différence des cellules P12:P16, la formule de calcul n'apparait pas dans la barre de formule.

De plus,lorsque je modifie la date en B12 elle ne correspond plus à celle saisie(j'ai essayé avec ou sans calendrier 1904 et rien n'y fait)

Ce qui est étonnant,c'est que lorsque je les saisi dans d'autres cellules ça fonctionne(date en bleu gras)

J'espère que tu pourras à nouveau te pencher sur ces anomalies mais en tout cas merci encore de m’avoir trouver la solution pour la macro.

Bonne journée.

92classeur1.xlsm (19.78 Ko)

Bonjour,

Rajoute :

        If Target.Count > 1 Then Exit Sub
        If Target.HasFormula Then Exit Sub
[...]

En effet losque tu saisis une formule, la macro se déclenche, elle traite la valeur si celle-ci est numérique et écrase alors la formule !

Cette ligne fera sortir de la procédure si le contenu est une formule. Cela évitera des surprises.

Tu n'as pas modifié la procédure, pour éventuellement restreindre son action... Elle s'applique donc sur la feuille : souviens-toi que dans ces conditions tu ne peux utiliser de nombre comportant de 3 à 6 chiffres, ils seront convertis à la saisie en heures ou dates.

Sauf si tu les saisis maintenant sous forme de formule. Exemple : =1260, tu auras bien 1260 et non 13:00 !

Cordialement.

Re MFerrand,

C'est vraiment parfait.

Merci beaucoup !!!

Un dernier souci que je ne m'explique pas,lorsque je copie la feuille pour saisir les dates d'un autre mois,je rencontre le mème problème évoqué précédemment à savoir les dates qui ne correspondent pas à ma saisie.

Exemple 011016 devient jeudi 27 février 1930 au lieu samedi 01 octobre 2016.

Si tu as par hasard une idée d’où provient l'erreur.

En tout cas merci à toi d’être aussi rapide dans tes réponses et des solutions que tu m'apportes.

Je me débrouilles pas trop mal avec excel sauf en macro ou je suis vraiment très très novice....

Merci.

Mike.

62classeur1.xlsm (28.56 Ko)

Cela se produit lorsqu'on saisit une 2e fois (et au-delà) dans une cellule. La cellule a été dotée d'un format de cellule date lors de la 1re saisie, et il semble bien que dans ce cas Excel interprète d'emblée la saisie comme date, ce qui la fait échapper à la macro : la date affichée était bien celle correspondant au numéro de série 11016 !

Quelques ajouts pour contourner cet écueil en évitant d'affecter les autres types de saisies...

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim dt, j%
    If Target.Count > 1 Then Exit Sub
    If Target.HasFormula Then Exit Sub
   If Target = "" Then Exit Sub
    If IsNumeric(Target) Or IsDate(Target) Then
        dt = CDbl(Target)
        Select Case Len(dt)
            Case 3, 4
                j = (dt \ 100) \ 24
                dt = TimeSerial((dt \ 100) Mod 24, dt Mod 100, 0)
                If j > 0 Then dt = CSng(dt) + j
                Target.NumberFormat = IIf(dt < 1, "hh:mm", "[h]:mm")
            Case 5, 6
                dt = DateSerial((dt Mod 100) + 2000, (dt \ 100) Mod 100, dt \ 10000)
                Target.NumberFormat = "dddd d mmmm yyyy"
        End Select
        On Error Resume Next
        Application.EnableEvents = False
        Target = dt
        Application.EnableEvents = True
    End If
End Sub

Les ajouts sont surlignés.

Le premier, pour pallier à une valeur horaire qui ne s'effaçait plus et se rétablissait à 00:00 (certaines cellules seulement ?)

La 2e convertit teste également si la valeur est une date, et la 3e convertit systématiquement en nombre... (je craignais que cela ait des effets pervers sur les heures, ou lors d'une saisie horaire dans une cellule ayant contenu antérieurement une date, mais pas constaté ! Ouf ! (Pour le moment)).

la dernière pour qu'une erreur éventuelle ne se solde pas par la désactivation des évènements (problème auquel j'avais pensé au départ, mais ce n'était pas cela).

Le dispositif est à garder sous surveillance pendant encore quelques temps....

Cordialement.

Re MFerrand,

Vraiment génial et en plus tu me remets le fichier avec macro rectifiée !!!

Un grand grand merci à toi.

J'espère que dans le temps ça tiendra, il n'y a pas de raison !!!

En tout cas c'est exactement ce que je recherchais.

A bientot sur le forum.

Merci encore.

Cordialement,

Mike.

Si ça tient, tant mieux ! Sinon au prochain problème... Bye !

Je vais pinailler un peu mais le souci maintenant mème si ce n'est qu'un détail qui n’empêche pas mes demandes initiales de fonctionner à merveille, c'est que dans les onglets des nouveaux mois à venir ou j'ai connaissance de l'heure d'arrivée de chaque jour mais pas de départ, l'heure affichée apparait en négatif avec ##.......

J'ai bien tenter de cocher le calendrier 1904 qui résout le problème mais qui me donne le mème problème évoqué précédemment à savoir les dates qui ne correspondent pas à ma saisie.

Désolé de t’embêter avec ça mais si tu pouvais m'aider une dernière fois.

J'imagine qu'il doit falloir modifier à nouveau la macro mais comme j'y connais rien en macro, ton aide me sera à nouveau bien utile.

Merci d'avance à toi.

Cordialement,

Mike.

Tu mets la formule sous condition :

=SI(M12<>"";M12-J12;"")

merci pour ta réponse.

Bonne soirée.

Cdlt,

Mike.

Rechercher des sujets similaires à "macro saisie date heure"