OpenOffice : différence des fonctions entre Windows et Linux
J’utilise la suite OpenOffice.org depuis longtemps, cela avait commencé
avant ma migration sous Linux, du moins pour les documents n’ayant pas
de macros.
Comme au travail nous utilisons Microsoft Office, je suis plus habitué à
l’écriture de macros sous Excel, mais je n’avais pas vraiment fait
d’effort pour en écrire sous Calc.
Cette année, comme tout le monde à la maison est sous GNU/Linux
(Ubuntu), j’ai pris le temps de migrer mon classeur Excel en Calc et
donc de refaire ma macro.
Au cour de l’adaptation de la macro permettant de créer le calendrier
des permanences de la bibliothèque, j’ai constaté une différence de
comportement de la fonction DateSerial suivant que l’on est sous
Windows ou Linux !
Le principe du calendrier
La bibliothèque n’étant ouverte que le samedi et le dimanche, le celendrier ne contient donc que 2 jours par semaine, par contre il y a 2 listes de bénévoles : celle du samedi et celle du dimanche.
Le principe de la macro est donc de faire une boucle sur les 365 jours de l’année et d’écrire les date du samedi et dimanche avec le nom de la bénévole correspondante.
Le calendrier
Pour réaliser le calendrier des samedi et dimanche, j’utilise la boucle suivante :
i = 1
j = 0
d = 1
s = 1
benev_col2 = 0
While i < 366
mydate = DateSerial(annee, 1, i)
If Weekday(mydate, vbSunday) = vbSunday Then
Cells(debut + j, 1).Value = FormatDateTime(mydate, vbLongDate)
j = j + 1
ElseIf Weekday(mydate, vbSunday) = vbSaturday Then
Cells(debut + j, 1).Value = FormatDateTime(mydate, vbLongDate)
j = j + 1
End If
i = i + 1
Wend
Pour obtenir la date du jour, j’utilise la fonction DateSerial qui
prend comme paramètres l’année, le mois et le jour pour lesquels on veut
obtenir la date.
Sous Linux, en faisant varier uniquement le paramètre jour de 1 à 366
(année = constante, mois = janvier = 1), cela fonctionne.
Sous Windows, la fonction renvoie une erreur au 32ieme jour, il est vrai
que le 32 janvier n’est jamais noté dans un calendrier !
Créer une série de date
La solution est simple, il faut incrémenter la date à chaque boucle !
Le code devient donc :
i = 1
j = 0
d = 1
s = 1
benev_col2 = 0
mydate=DateSerial (annee, 1,1)
While i < 366
If Weekday(mydate, vbSunday) = vbSunday Then
Cells(debut + j, 1).Value = FormatDateTime(mydate, vbLongDate)
j = j + 1
ElseIf Weekday(mydate, vbSunday) = vbSaturday Then
Cells(debut + j, 1).Value = FormatDateTime(mydate, vbLongDate)
j = j + 1
End If
mydate = mydate + 1
i = i + 1
Wend