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
 

CINono

XLDnaute Nouveau
Bonjour à toutes et à tous,

je ne comprends pas pourquoi ces calculs de dates sur un calendrier 1900
ne pourraient pas fonctionner normalement,
Utiliser un calendrier 1904 me sert à faire des différences horaires
qui ne fonctionnent pas en calendrier 1900 sur des différences négatives
dans ce cas, je réduis/augmente (j'ai un doute) sur cet ancien développement
de 1461 jours les dates récupérées avec des données externes
pour pouvoir calculer les différences horaires (ET CA MARCHE TRES BIEN DEPUIS 5 ANS)
je ne comprends pas votre décalage de 1462 jours
pour mois 4 ans c'est jusqu'à 2100 : 4*365 + 1
donc mon dev aura un petit problème en 2100...
ne le dites pas trop fort, mon client pense que je vivrai au delà
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour le fil Cinono, Job,
Historiquement, pour PC le calendrier commence en 1 au 01/01/1900, sur MAC le calendrier commence en 0 au 01/01/1904.
D'où le décalage 1462 = 3*365+366+1
 

job75

XLDnaute Barbatruc
Notez que :

- dans une cellule Excel la formule ="02/01/1904"-"01/01/1900" renvoie 1462

- en VBA l'expression MsgBox DateValue("02/01/1904") - DateValue("01/01/1900") affiche 1461.

C'est dû au fait que sur Excel le 29/02/1900 existe (à tort) et pas en VBA.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Clairette,
Ce point bizarre a été éclairci sur un autre fil par Job. ( Lien )
Donc vous pouvez utiliser sans appréhension le calendrier 1904 et modifier la ligne de code comme suit :
VB:
.Range("C" & x) = Sheets(g).Range("A" & n).Value
Vous aurez alors les bonnes dates et les heures en format horaire, ce qui est plus lisible que les heures en décimal.
 

Membres actuellement en ligne

Statistiques des forums

Discussions
288 693
Messages
1 894 017
Membres
170 246
dernier inscrit
Fahdj2002
Haut Bas