Le grenier Access

Aller au contenu | Aller au menu | Aller à la recherche

mardi 16 mars 2010

Année bissextile

Comme savoir si une année est bissextile en VBA ?

Lire la suite...

dimanche 10 janvier 2010

Changer la date système sur Windows Vista ou Windows 7

J'essaie d'utiliser l'instruction Date pour modifier la date système de mon ordinateur. Ça fonctionne sur Windows XP, mais pas sur Windows Vista ni Windows 7. Pourquoi ?

Lire la suite...

mercredi 25 mars 2009

Jours chômés

Comment savoir, à partir d'une date connue, si celle-ci correspond à un jour chômé (Pâques, Fête nationale, Toussaint, etc.) ?

Lire la suite...

samedi 14 mars 2009

Calendrier sur Access 2007

Le saviez-vous ?

Dans Access 2007, les champs Date/Heure sont associés à un calendrier qui s'affichera automatiquement en cours de saisie dans les tables, mais aussi dans les requêtes et sur les formulaires.

Pour faire apparaître ce calendrier... il n'y a rien de spécial à faire ! Lorsque vous créez un champ Date/Heure, il suffit de vérifier que la propriété Afficher le sélecteur de dates est réglée comme sur la capture d'écran.

Ensuite, si vous passez en mode de saisie et que vous cliquez dans le champ, une icône de calendrier s'affiche. Apuka cliquer dessus !

jeudi 12 mars 2009

Jour de Pâques

Le jour de Pâques arrive bientôt... mais pouvez-vous dire quand précisément ? Sachant qu'il varie en fonction de l'année, ce serait pratique de pouvoir le calculer automatiquement. 

Lire la suite...

vendredi 2 janvier 2009

Dates de début et de fin de semaine

Dans la série "comment trouver la date de..." : comment afficher dans une zone de texte d'un formulaire, le 1er jour de la semaine en cours, et le dernier jour dans une autre zone ?

Sur un formulaire

  1. Créez une zone de texte  sur un formulaire.
  2. Cliquez sur cette zone de texte avec le bouton droit de la souris, puis sélectionnez Propriétés.
  3. Dans la propriété Nom, tapez par exemple : txtDebutSemaine
  4. Toujours dans les propriétés, définissez la source en tapant :
    =Date() - JourSem(Date(); 2) + 1
    ou en anglais :
    =Date() - WeekDay(Date(); 2) + 1
  5. Créez une seconde zone de texte. Nommez-la txtFinSemaine
  6. Définissez sa source en tapant cette fois :
    =Date() + 7 - JourSem(Date(); 2)
    ou en anglais :
    =Date() + 7 - WeekDay(date(); 2)
Pour info...
La fonction WeekDay(UneDate; UnCode) donne le jour de semaine d'une date, donc un chiffre compris entre 1 et 7. Si vous êtes francophone (ou non anglo-saxon, en tout cas !), il faut fournir le code 2 en deuxième paramètre. Cette valeur 2 indique que la semaine démarre le lundi. Vous pouvez remplacer ce 2 par la constante vbMonday, quand vous programmez en VBA.

Dans une requête

Ces formules peuvent être utilisées ailleurs dans Access : dans des requêtes, des états, du VBA. Dans une requête, il n'y a pas de zone de texte. Il faut en remplacement créer 2 champs calculés de cette forme :
  • Début Semaine: Date() - JourSem(Date(); 2) + 1
  • Fin Semaine: Date() + 7 - JourSem(Date(); 2)
Les calculs en question peuvent aussi être utilisés sous forme de critères (et non plus sous forme de champs calculés). Par exemple, on pourrait écrire, comme critère sous un champ Date/Heure :
Entre Date() - JourSem(Date(); 2) + 1 Et Date() + 7 - JourSem(Date(); 2)
...pour remplacer un critère du type :
Entre #29/01/2009# Et #04/01/2009#

En VBA

En VBA, seuls les noms anglais des fonctions doivent être utilisés, et les points-virgules doivent être remplacés par des virgules. Ce qui donne par exemple :
Dim dtDebutSemaine As Date
Dim dtFinSemaine As Date

