Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Calendrier 1904 et macro

Clairette53

XLDnaute Nouveau
Bonjour,

Je viens vers vous car j’ai un souci avec un fichier Excel que je viens de passer sous l'option calendrier 1904 (car sinon mes formules de calcules sur les heures ne fonctionnaient pas comme je voulais). Mais depuis que j'ai fait cette manip, ma macro ne fonctionne plus correctement...

J'avais une macro qui faisait le récap de dates de plusieurs onglets dans un seul onglet. Seulement depuis que j'ai coché l'option calendrier 1904, les dates reportées dans l'onglet récap ne sont pas les bonnes (il s’agit des dates en 2025 au lieu de 2021 et avec toujours un jour de plus : par exemple 20/02/2025 au lieu de 19/02/2021).

La macro que j'utilise est la suivante (elle n'est pas de moi, je ne suis pas très douée en macro !) :

Sub recapheuressup()
'Efface les lignes 2 à 100 des col A à G
Sheets("récap HS").Range("A2:G100").ClearContents
Dim dl As Long
x = 1
'Boucle sur les feuilles depuis la 3ème (Les 2 premières sont les 2 feuilles Recap) jusqu'à la dernière
For g = 3 To Sheets.Count
'dernière ligne remplie en 1ere colonne de la feuille
dl = Sheets(g).Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
'si cette dernière ligne est >6 (donc après lea ligne des intitulés)
If dl > 6 Then
' on boucle sur les lignes de la feuille depuis la 7ème jusqu'à la dernière remplie
For n = 7 To dl
' on incrémente à chaque fois x de 1
x = x + 1
' Dans la feuille récap on copie en ligne X dans les colonnes adéquates les données de la feuille salarié
With Sheets("récap HS")
.Range("A" & x) = Sheets(g).Range("B3")
.Range("B" & x) = Sheets(g).Range("C3")
.Range("C" & x) = Sheets(g).Range("A" & n)
.Range("D" & x) = Sheets(g).Range("C" & n)
.Range("E" & x) = Sheets(g).Range("D" & n)
.Range("F" & x) = Sheets(g).Range("E" & n)
.Range("G" & x) = Sheets(g).Range("B" & n)
End With
Next n
End If
Next g

' une fois toutes les feuilles reportées,tri de la feuille récap par ordre croissant de dates et de noms prénoms
dl = Sheets("récap HS").Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
Sheets("récap HS").Columns("A:G").Select
ActiveWorkbook.Worksheets("récap HS").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("récap HS").Sort.SortFields.Add Key:=Range("C2:C" & dl _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("récap HS").Sort.SortFields.Add Key:=Range("A2:A" & dl _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("récap HS").Sort.SortFields.Add Key:=Range("B2:B" & dl _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("récap HS").Sort
.SetRange Range("A1:G" & dl)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

End Sub

Est-ce que quelqu'un sait comment résoudre ce problème ?

Merci à vous
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Clairette,
Or calendrier 1904, le calendrier XL commence au 01/01/1900. Donc vous décalez de 4 ans avec l'option calendrier 1904.
Pour le 19/02/2021, vous décaler de 4 ans soit 19/02/2025 auquel vous ajoutez fatalement sur 4 ans un 29 février d'où le 20/02/2025.
Cela reviendrait à faire sous XL :
VB:
=MOIS.DECALER("20/02/2025";-48)-1
en VBA cela pourrait donner :
Code:
A = #2/20/2025#
B = Format(Application.EDate(A, -48) - 1, "dd/mm/yyyy")
 

Clairette53

XLDnaute Nouveau
Oulala cela me paraît hors de portée...

Est-ce qu'il ne serait pas plus simple que je remette mon classeur sans l'option calendrier 1904 et en cherchant à résoudre mon problème de formule de calcule sur les heures (pb qui a causé la mise sous calendrier 1904 !) ?

Je m'explique avec un fichier en PJ : https://wetransfer.com/downloads/e5...158761caaf183852851f1f9220210223092005/fedce0

si on prend l'onglet de DURAND Martine, le solde d'heures ne s'affiche pas car la formule ne fonctionne pas quand le résultat est négatif ; j’aurai besoin que le solde négatif s'affiche (sans avoir à cocher l'option du calendrier 1904)

Merci pour votre aide
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Clairette, Job,

En J33 vous pouvez mettre :
VB:
=SI(E31-J31<0;"-"&TEXTE(ABS(E31-J31);"hh:mm:ss");E31-J31)
Par contre le résultat est une chaine de caractères et non un nombre.
Donc dans l'état ne peut pas être réutilisé quelque part dans une formule.

Ou alors rester en calendrier 1904 et à chaque date faire comme le dit Job :
Code:
Date1900=Date1904-1462
 

job75

XLDnaute Barbatruc
Bonjour Clairette53, sylvanu, le forum,
Mais si bien sûr, dans les formules remplacer J33 par l'expreesion :
Code:
SI(GAUCHE(J33)="-";-STXT(J33;2;8);J33)
A+
 

Modeste geedee

XLDnaute Barbatruc
l'affichage des heures négatives est une des pierres d'achoppement d'EXCEL.
les utilisateurs pros (industrie, commerce) ont l'habitude (pour des simplifications de traitements) de faire usage des heures décimales. (heures et centièmes d'heures).
les valeurs négatives ne sont plus une gène dans les calculs
pour l'affichage conventionnel, la conversion décimale / Sexagesimale est simple ...
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re bonjour tout le monde,
@clairette,
"Tout ça pour ça", oserais je dire.
Quand on reprend tout à zéro, le problème ne se pose que pour le transfert de dates dans Recap HS, et uniquement pour la colonne C.
Donc "je serais vous" je resterais en calendrier 1904 donc plus de problème d'heures négatives et je changerais cette ligne 19 :
VB:
.Range("B" & x) = Sheets(g).Range("C3") - 1462
qui ramènerait la bonne date en calendrier 1900. Ce serait à mes yeux le meilleur compromis .
 

Clairette53

XLDnaute Nouveau
je vais tenter cette solution, je ne suis pas très douée en VBA... il faudrait donc que je fasse ce que tu as dit sur les autres lignes en dessous qui se répètent :

.Range("A" & x) = Sheets(g).Range("B3") -1462
.Range("B" & x) = Sheets(g).Range("C3") -1462
.Range("C" & x) = Sheets(g).Range("A" & n) -1462
.Range("D" & x) = Sheets(g).Range("C" & n) -1462
.Range("E" & x) = Sheets(g).Range("D" & n) -1462
.Range("F" & x) = Sheets(g).Range("E" & n) -1462
.Range("G" & x) = Sheets(g).Range("B" & n) -1462

c'est bien cela ?
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Alors ça c'est original.
Si on ne met rien, il transfert en calendrier 1904.
Si on met -1462 il transfert en calendrier 1900 auquel il retire 4 ans.
Moi pas comprendre, mais moi savoir tricher.
Mettez en ligne 19 :
VB:
.Range("C" & x) = Sheets(g).Range("A" & n) - 0
Ca marche impeccable, mais est très bizarre.

Le fait de rajouter quelque chose le fait repasser en calendrier 1900.
Si quelqu'un avait une explication !
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…