XL 2010 Petit probleme de format date

snoopy07

XLDnaute Occasionnel
Bonjour le forum

il y a quelques années j'ai emprunter un tableur suivi de compte a loureed, j ai apporter quelque modification avec son aide quand je n arrivais pas a trouver les bon codes
Aujourd’hui hui j ai une dernière petite modification a faire et je ne trouve pas le code pour que ça marche

Quand j inscrit la mensualisation la date dans la feuilles de janvier
La date se met au bon formats sauf l année qui n est pas bonne elle se met en l année 00
pour les autres mois les jours sont bon mais le mois et l année qui sont pas correct
Exemple pour le 02/02/21 la date se mais comme ça 02/01/00 Quel code dois je utiliser pour corriger mon petit problème et ou le mettre

https://1fichier.com/?zwlggc4eg7oylu9o4n5r

merci d'avance pour vos aides et vos conseils

Cordialement

Snoopy07
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Dans le code du userForm 'frmNouvelleOpération' vous avez une Sub AfficheTableau et la deuxième ligne est :
.Cells(Lg, 2) = Format(TxtDate, "MM/DD/YY")
Qui rentre en colonne b de la ligne concerné un texte de date au format anglo-saxon.
Je remplacerais cette ligne par :
if IsDate(TxtDate) Then.Cells(Lg,2)= CDate(TxtDate)
Car il est préférable de mettre des vrais dates dans les cellules plutôt que des textes.

Passez les cellules contenant des dates (vraies) au format "jj/mm/aaaa".

Cordialement
 

snoopy07

XLDnaute Occasionnel
Bonsoir Roblochon et le forum

je te remercie pour ton aide

mais ce n est pas avec le code du userForm 'frmNouvelleOpération' que j ai le probleme
c est quand je clic sur inscrit la mensualisation que j ai un probleme

Quand j inscrit la mensualisation dans les feuilles le jours est bon mais les mois est l année d ne correspond pas


Exemple dans la feuille de janvier la date du 10/01/21 l se mais comme ça 10/01/00
dans la feuille de février la date du 10/02/21 l se mais comme ça 10/01/00
dans la feuille de mars la date du 10/03/21 l se mais comme ça 10/01/00
je n arrive pas trouver comment faire pour résoudre se problème

merci d avance pour vos conseils et le temps que vous m accordez

Cordialement
Snoopy07
 

juvaxe

XLDnaute Occasionnel
Bonsoir

J'ai regardé un peu le fichier essai nouvelle feuille ...

Tout est imbriqué, les dates erronées dont tu parles sur la feuille de Janvier par exemple proviennent en fait de la feuille mensualisation.

il faut regarder de près cette feuille mensualisation et principalement le Userform "nouvelle mensualisation".

C'est toi qui connais le mieux la dynamique du classeur; lorsqu'on affiche le Userform "nouvelle mensualisation" le Textbox DATE , qui en interne s'appelle "Txtjours" , contient la suite 1 à 31 alors qu'on pourrait s'attendre à ce qu'il contiennent une suite de dates

Ce ne sont pas des dates alors que ce TextBox est appelé à alimenter des cellules destinées à contenir des dates.

Le calendrier part du 01/01/1900, il est normal que les nombres de jours qui sont rentrés dans ces cellules donnent les dates qui y apparaissent, à commencer par la feuille mensualisation.

Je pense que la premières chose à faire est de s'assurer que c'est bien une date qui part du Userform "nouvelle mensualisation". D'ailleurs j'ai essayé de mettre une date de la forme JJ/MM/AAAA dans ce champ et la suite se déroule normalement, à l'exception près que c'est un nombre de jours, de l'ordre de 44000, cohérent cependant par rapport à la date saisie, qui apparaît, dans la mesure ou les cellules ne sont pas définies au format date.

Dans l'attente d'un éventuel retour

Bonne réception
 

snoopy07

XLDnaute Occasionnel
Bonjour juvaxe et le forum

j ai fait la même chose que toi et j ai eu le même résultat
je pense que le problème vient de la sub mensuel qui se trouve dans le module routine au moment ou la date s’inscrit
je pense qu'il doit manquer un code sur la ligne qui est en gras



