Clique sur CheckBox inscrit 0 ou 1 dans Access

Bonjour,

Je souhaiterais faire une procédure où lorsqu'on clique sur la checkBox1 cela inscrit 0 dans une table dans access et lorsqu'on clique sur CheckBox2 cela inscrit 1 dans la même table dans Access.

Par ailleurs, cela doit être dans la même case.

Pouvez-vous m'aider s'il-vous-plait ?

Bonjour,

A la lecture de tes différentes demandes à propos des interactions entre Excel et Access, il me semble que certains rappels pourraient être utiles. Voyons quelques points :

1/ Les TABLES Access.

Comme d'autres systèmes de base de données, Access stocke les données dans des tables. Chaque ligne d'une table représente un enregistrement.

Il est classique d'identifier un enregistrement par un n° d'index (le plus souvent auto-incrémenté). Cet index correspond à une "clé primaire" et permet de relier l'enregistrement aux info d'une autre table contenant ce même index (qui sera là une "clé secondaire").

Par exemple la table "Clients" suivante :

Id | Nom | Prénom

1 | Truc | Pierre

2 | Duch | Paul

est reliée à la table "Téléphones" :

Id | Id_client | Numero | Type

1 | 2 | 01 02 ...| Bureau

2 | 2 | 06 06 ...| Portable

Ainsi le client Duch, Id=2 est relié à 2 numéros de téléphone.

/!\ Attention : Id de la table "Clients" n'a rien à voir avec Id de la table "Téléphones", mais relié avec Id_client de cette table.

/!\ Attention : si Access autoincrémente seul les index quand on lui spécifie, depuis Excel il faut le faire soi-même!

2/ Les DONNEES Access.

Pour faire (très) simple, on peut distinguer 3 types de données : numérique - texte - date

Ces données sont stockées dans les tables de la façon suivante :

* la donnée numérique : 23,55 sera stockée sous la forme : 23.55

* la donnée date : 12/02/2018 sera stockée sous la forme : #02/12/2018# (soit #mm/jj/aaaa#, mois et jour inversé!)

* la donnée texte : Abcd sera stockée sous la forme : 'Abcd'.

/!\ Attention Particularité : l'information rue d'Isly sera stockée sous la forme 'rue d''Isly' : l'apostrophe est doublée!

Ce qui veut dire que pour injecter des données Excel vers Access, il sera nécessaire de les coder.

Ainsi on peut écrire 3 fonctions de codage :

Function Codage_num(S As String) As String
    If S = "" Then S = "0"
    S = Trim(S)
    Codage_num = Replace(S, ",", ".")
End Function

Function Codage_date(S As String) As String
Dim D As Variant

    D = Split(S, "/")
    Codage_date = "#" & D(1) & "/" & D(0) & "/" & D(2) & "#"
End Function

Function Codage_txt(S As String) As String
    Codage_txt = "'" & Replace(S, "'", "''") & "'"
End Function

/!\ Attention ces fonctions attendent en entrée une chaine de caractère, par exemple un Textbox.value (du texte donc)

3/ Le langage SQL.

