Demander la saisie d'une date au format JJ/MM/AAAA dans une macro LibreOffice Calc

Dans une macro Basic créée avec LibreOffice Calc, vous avez besoin de demander à l'utilisateur la saisie d'une date. C'est un grand classique. Pourquoi ne pas profiter de ce besoin ponctuel pour régler définitivement le problème de la saisie dans toutes vos macros ? Voici la solution que vous propose Astuces hebdo.

Si vous êtes pressé ou aguerri à la programmation, vous pouvez directement aller chercher le code à la fin de cet article. Sinon, voici des explications (très) détaillées.

L'idée est de programmer, une fois pour toutes, une fonction de saisie générique qui s'occupera de tout, des dates comme d'autre chose. Vous aurez ainsi une fonction prête à l'emploi que vous pourrez embarquer systématiquement dans le code de tous vos classeurs. Et, au fil du temps, vous pourrez faire évoluer cette fonction selon vos besoins.

La base, c'est bien sûr la fonction InputBox, qui affiche une boîte de dialogue demandant à l'utilisateur de saisir du texte. La valeur de retour est une chaîne de caractères, ce qui n'est pas du tout gênant (bien au contraire).

Notez que dans cette solution, on ne se préoccupe pas de la position de la boîte de dialogue. Au besoin, vous pourrez modifier le code dans l'appel à InputBox si vous voulez définir des positions horizontale et/ou verticale différentes des valeurs par défaut (consultez l'aide de la fonction InputBox sur Internet).

Notre fonction de saisie générique s'appellera SuperInputBox, et va donc gérer la saisie de date, mais aussi d'autres type de saisies comme celle d'un nombre quelconque (un montant, par exemple), d'un nombre dans un format précis (par exemple sur 6 chiffres exactement), ou d'un texte sur un nombre de caractères précis (par exemple 9 caractères exactement). Il s'agit là d'exemples que vous pourrez bien sûr adapter.

Pour cette fonction SuperInputBox, nous avons choisi de simplifier la vie de l'utilisateur en cas d'erreur de saisie. Si la valeur saisie n'est pas dans le format demandé (JJ/MM/AAAA pour une date, par exemple), la fonction affichera un message "Saisie incorrecte." et bouclera sur elle-même en redemandant une nouvelle saisie. À charge pour l'utilisateur, s'il souhaite annuler sa saisie, de cliquer le bouton Annuler ou de fermer la boîte de dialogue en cliquant sur le bouton de fermeture.

Ainsi, la valeur de retour de SuperInputBox sera soit une chaîne vide ("") si l'utilisateur n'a rien saisi ou a annulé sa saisie, soit la chaîne de caractères correspondant à sa saisie, garantie dans le bon format (mais au format string).

Comme nous avons choisi de créer une fonction SuperInputBox générique, il faut donc lui "passer" le type de saisie qu'on veut demander. Nous avons choisi de gérer ça "en clair", au format string. C'est le paramètre quoi : dans notre exemple, quoi peut être DATE, MONTANT, SIXCHIFFRES, NEUFCARACTERES.

SuperInputBox a deux autres paramètres : message, qui correspond au message affiché dans la boîte de dialogue de saisie ("Entrez une date au format JJ/MM/AAAA", par exemple), et titre, qui correspond au titre de la boîte de dialogue ("Mon appli", par exemple).

Pour appeler cette fonction, rien de plus simple :

Dim saisie as string

saisie = SuperInputBox ("Date","Entrez une date svp :","Astuces hebdo")

Et pour tester la valeur de retour :

If saisie = "" Then

' aucune saisie ou annulation

Else

MsgBox ("Vous avez saisi la date : " + saisie)

End If

Comme la valeur de retour est au format string, il faudra penser à la convertir au besoin (ce qui est très simple), notamment pour une date ayant vocation à être stockée au format date (donc nombre) dans une cellule, ou pour un nombre stocké au format nombre :

Dim datesaisie as double

datesaisie = CDate (saisie)

ou

Dim nombre as long ' ou integer ou double, selon les cas

nombre = CLng (saisie)

Et voilà maintenant le code :

Function SuperInputBox (quoi as string, message as string, titre as string) as string

Dim saisie as string

saisie = InputBox (message,titre)

If saisie = "" Then ' rien ou annul ou ECHAP

SuperInputBox = ""

Exit Function

End If

While saisie <> ""

Select Case quoi

Case "DATE"

If len (saisie) = 10 Then

If Mid (saisie, 3, 1) = "/" AND Mid (saisie, 6, 1) = "/" Then

If IsDate (saisie) = True Then

SuperInputBox = saisie

Exit Function

End If

End If

End If

Case "MONTANT"

If IsNumeric (saisie) Then

SuperInputBox = saisie

Exit Function

End If

Case "SIXCHIFFRES"

If Len (saisie) = 6 Then

If IsNumeric (saisie) = True Then

If CDbl (saisie) > 099999 AND CDbl (saisie) < 1000000 Then

SuperInputBox = saisie

Exit Function

End If

End If

End If

Case "NEUFCARACTERES"

If len (saisie) = 9 Then

                                SuperInputBox = saisie

Exit Function

End If

End Select

MsgBox ("Saisie incorrecte", MB_OK+MB_ICONEXCLAMATION, titre)

saisie = InputBox (message,titre) ' c'est là toute l'astuce de la boucle ;-)

Wend

End Function

Et voilà !

Une petite remarque sur le cas NEUFCARACTERES : le test s'effectue sur la saisie complète, espace(s) compris. Si vous souhaitez valider la saisie de neuf caractères sans espace, en acceptant d'éventuels espaces intermédiaires (à ignorer), rajoutez simplement saisie = Replace (saisie, " ", "") juste avant le test If len (saisie) = 9.

Au passage, pour le cas SIXCHIFFRES, le test CDbl est nécessaire pour refuser la saisie d'un nombre avec décimales sur 6 caractères (comme 123,45). Si la valeur saisie est bien comprise entre 099999 (non compris) et 1000000 (non compris), on est certain qu'il n'y a pas de virgule puisqu'il y a bien six caractères en tout (subtil).

Articles les plus consultés

Combien de grammes pèse un morceau de sucre ?