VB:
Sub mensuel()
    Dim Num_Feuille As Integer
    Dim Ligne_Mensualisation As Long
    Dim Ligne_Feuille_Mois_Actif As Long
    Dim Première_Ligne As Long
        
    ' on identifie le mois actif qui est égal à l'index de la feuille active => feuille 1 = janvier = index 1
    Num_Feuille = ActiveSheet.Index
    
    ' sur la feuille système on vérifie si la mensualisation est déjà faite ou pas : Num_feuille = mois actif décalé d'une ligne vers le bas (+1)
    ' car dans le tableau de la feuille système il y a une entête, donc janvier est en ligne 2 (etc pour les autres mois)
    If Sheets("Système").Cells(Num_Feuille + 1, 4).Value <> "inscrite" Then ' si ce n'est pas encore fait
    
        ' comme on met en place la mensualisation
        ' on enlève la mise à jour de l'écran, la surveillance événementielle, le calcul automatique
        Application.ScreenUpdating = False
        Application.EnableEvents = False
        Application.Calculation = xlManual

        ' on enlève la protection sur les deux feuilles utilisées
        Sheets(Num_Feuille).Unprotect
        Sheets("Mensualisation").Unprotect
      
       ' numéro de ligne de la première donnée du tableau mensualisation
        Ligne_Mensualisation = 4
        
        ' détermination de la première ligne vide de la feuille de suivi mensuel
        Première_Ligne = Cells(Rows.Count, 2).End(xlUp).Row
        
        ' ligne de la feuille du mois en cours est égal à la première ligne vide
        Ligne_Feuille_Mois_Actif = Première_Ligne
        
        ' début de la boucle Do Loop
        Do
        
            ' on test la valeur de la cellule qui se trouve en colonne 2 de la feuille "Mensualisation"
            ' et en ligne 4 (donc Ligne_Mensualisation) de cette même feuille
            ' en faite s'il y a une date = il y a une mensualisation
            If Worksheets("Mensualisation").Cells(Ligne_Mensualisation, 2).Value <> "" Then ' si la cellule est non vide

                ' il y a bien une date mais il faut vérifier s'il y a bien une valeur en fonction du mois où l'on se trouve
                ' ce mois est égal à Num_Feuille et les colonnes mois sont après la colonne 7
                ' et on est toujours sur la ligne 4 (au premier tour de la boucle) c'est à dire Ligne_Mensualisation
                If (Worksheets("Mensualisation").Cells(Ligne_Mensualisation, 7 + Num_Feuille).Value <> "") Then ' si la cellule est non vide
                    
                    ' alors le décalage de la cellule active de la feuille du mois en cours est égal sa valeur + 1 donc au premier tour
                    ' de la boucle à Décal_Ligne_Feuille_Mois_Actif + 1 = 0 + 1 = 1
                    Ligne_Feuille_Mois_Actif = Ligne_Feuille_Mois_Actif + 1 ' on incrémente de 1 le décalage pour le remplissage du suivi de compte du mois en cours de traitement

                    ' ensuite il suffit de recopier les valeurs des colonnes de la feuille "Mensualisation" sur les colonnes correspondantes
                    ' de la feuille du mois en cours
                    
                    ' écriture de la date : la date est en colonne 2 sur les deux feuilles
                    ' en ligne Ligne_Feuille_Mois_Actif
                    ' en ligne Ligne_Mensualisation pour la feuille "Mensualisation"


                 [B]Cells(Ligne_Feuille_Mois_Actif, 2).Value = Worksheets("Mensualisation").Cells(Ligne_Mensualisation, 2).Value[/B]
                    
                    
                    
                    
                    ' écriture de l'intitulé Catégorie
                    Cells(Ligne_Feuille_Mois_Actif, 3).Value = Worksheets("Mensualisation").Cells(Ligne_Mensualisation, 3).Value
                    ' écriture de l'intitulé Etablissement
                    Cells(Ligne_Feuille_Mois_Actif, 4).Value = Worksheets("Mensualisation").Cells(Ligne_Mensualisation, 4).Value
                    ' écriture de l'intitulé Qui/Quoi
                    Cells(Ligne_Feuille_Mois_Actif, 5).Value = Worksheets("Mensualisation").Cells(Ligne_Mensualisation, 5).Value
                    ' écriture de l'intitulé Type
                    Cells(Ligne_Feuille_Mois_Actif, 6).Value = Worksheets("Mensualisation").Cells(Ligne_Mensualisation, 6).Value

                    ' écriture de la valeur des débits crédits
                    ' ici on teste la colonne 7 de la feuille "Mensualisation" afin de savoir si c'est un débit ou un crédit
                    If Worksheets("Mensualisation").Cells(Ligne_Mensualisation, 7).Value = "Débit" Then ' si c'est un débit
                        Cells(Ligne_Feuille_Mois_Actif, 9).Value = Worksheets("Mensualisation").Cells(Ligne_Mensualisation, 7 + Num_Feuille).Value
                    Else
                        Cells(Ligne_Feuille_Mois_Actif, 8).Value = Worksheets("Mensualisation").Cells(Ligne_Mensualisation, 7 + Num_Feuille).Value
                    End If
                End If
            Else ' si la cellule testée est = rien (si pas de date = plus de mensualisation à inscrire)
                ' on sort de la boucle
                Exit Do
            End If
            ' si on arrive à ces lignes c'est qu'il y avait une mensualisation à écrire, alors
            ' on passe, pour les tests de la prochaine boucle, la variable Ligne_Mensualisation à +1 pour tester la ligne suivante de la feuille "Mensualisation"
            Ligne_Mensualisation = Ligne_Mensualisation + 1
        Loop
        
        ' on est sortie de la boucle, on test si on a écrit une mensualité sur la feuille du mois en cours
        ' dans d'autres termes Première_Ligne <> Ligne_Feuille_Mois_Actif
        If Ligne_Feuille_Mois_Actif <> Première_Ligne Then ' on vérifie qu'il y avait au moins une mensualisation pour mettre la valeur du mois en cour de traitement à "inscrite"
            ' on met le valeur de la feuille "Système" à "déjà effectuée" en face du mois concerné (Num_Feuille)
            Sheets("Système").Cells(Num_Feuille + 1, 4).Value = "inscrite"
            
            ' on masque le bouton de mensualisation vu qu'il ne sert plus
            'Call affiche_masque_bouton_mensuel
            
            ' recherche de la première ligne de rentrée de données
            'Call tri_date(Sheets(ActiveSheet.Index).Name)
            ' la variable la_ligne_de_donnee est égal à la première ligne vide du suivi du mois en cours
            la_ligne_de_donnee = Cells(Rows.Count, 2).End(xlUp).Row + 1
        End If

        ' on remet la protection sur les deux feuilles utilisées
        Sheets(Num_Feuille).Protect
        Sheets("Mensualisation").Protect
        
        ' une tout fait on remet à jour les trois événement d'application en marche
        ' on remet la mise à jour de l'écran, la surveillance événementielle, le calcul automatique
        Application.Calculation = xlAutomatic
        Application.EnableEvents = True
        Application.ScreenUpdating = True
    End If
End Sub

Je n en suis pas sur peut que que je trompe

Cordialement
Snoopy07
 

juvaxe

XLDnaute Occasionnel
Bonjour

Avant de reprendre le fil, puis-je me permettre de te demander de procéder à l'essai suivant.

J'ai pris le classeur "Essai 13 ..." tel que tu l'as envoyé.

Tout simplement :

1- Sélectionner la feuille "Mensualisation"
2- Cliquer une première fois sur Nouvelle mensualisation
3- Dans l'Userform mettre date à 12 (aujourd'hui) en utilisant le ComboBox et dans Etablissement je mets "Société Générale" ce n'est qu'un exemple
4- Cliquer sur Ajouter
5- Cliquer à nouveau sur Nouvelle mensualisation
6- Dans l'Userform mettre date 12/02/2021 à la main (le ComboBox ne peut pas servir) et "La Poste" dans établissement autre exemple
7- Cliquer sur Ajouter
8 - Cliquer sur Fermer

Maintenant si on observe les deux mensualisation qui viennent d'être ajoutées :

1 - La date de la ligne "Société générale" est 12 : normal, correspond à ce qui a été fait
2 - La date de la ligne "La Poste" est 44532. Mis au format date, ce nombre correspond au 12/02/2021, cette fois on est bien en présence d'une date valide.

Il y a vraiment une anomalie au niveau de l'appréhension des dates. Je suis tombé en premier sur la fiche mensualisation, il faudrait commencer par faire le tour de toutes les fiches où l'on traite d'une date avant de poursuivre toute autre investigation.

Dans "mensuel" je me suis rendu compte que le code importe dans la feuille du mois en cours des données de la feuille "mensualisation"; donc pas étonnant que des dates soient "bizarres", elles le sont déjà dans la source.

Je ne sais ce qu'a souhaite l'auteur de cette application.

1 Soit il a voulu ne saisir que le jour, dans la mesure où le mois et l'année sont connus par ailleurs, mais à ce moment là, à partir du JJ obtenu il faudrait reconstituer le JJ/MM/AAAA en entier avant de continuer

2 Soit il faut modifier la ComboBox pour y compléter les Item avec le mois et l'année en cours.

Bonne réception
 

snoopy07

XLDnaute Occasionnel
Bonjour juvaxe et le forum

je viens de faire l essai que tu ma dit


1- Sélectionner la feuille "Mensualisation"
2- Cliquer une première fois sur Nouvelle mensualisation
3- Dans l'Userform mettre date à 12 (aujourd'hui) en utilisant le ComboBox et dans Etablissement je mets "Société Générale" ce n'est qu'un exemple
4- Cliquer sur Ajouter
5- Cliquer à nouveau sur Nouvelle mensualisation
6- Dans l'Userform mettre date 12/02/2021 à la main (le ComboBox ne peut pas servir) et "La Poste" dans établissement autre exemple
7- Cliquer sur Ajouter
8 - Cliquer sur Fermer

Maintenant si on observe les deux mensualisation qui viennent d'être ajoutées :

