Le grenier Access

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

jeudi 16 octobre 2008

Ouvrir une seconde base Access à partir de l'application en cours

J'ai une base de données A, avec un formulaire de menu. Sur ce formulaire, un bouton. Je voudrais que, lorsque l'utilisateur clique sur le bouton, il lance une autre base de données Access (on suppose que l'autre base contient une application totalement différente, sinon ça n'a pas de sens !).

Solution

Faites en sorte que l'événement Sur clic de votre bouton contienne le code suivant :

Shell """C:\...\MSAccess.exe"" ""C:\...\ma_base.mdb""", vbMaximizedFocus
  • Le premier chemin est celui d'Access lui-même. Par exemple :
    C:\Program Files\Microsoft Office\Office11\MSAccess.exe
  • Le second chemin est celui de votre base de données. Par exemple :
    C:\Documents and settings\Hervé\Mes documents\ma_base.mdb
  • Notez l'utilisation des guillemets autour des chemins.
    Il y a dans l'ordre : 3 guillemets, puis 2, puis un espace, puis 2 guillemets et on termine par 3 guillemets. Pour plus de détails, consultez cet autre article du blog.
Lorsqu'on clique sur le bouton, une autre instance d'Access est lancée, sur laquelle vous n'avez aucun contrôle (comme c'est le cas à chaque fois pour Shell).

vendredi 10 octobre 2008

Boucler sur les contrôles

Dans un formulaire, j'ai des zones de texte nommées Texte1, Texte2, Texte3 jusqu'à Texte20. Comment les parcourir par une boucle VBA ?

Solution

L'une des méthodes possibles pour référencer un objet de formulaire est la syntaxe :
Forms![Nom du formulaire]("Nom de l'objet")
"Nom de l'objet" peut être une variable de type String. La boucle devient donc :
Dim intI As Integer
For intI = 1 to 20
  MsgBox Forms![Nom du formulaire]("Texte" & intI)
Next
Dans l'exemple ci-dessus, on affiche simplement la valeur de champ zone nommée Texte1, Texte2, etc.
Vous pouvez bien sûr effectuer tout type de traitement sur ces champs.
La technique s'applique aussi aux états, remplacez seulement Forms par Reports.
Mise à jour
Consultez également cet article pour d'autres méthodes permettant de parcourir les contrôles d'un formulaire ou d'un état.

vendredi 3 octobre 2008

Liste des formulaires

Comment obtenir une liste des formulaires de la base de données ?

Lister les formulaires ouverts uniquement

Tapez le code suivant dans un module quelconque :

Function ListeFormsOuverts()
Dim frm As Form

For Each frm In Forms
  Debug.Print frm.Name
Next
End Function

Pour tester, ouvrez la fenêtre Exécution, et tapez-y :

? ListeFormsOuverts()

et validez par[Entrée].

Lister tous les formulaires de la base de données

Tapez le code suivant dans un module quelconque :

Function ListeForms()
Dim db As DAO.Database, doc As DAO.Document

Set db = CurrentDb
For Each doc In db.Containers("Forms").Documents
  Debug.Print doc.Name
Next

Set db = Nothing
End Function

Pour tester, ouvrez la fenêtre Exécution, et tapez-y :

? ListeForms()

et validez par[Entrée].

Important
L'exemple de code ci-dessus fait appel à la bibliothèque DAO (Microsoft DAO Object Library). Cette bibliothèque doit être associée à votre base de données pour que le programme fonctionne.
 
Pour plus de détails sur les références, consultez cette page.

mercredi 1 octobre 2008

Formulaire précédent

Comment savoir, à l'ouverture d'un formulaire, quel formulaire (voire quel bouton) a provoqué cette ouverture ?

On part du principe qu'un formulaire 1 comporte un bouton 1 (ou n'importe quel autre objet pouvant jouer le même rôle), et qu'un formulaire 2 comporte également un bouton 2. Un clic sur le bouton 1 ou sur le bouton 2 ouvre un formulaire 3.

Recopiez le code suivant dans l'événement Sur ouverture du formulaire 3.
A chaque ouverture de ce formulaire 3, un message vous indiquera quel formulaire et quel bouton a provoqué l'action.
Si vous ouvrez le formulaire 3 directement depuis la fenêtre Base de données, aucun message n'est affiché.

A vous d'aménager le code selon vos besoins !

Private Sub Form_Open(Cancel As Integer)
Dim frm As Access.Form
Dim ctl As Access.Control

On Error Resume Next
' Identifier le formulaire précédent ainsi que
' l'objet qui était actif sur ce formulaire
Set frm = Screen.ActiveForm
Set ctl = frm.ActiveControl

' Sortir si aucun formulaire ou aucun objet de formulaire
' n'a été identifié
If (frm Is Nothing) Or (ctl Is Nothing) Then Exit Sub

' On vérifie par exemple si, avant l'ouverture de ce formulaire,
' le contrôle actif était bien un bouton
If TypeOf ctl Is Access.CommandButton Then
    MsgBox "Ce formulaire a été ouvert par le bouton : " & ctl.name & vbCrLf _
        & "du formulaire : " & frm.name

    ' Votre traitement spécifique ici...
    ' ...
End If
End Sub
Note
Le raisonnement n'est pas parfait (à vous d'améliorer !) : le formulaire 1 et le bouton 1 peuvent être actifs sans avoir provoqué l'ouverture du formulaire 3. D'une manière générale, il vaut mieux qu'un formulaire soit totalement autonome et qu'il n'ait pas besoin de "savoir" quel autre objet l'a ouvert...

lundi 22 septembre 2008

Désactiver un bouton en VBA

Comment faire en sorte qu'un bouton soit désactivé après qu'on a cliqué dessus ?

Le principe

La plupart des composants graphiques (bouton, zone de texte, etc.) ont une propriété Enabled de type booléen (Oui/Non). Si Enabled = True, l'objet est activé. Donc, sur le principe, pour qu'un bouton appelé btnTest se désactive lui-même, il suffirait de programmer son événement Sur clic comme ceci :

Private Sub btnTest_Click()
  Me.btnTest.Enabled = False
End Sub

Oui mais...

Ce bout de code marcherait sur .NET, par exemple. Mais sur Access, il y a une restriction : l'objet sélectionné (comprenez : "l'objet en cours d'utilisation", ou encore "l'objet qui a le focus") ne peut pas être désactivé. Or comme vous venez de cliquer sur le bouton btnTest, vous l'avez sélectionné, et il ne peut donc plus se désactiver directement (par contre, il pourrait désactiver un autre objet du formulaire).

La solution

Tout simple : il suffit de prévoir, sur votre formulaire, un autre objet, et de sélectionner cet objet avant de désactiver le bouton. Si mon formulaire contient une zone de texte appelée txtDummy. Le code devient :

Private Sub btnTest_Click()
  ' On se déplace sur txtDummy
  Me.txtDummy.SetFocus

  ' On peut maintenant désactiver le bouton
  Me.btnTest.Enabled = False
End Sub

Il faut bien sûr que txtDummy soit un objet lui-même actif.

Pour information, le principe s'applique aussi sur la propriété Visible d'un bouton (si vous souhaitez faire apparaître ou disparaître un bouton).

vendredi 25 avril 2008

Décompter un nombre de cases cochées

Je souhaite permettre à l'utilisateur de sélectionner des enregistrements un par un, à l'aide de cases à cocher. Comment décompter le nombre de cases à cocher en temps réel ?

Lire la suite...

lundi 7 avril 2008

Source de formulaire ou d'état

Je fais reposer mes formulaires sur des tables, ce qui facilite la saisie et la consultation des données. Y a-t-il un intérêt à utiliser une requête pour construire un formulaire ?

Lire la suite...

samedi 10 novembre 2007

Tester l'existence d'un objet sur un formulaire

Je voudrais savoir si une zone de texte (ou n'importe quel autre objet, en fait) existe bien sur un formulaire. Je connais le nom du formulaire, ainsi que le nom de l'objet dont je veux vérifier l'existence. Comment faire ?

Le code

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

Function ControlExists( _
  ByVal strFormName As String, _
  ByVal strControlName As String) As Boolean
 
  Dim ctl As Access.Control
 
  ' Tenter de récupérer l'objet sur le formulaire
  On Error Resume Next
  Set ctl = Forms(strFormName)(strControlName)
 
  ' S'il n'y a pas eu d'erreur, l'objet existe
  ' ... et inversement <img src="/themes/default/smilies/smile.png" alt=":-)" class="smiley" />
  ControlExists = (Err.Number = 0)
  Set ctl = Nothing
End Function
La fonction reçoit 2 paramètres (le nom du formulaire et le nom de l'objet dont on veut vérifier l'existence). Elle renvoie True si l'objet existe, et False sinon.

Pour tester...

  1. Ouvrez un formulaire (en mode Formulaire, ou éventuellement en mode Création ; l'important est que le formulaire soit ouvert :-)).
  2. Ouvrez la fenêtre Exécution (CTRL + G), par exemple.
  3. Tapez-y :
    ? ControlExists("Nom du formulaire", "Nom de l'objet")
  4. Vous obtenez True en cas de succès, False sinon.
Vous pouvez bien sûr réutiliser la fonction dans votre propre code VB. Un exemple :
If ControlExists("frm Clients", "Nom Client") Then
  MsgBox "Le champ [Nom Client] existe.", vbInformation
Else
  MsgBox "Champ [Nom Client] introuvable !", vbExclamation
End If

lundi 29 octobre 2007

Afficher le nombre d'enregistrements sur un formulaire

Je souhaiterais afficher, sur un formulaire, le nombre d'enregistrements de ce formulaire (comme Access le fait déjà en bas du formulaire, à côté des boutons de déplacement). Comment faire ?

  1. Ouvrez votre formulaire en mode Création.
  2. Cliquez sur l'icône Zone de texte de la boîte à outils.
  3. Cliquez sur le formulaire pour déposer une nouvelle zone de texte.
  4. Dans cette zone de texte, tapez la formule : =Compte(*)
    (il n'est pas utile de respecter les majuscules/minuscules).

dimanche 28 octobre 2007

Un seul formulaire à la fois !

Comment faire en sorte que seulement un seul formulaire soit ouvert à la fois dans Access ? Ce qui équivaut à fermer tous les formulaires automatiquement, avant d'en ouvrir un nouveau !

Recopiez le code suivant dans un module standard Access :

Function OuvrirUnSeulFormulaire(ByVal strForm As String)
  ' Commencer par fermer tous les formulaires potentiellement ouverts
  Dim intI As Integer
  For intI = 0 To Forms.Count - 1
    DoCmd.Close acForm, Forms(0).name
  Next

  ' Ouvrir le formulaire souhaité en mode Normal
  DoCmd.OpenForm strForm, acNormal
End Function

Ensuite, pour appeler la fonction en VBA, il vous suffit d'écrire :

OuvrirUnSeulFormulaire "Nom d'un formulaire"

ou encore, si la fonction doit être appelée depuis une barre de menus ou d'outils :

=OuvrirUnSeulFormulaire("Nom d'un formulaire")

- page 3 de 4 -