Pour interagir avec Access, une possibilité relativement simple est d'utiliser de langage SQL. C'est un langage très utilisé, bien documenté (cf : http://sql.sh/) et qui s'intègre bien dans le VBA.

Les besoins classiques sont : créer un nouvel enregistrement, mettre à jour un enregistrement existant, lire un ou plusieurs enregistrements, et supprimer un enregistrement, soit les fonctions (les requêtes) : INSERT, UPDATE, SELECT et DELETE

Je te renvoie à la lecture du site de référence http://sql.sh/ pour la syntaxe des ces fonctions

L'insertion d'une ligne SQL via du VBA se fera par exemple :

Requete = "INSERT INTO [" & Tbl & "] (" & Head & ") VALUES (" & Data & ")"

/!\ Ici Tbl, Head et Data sont 3 variables alimentées auparavent.

4/ La connexion entre Excel et la base Access.

La séquence classique pour interagir depuis Excel avec un .accdb c'est :

_a_ je me connecte à la base

_b_ j'exécute ma requête en SQL

_c_ je me déconnecte

_4.a / La connexion.

On utilise la classique ADODB en partenariat avec un provider. Ici on a le choix entre activer ou non une référence à une bibiliothèque (Personnellement, je n'active pas de bibliothèque afin que l'appli ne soit pas dépendante des versions d'Excel).

Donc pour l'ADODB :

Dim Cnx As Object

    Set Cnx = CreateObject("ADODB.Connection")

Pour le provider, on a le choix entre plusieurs : Jet pour les anciennes versions d'Access, ACE pour les versions récentes et MSDASQL le 'couteau Suisse' qui marche avec un peut tout. Soit :

Dim Cnx As Object

    Set Cnx = CreateObject("ADODB.Connection")
    Cnx.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & BDD
    ' ou bien :
    'Cnx.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & BDD
    ' ou bien :
    'Cnx.Open "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" & BDD

/!\ A noter : la dernière ligne corresponds à MSDASQL on peut la faire précéder de :

Cnx.Provider = "MSDASQL"

Mais quans on dit Cnx.Open "DRIVER={Microsoft Access... on fait implicitement appel à MSDASQL

/!\ Ici BDD est une variable contenant le chemin et le nom de la base par ex : BDD="C:\Chemin\Mabase.accdb"

_4.b / Exécution de la requête.

Là, il y a 2 types de requêtes : une action qui n'attends 'rien' en retour (INSERT, UPDATE, DELETE) et un SELECT qui renvoie un jeu de données (un 'recordset')

Pour le premier type, c'est simple : Cnx.Execute Requete, et le tour est joué

Pour le SELECT, on a besoin de créer un nouvel objet 'ADODB.Recordset' et de l'ouvrir:

Dim Rst As Object
    Set Rst = CreateObject("ADODB.Recordset")
    Rst.Open Requete, Cnx, 3

/!\ Ici le 3 correspond au verrou adLockOptimistic (voir la doc microsoft=>https://docs.microsoft.com/fr-fr/sql/ado/reference/ado-api/locktypeenum)

Une fois que l'objet Recordset est instancié, on peut l'utiliser avec différentes méthodes (au sens POO), entre autres :

* Rst.MoveFirst => place le curseur au début des enregistrements

* Rst.RecordCount => renvoie le nb d'enregistrements

* Rst.Fields.Count => renvoie le nb de champs (de colonnes)

* Rst.Fields(j).Name => renvoie le nom du champs de la colonne j

(il suffit de boucler sur j pour obtenir tous les intitulés)

* Rst.GetRows => renvoie le contenu du recordset dans un tableau. Ce tableau s'utilise comme n'importe quel tableau en Vba, si le Rst.RecordCount est sup à 0 le tableau est en 2 dimensions

_4.c / Déconnexion.

C'est le plus facile, on ferme et on vide les variables objets pour libérer la mémoire :

    Cnx.Close
    Set Rst = Nothing
    Set Cnx = Nothing

5/ Exemples de requêtes :

En utilisant les principes énoncés précédemment, voici quelques exemples de requêtes (Req) plus ou moins complexes :

    Req = "DELETE FROM [" & Tbl & "] WHERE Id=" & Userform1.textbox1.value
    UPD="Nom=" &  Codage_txt(Userform1.textbox2.value)
    Req = "UPDATE [" & Tbl & "] SET " & UPD & " WHERE Id=" & Userform1.textbox1.value
    Data = Codage_num(Userform1.textbox1.value) & "," &  Codage_txt(Userform1.textbox2.value) & "," &  Codage_txt(Userform1.textbox3.value)
    Req = "INSERT INTO [" & Tbl & "] ("Id, Nom, Prenom") VALUES (" & Data & ")"
    Req = "SELECT MAX(V.Date_visite), M.Freq, R.Responsable, M.Id, M.Denomination, " & _
          " M.Reference, M.Emplacement, M.Batiment, M.Etage, M.Info1  " & _
          " FROM ([" & Materiel & "] AS M " & _
          " LEFT JOIN [" & Verif & "] AS V On M.Id=V.Id)" & _
          " LEFT JOIN [" & Responsables & "] AS R On R.Id_Resp=M.Id_Resp" & _
          " WHERE (dateadd('m',12/M.freq, V.Date_visite)<=" & CLng(Date) & _
          " OR V.Date_visite>=" & derJ & _
          " OR ISNULL(V.Date_visite)) "

Avec ces éléments on peut arriver à piloter assez facilement une base Access depuis Excel.

Bonne lecture

Pierre

Bonjour,

Merci beaucoup d'avoir prit le temps de m'expliquer les bases sur les interactions entre Excel et Access

J'ai réussi à résoudre mon problème sur comment en cliquant sur CheckBox cela inscrit un nombre dans access.

Encore merci

Rechercher des sujets similaires à "clique checkbox inscrit access"