1 - La date de la ligne "Société générale" est 12 : normal, correspond à ce qui a été fait
2 - La date de la ligne "La Poste" est 44532. Mis au format date, ce nombre correspond au 12/02/2021, cette fois on est bien en présence d'une date valide.
Dans la nouvelle mensualisation on doit remplir la date qu avec le combobox et pas a la main
dans la feuille mensualisation la date doit s afficher comme le combobox

1) Comment bloquer le combobox pour ne pas inscrit de date manuellement

2) A partir du JJ obtenu dans la feuille mensualisation il faut reconstituer le JJ/MM/AA qu'au moment de l' inscrition de la mensualisation avec Sub mensuel


cordialement
Snoopy07
 

juvaxe

XLDnaute Occasionnel
Bonjour

Je commence à progresser dans la compréhension du problème ...

La date qui figure dans le feuille mensualisation n'est en fait pas une date mais le jour d'échéance de la mensualisation.

Quand on sait ... pas de problème. Pour ceux qui ne savent pas peut-être qu'une adaptation des libellés serait bien utile.

Pour bloquer la possibilité d'entrer manuellement une valeur dans le combobox ill est possible de mettre le paramètre de la combo box "MatchRequired" à True. Ainsi, si la valeur rentrée ne correspond pas exactement à une valeur de la liste, l'entrée ne passera pas. La meilleure façon est probablement de remplacer la ComboBox par une ListBox qui n'offre pas de possibilité de substitution.

Dans "mensuel" la ligne de code qui valorise le mois à partir de mensualisation est nettement identifiée par les commentaires qui ont été mis juste au-dessus. Sans doute faut-il la compléter pour qu'à partir du jour (JJ) d'échéance elle génère la date effective du prélèvement (JJ/MM/AAAA).
Ce doit être ici le problème, en effet mettre un jour dans une date donne un résultat hasardeux . Le jour 12 converti en une date tel quel va, tout à fait normalement, donner le 12/01/1900, ce qui justifie ton étonnement.

Bonne réception
 

snoopy07

XLDnaute Occasionnel
Bonsoir juvaxe et le forum

je vais changer l’intitule pour que ça soit plus compréhensible
après plusieurs recherche sur les différent forums j'ai trouver pour bloquer la combobox dans les propriétes il faut mettre
AutoWordSelect = True
EnterFieldBehavior = 0-fmEnterFieldBehaviorSelectAll
ListStyle = 0-fmListStylePlain
MatchEntry = 2-fmMatchEntryNone
Style = 2-fmStyleDropDownList

Pour la mensuel je suis toujours entrain de chercher le bon code pour que ca marche

cordialement
Snoopy07
 

juvaxe

XLDnaute Occasionnel
Bonjour

Voici une proposition de modification à apporter à "mensuel :


Dim LocalDate As Date



' écriture de la date : la date est en colonne 2 sur les deux feuilles

' en ligne Ligne_Feuille_Mois_Actif

' en ligne Ligne_Mensualisation pour la feuille "Mensualisation"
' l'instruction initiale passe en commentaire

' Cells(Ligne_Feuille_Mois_Actif, 2).Value = Worksheets("Mensualisation").Cells(Ligne_Mensualisation, 2).Value

' Pour être remplacée par :



LocalDate = Worksheets("Mensualisation").Cells(Ligne_Mensualisation, 2).Value _

& "/" & Format(ActiveSheet.Index, "00") _

& "/" & Year(Now)

Cells(Ligne_Feuille_Mois_Actif, 2).Value = LocalDate


La construction de la date est basée sur la position de la feuille active en supposant que la feuille Janvier est la première
Une autre solution consisterait à rechercher le nom de la feuille active dans la collection des mois pour déterminer le numéro du mois à faire figurer dans la date


Bonne réception
 

snoopy07

XLDnaute Occasionnel
Bonjour juvaxe et le forum

je viens d essayer ton code et ca bloque

Capture 1.PNG


je clic sur deblocage

le code que tu ma donne est surligne en jaune

cordialement

Snoopy07
 

Pièces jointes

  • Essai 13 Nouvelle feuille de compte.xlsm
    655.5 KB · Affichages: 5

juvaxe

XLDnaute Occasionnel
Bonjour

Il y a deux lignes de code à mettre :

LocalDate = Worksheets("Mensualisation").Cells(Ligne_Mensualisation, 2).Value & "/" & Format(ActiveSheet.Index, "00") & "/" & Year(Now)

Cells(Ligne_Feuille_Mois_Actif, 2).Value = LocalDate

Ce qui est après Year(Now) doit faire l'objet d'une nouvelle ligne de code (sans le point)

Chez moi c'est OK

Cordialement
 

Discussions similaires

Statistiques des forums

Discussions
312 329
Messages
2 087 325
Membres
103 516
dernier inscrit
René Rivoli Monin