dtDebutSemaine = Date() - WeekDay(Date(), vbMonday) + 1
dtFinSemaine = Date() + 7 - WeekDay(Date(), vbMonday)
MsgBox "Début de semaine : " & dtDebutSemaine
MsgBox "Fin de semaine : " & dtFinSemaine
A taper dans un bloc Sub/End Sub, bien sûr.

Astuce
Pour obtenir le début et la fin d'une semaine quelconque, vous pouvez remplacer tous les Date() donnés plus haut par un champ Access qui contiendrait une date quelconque.

jeudi 1 janvier 2009

Dates de début et de fin d'année

Voici une question d'actualité, avec la nouvelle année : comment afficher dans une zone de texte d'un formulaire, le 1er jour de l'année en cours, et le dernier jour dans une autre zone ?

Sur un formulaire

  1. Créez une zone de texte  sur un formulaire.
  2. Cliquez sur cette zone de texte avec le bouton droit de la souris, puis sélectionnez Propriétés.
  3. Dans la propriété Nom, tapez par exemple : txtDebutAnnee
  4. Toujours dans les propriétés, définissez la source en tapant :
    =SérieDate(Année(Date()); 1; 1)
    ou en anglais :
    =DateSerial(Year(Date()); 1; 1)
    ...ce qui équivaut à créer une nouvelle date à partir de l'année actuelle, du mois 1 (Janvier), et du jour 1.
  5. Créez une seconde zone de texte. Nommez-la txtFinAnnee
  6. Définissez sa source en tapant cette fois :
    =AjDate("yyyy"; 1; [txtDebutAnnee]) - 1
    ou en anglais :
    =DateAdd("yyyy"; 1; [txtDebutAnnee]) - 1
    ...ce qui équivaut à ajouter 1 année à la zone précédente (on tombe le 1er de l'année suivante), puis à retrancher 1 de cette valeur (on tombe donc le 31/12 de l'année souhaitée).

Dans une requête

Ces formules peuvent être utilisées ailleurs dans Access : dans des requêtes, des états, du VBA. Dans une requête, il n'y a pas de zone de texte. Il faut en remplacement créer 2 champs calculés de cette forme :
  • Début Année: SérieDate(Année(Date()); 1; 1)
  • Fin Année: AjDate("yyyy"; 1 ;[Début Année]) - 1

En VBA

En VBA, seuls les noms anglais des fonctions doivent être utilisés, et les points-virgules doivent être remplacés par des virgules. Ce qui donne par exemple :
Dim dtDebutAnnee As Date
Dim dtFinAnnee As Date

dtDebutAnnee = DateSerial(Year(Date()), 1, 1)
dtFinAnnee = DateAdd("yyyy", 1, dtDebutAnnee) - 1
MsgBox "Début d'année : " & dtDebutAnnee
MsgBox "Fin d'année : " & dtFinAnnee
A taper dans un bloc Sub/End Sub, bien sûr.

lundi 2 juin 2008

Extraire des dates anniversaires

Dans une table Access, j'ai une liste de personnes. Chaque enregistrement contient la date d'anniversaire de la personne, dans un champ de type Date/Heure. Comment extraire les personnes dont c'est l'anniversaire aujourd'hui ?

La requête

Access propose plusieurs fonctions de manipulations de dates, voici une solution possible parmi d'autres :
  1. Créez une requête graphique reposant sur la table des personnes.
  2. Déposez sur la grille de requête tous les champs qui vous intéressent (sans doute le nom, le prénom, la date de naissance...).
  3. Ajoutez le champ calculé suivant :
    Date JJMM: Format([Date de naissance];"ddmm")

    Selon votre version d'Access, remplacez "ddmm" par "jjmm". Cette formule formate la date d'anniversaire sous la forme jour/mois uniquement (l'année ne nous sert pas pour l'anniversaire). Si une personne est née le 13/07/1984, vous obtenez 1307. Date JJMM est le nom de la colonne de calcul, vous pouvez bien sûr le modifier ; vous pouvez aussi masquer cette colonne si elle n'est pas utile dans la feuille de résultats.
  4. Sur la ligne Critères associée au champ calculé précédent, ajoutez le critère suivant :
    =Format(Date(); "ddmm")

    On formate la date du jour avec les mêmes contraintes. Si la date de votre ordinateur est le 13/07/2008, vous allez obtenir également 1307. En cas d'égalité, on extrait bien les anniversaires.

