IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Création de nouveaux champs dans une table en VBA [AC-2003]


Sujet :

VBA Access

  1. #1
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 12
    Points : 3
    Points
    3
    Par défaut Création de nouveaux champs dans une table en VBA
    Bonjour,

    Je travaille sur Access 2003. Pour le moment je n'utilise uniquement que les requêtes et les macros. Je n'y connais strictement rien en VBA (utilisation, mise en oeuvre, manipulation, etc...).

    Mon problème concret est simple :

    - création de nouveaux champs (texte, numérique) dans une table associée existante.

    Merci de m'aider en partant du tout début pour vos explications.

    Thierry

  2. #2
    Membre expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Points : 3 834
    Points
    3 834
    Par défaut
    Bonjour,

    ...- création de nouveaux champs (texte, numériques) dans une table associée existante.
    Il faudrait développer un peu plus ta demande
    Tu souhaites les ajouter "manuellement" par code VBA

    Sinon, sur ce Forum, tu trouves également une partie tutoriels pour "débuter" . . .
    . . . ainsi qu'une excellente

  3. #3
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonjour,

    Comme je le comprend, tu veux ajouter dynamiquement des champs en utilisant VBA.

    C'est possible avec DAO, mais ce n'est pas forcément d'un abord simple pour un débutant. Voir ce tutoriel : Définition et manipulation de données avec DAO.

    Notamment : Définition et manipulation de données avec DAO.

    Tout y est expliqué en détail.

    Domi2

  4. #4
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 12
    Points : 3
    Points
    3
    Par défaut merci, mais je suis nul !
    ok j'ai trouvé sur ce site un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim oDb As DAO.Database
    Dim oTbl As DAO.TableDef
    Dim oFld As DAO.Field
    Set oDb = CurrentDb
    Set oTbl = oDb.TableDefs("Client")
    'Etape 1 : Créer le champ
    Set oFld = oTbl.CreateField("AdresseClient", dbText, 120)
    'Etape 2 : Définit les propriétés
    oFld.AllowZeroLength = False 'Chaine vide autorisée : Non
    oFld.Required = True         'Null interdit : Oui
    'Etape 3 : Ajout du champ à la table
    oTbl.Fields.Append Fld
    'Rafraichit la collection
    oTbl.Fields.Refresh
    - est-ce bon ?
    - qu'en fait-on sous Access ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Oui, c'est ce genre de code, mais je me suis toujours demandé l'intérêt de créer dynamiquement des champs par VBA, surtout si cela devient récurrent.

    En général c'est du à un soucis de conception, peux-tu donner des éclaircissements sur ce point.

    Philippe

  6. #6
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 12
    Points : 3
    Points
    3
    Par défaut nécessité de création
    en fait, j'ai développé une application pour des amis. Elle est composée de 2 bases liées : une de données, une de manipulations (requêtes, formulaires, états, etc...).
    Je voudrais, pour une mise à jour programme, créer de nouveaux champs dans les tables de la base données, et ce à partir de la base manipultations. En effet, j'ai accès sans problème à cette dernière alors que la base données est spécifique aux utilisateurs.
    IL faut donc que j'ajoute des champs automatiquement dans une table liée.
    J'espère que je suis un peu plus clair, car ce n'est pas évident !
    merci
    Thierry

  7. #7
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Comment utiliser ce code dans Access ?
    il faut utiliser le menu Modules ? et après ? je ne connais rien dans ce domaine.
    Merci
    Thierry

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 27
    Points
    27
    Par défaut
    Ce code est un code en VBA, il s'utilise donc avec le Visual Basic Editor fourni avec Access. Il est utilisable dans un module, une macro, un formulaire ...

    Pour démarrer le Visual Basic Editor, fait ALT + F11, cela démarrera une seconde fenêtre en lien avec Access.

    Si c'est la première fois que tu ouvres l'éditeur, tu n'as probablement pas encore de Module. Clique Droit donc dans la fenêtre de gauche 'projet - [nom de ta base]' sur le fichier Module et Insertion/Module OU dans le menu, clique sur Insertion, puis module. (cf cours pour débuter)

    Un nouveau module est alors créé, tu peux y insérer ton code, en écrire, le tester (triangle vert dans la menu, ou F5)...

    Après c'est selon ce que tu veux en faire pour savoir s'il est préférable de le mettre simplement dans un module ou un formulaire.

    Si tu n'as jamais fait de VBA, je te conseille de regarder en premier lieu la FAQ Access et la FAQ VBA, ou comme l'a dit FreeAccess, les cours pour débuter.

    Tyrael

  9. #9
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 12
    Points : 3
    Points
    3
    Par défaut essais
    je suis tes indications.

    au moment de :
    "Un nouveau module est alors créé, tu peux y insérer ton code, en écrire, le tester (triangle vert dans la menu, ou F5)..."

    une fenêtre s'ouvre qui me demande :


    ???

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 27
    Points
    27
    Par défaut
    J'ai effectivement sauté une étape, pensant que tu aurai regardé un peu les FAQ.

    Une macro doit comporter un nom, sinon elle ne peut être appelée, c'est le cas auquel tu fais face. Le programme se demande qui il doit appellé car il n'y a pas de nom.

    Une macro commence toujours par un nom et se finit toujours par une fin (end)
    Tu as différentes macros : les public sub, private sub, function ...

    Dans ton cas, on va commencer avec une public sub (ou sub tout cours).

    Le code que tu as copié ne comporte donc pas de nom, ni de fin. Ajoute donc lui un nom (si possible explicite pour pouvoir te retrouver ensuite dans ton code) et une fin.

    ce qui nous donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Sub Mon_Premier_Code()
    '
    'ici tu insères ton morceau de code
    '
     
    end sub
    (Remplace évidemment les ', 'ici tu insères ton morceau de code, par le code que tu as mis plus haut dans ton post)

    Maintenant, tu n'aura plus de problème pour tester ton code. (triangle vert ou F5)

    (Ton code fait appel à DAO, l'endroit où tu as du le trouver, il devait être fait mention d'une référence à activer. N'oublie pas de l'activer, sinon ton code génèrera une erreur ! - les références se trouvent dans : Outils/Références dans le Visual Basic Editor, et la tu coches la référence dont il est fait mention à l'endroit où tu as trouvé ce bout de code)

    Je te conseille vraiment de consulter les FAQ qui sont très bien rédigées pour avancer pas à pas. Là tu commences immédiament par du brut. La théorie et le pas à pas sont bien plus éducatif et permettent d'apprendre plus facilement, sans faire d'erreur.

    Tyrael

  11. #11
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 12
    Points : 3
    Points
    3
    Par défaut essai
    en fait c'est que je suis "pressé" je dois régler le problème rapidement.

    j'ai encore un problème : un message d'erreur sur le code lors de l'exécution.

    erreur d'exécution '424' objet requis

    en débogage il me point
    "oTbl.Fields.Append Fld"

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 27
    Points
    27
    Par défaut
    Voila pourquoi tu es sensé comprendre le VBA pour régler 'rapidement' tes erreurs si tu es si pressé.

    Ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim oDb As DAO.Database
    Dim oTbl As DAO.TableDef
    Dim oFld As DAO.Field
    Set oDb = CurrentDb
    Set oTbl = oDb.TableDefs("Client")
    'Etape 1 : Créer le champ
    Set oFld = oTbl.CreateField("AdresseClient", dbText, 120)
    'Etape 2 : Définit les propriétés
    oFld.AllowZeroLength = False 'Chaine vide autorisée : Non
    oFld.Required = True         'Null interdit : Oui
    'Etape 3 : Ajout du champ à la table
    oTbl.Fields.Append Fld
    'Rafraichit la collection
    oTbl.Fields.Refresh
    Contient effectivement une erreur.

    Là où s'arrette ton code, il t'indique que l'objet Fld n'est pas défini. Effectivement, puisque 5 lignes au dessus, tu l'as défini avec le nom oFld.
    Change le Fld de ta ligne d'erreur par 'oFld' et le code fonctionnera.

    Tyrael

  13. #13
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 12
    Points : 3
    Points
    3
    Par défaut dur dur
    ok, la procédure fonctionne. je commence à comprendre.

    il reste un GROS problème : je recherche une procédure pour créer un champ dans une table liée (c'est indispensable) et celle-ci ne le permet pas.

    merci de ton aide précieuse et efficace.
    Thierry

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Tu ne peux modifier une table liée, il faut le faire dans ta base d'origine.

    Ton code au lieu d'utiliser la base en cours (CurrentDB) doit se connecter à l'autre base :

    http://warin.developpez.com/access/d...tie_3#L3.2.3.5

    Philippe

  15. #15
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 12
    Points : 3
    Points
    3
    Par défaut table liée
    Je pense que j'ai trouvé la solution :

    pour ouvrir la table liée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'Set oDb = OpenDatabase("c:\tempodonnées\données.mdb")'
    merci pour tout

    Thierry

  16. #16
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 12
    Points : 3
    Points
    3
    Par défaut contrôle
    encore un petit point.

    comment faire pour créer le champ uniquement s'il n'existe pas ?

    il faut donc un contrôle.

    Avez-vous des solutions ?

    merci

  17. #17
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 12
    Points : 3
    Points
    3
    Par défaut je ne suis pas doué
    j'ai suivi toutes les consignes.
    j'ai mon code dans VBA en modules : sub ajout_champ
    quand je teste à partir de vba (bouton vert) c'est ok

    je désirerais lancer ce module à partir d'une macro d'ouverture de ma base de données et c'est là que ça coince. comment faire ? j'ai tout essayé :
    - exécuter code ...
    - etc...
    j'ai bientôt fini de vous embêter. merci

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 27
    Points
    27
    Par défaut
    Il existe en VBA une macro qui s'éxécute à l'ouverture du document.
    Elle s'appelle : Autoexec
    Pour ce faire, sous Access (pas le Visual Basic Editor), tu cliques sur l'onglet Créer, puis l'onglet Macro, et tu mets :
    nom de la macro : Autoexec
    Action : Exécuter code
    nom de la fonction : le_nom_de_ton_sub_a_executer

    Cf site microsoft Office et le post de ashurai

    Tyrael

  19. #19
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 12
    Points : 3
    Points
    3
    Par défaut oui mais
    ok, pour autoexec, je sais
    mais il y a un problème pour "Executer code"
    dans nom de la fonction, Access m'ouvre le générateur d'expression.
    en fait si je comprends bien mon code est en sub et non en fonction.
    je fais le test.
    merci

  20. #20
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 12
    Points : 3
    Points
    3
    Par défaut presque bien
    ok ça fonctionne.
    reste la protection pour éviter le blocage (message d'erreur) dans le cas où le champ existe déjà.

    comment faire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Function ajout_champ_perso_2012()
     
    Dim oDb As DAO.Database
    Dim oTbl As DAO.TableDef
    Dim oFld As DAO.Field
     
    Set oDb = OpenDatabase("c:\tempodonnées\données.mdb")
    Set oTbl = oDb.TableDefs("etablissement")
    'Etape 1 : Créer le champ
    Set oFld1 = oTbl.CreateField("agent_epicea", dbText, 20)
    Set oFld2 = oTbl.CreateField("clas_epicea", dbText, 20)
    Set oFld3 = oTbl.CreateField("ISOEM", dbText, 1)
    'Etape 3 : Ajout du champ à la table
    oTbl.Fields.Append oFld1
    oTbl.Fields.Append oFld2
    'Rafraichit la collection
    oTbl.Fields.Refresh
    End Function

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [CakePHP] Modification de champs dans une table à chaque création d'un nouveau champs
    Par JangoBtz dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 20/03/2014, 15h50
  2. [MySQL] Création dynamique de champs dans une table
    Par kamnouz dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 31/05/2011, 11h09
  3. Création d'un champ dans une table via VBA
    Par Oliv'83 dans le forum VBA Access
    Réponses: 5
    Dernier message: 16/08/2010, 09h58
  4. Réponses: 7
    Dernier message: 16/10/2006, 18h40
  5. Ordre des champs dans une table
    Par patapetz dans le forum Outils
    Réponses: 5
    Dernier message: 30/07/2003, 06h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo