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