Extraire les anniversaires en avance :-)

Dans l'exemple du dessus, vous extrayez les personnes dont c'est l'anniversaire le jour même. Mais vous souhaiterez peut-être extraire ces personnes un peu à l'avance, par exemple pour préparer l'expédition d'un courrier. Dans ce cas, remplacez simplement la deuxième formule par quelque chose comme :

=Format(Date() + 10; "ddmm")

Le +10 extrait les personnes dont la date de naissance tombe dans 10 jours.

Déclencher une alerte automatique à la date anniversaire

Une fois terminée, votre requête fournit la liste des anniversaires. Maintenant, si vous souhaitez aller plus loin et afficher automatiquement un formulaire avec cette liste de personnes, ou expédier un e-mail à ces personnes, consultez ces autres articles du Grenier :

dimanche 23 septembre 2007

Conversion de dates

J'importe des données d'un autre système informatique, et mes dates sont au format 20080701 (pour le 01/07/2008). Comment les convertir en dates Access ?

La fonction de conversion

Recopiez la fonction VBA ci-dessous dans un module standard de votre base de données.

Function TransformerEnDate(ByVal strDateDepart As String) As Date
  Dim strJour As String
  Dim strMois As String
  Dim strAnnee As String

  ' Extraire les 3 parties de la date
  strAnnee = Left(strDateDepart, 4)
  strMois = Mid(strDateDepart, 5, 2)
  strJour = Right(strDateDepart, 2)

  TransformerEnDate = DateSerial(strAnnee, strMois, strJour)
End Function

Utilliser la fonction

Dans une requête, vous utilisez la fonction dans un champ calculé, de la manière suivante :

Date Access: TransformerEnDate(Nz([Nom du champ Date de départ]; "20000101"))

Comme la fonction attend une chaîne de caractères, il faut éviter de lui passer des dates vides (Null). D'où l'appel préalable de la fonction Nz() pour convertir un Null éventuel en une date valide (telle qu'elle est attendue par la fonction VBA). Je pars du principe qu'en l'absence de valeur, la date par défaut sera 01/01/2000. Vous pouvez aménager selon vos besoins !

En VBA,  la fonction s'utilisera de cette manière :

Dim strDateDepart As String
Dim dtDateFinale As Date

strDateDepart = "20080701"
dtDateFinale = TransformerEnDate(strDateDepart)
Msgbox "Date après conversion : " & strDateFinale

lundi 3 septembre 2007

Démarrage automatique

Peut-on démarrer une base Access automatiquement, à une certaine heure ?

Access en lui-même ne prévoit rien dans ce sens, c'est le système d'exploitation (Windows) qui doit s'en charger. Suivez la procédure suivante (pour Windows 95/98/xp) :

  1. Sur Windows 9x, ouvrez le poste de travail, puis double-cliquez sur l'icône Tâches planifiées. Sur Windows XP, ouvrez le panneau de configuration, puis Tâches planifiées.
  2. Double-cliquez ensuite sur l'icône Création d'une tâche planifiée.
  3. Passez l'écran d'introduction en cliquant sur Suivant.
  4. Cliquez sur le bouton Parcourir pour pointer vers le fichier .mdb de votre base de données.
  5. Définissez ensuite les différents réglages (périodicité, heure, etc.).

La base de données démarrera automatiquement à l'heure dite.
Si vous voulez qu'elle effectue un traitement seule (c'est l'objectif, non ?), 2 solutions :

  1. Créer une macro nommée AutoExec effectuant la suite d'actions souhaitée, ou lançant une procédure VBA par le biais de l'instruction ExécuterCode.
  2. Créer un formulaire de démarrage (Outils / Démarrage) et programmer un événement ("Sur ouverture" par exemple) dans ce formulaire.

- page 1 de 2