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

Microsoft Office Discussion :

création d'une table en vba dans access [2016]


Sujet :

Microsoft Office

  1. #1
    Membre averti
    Homme Profil pro
    Développeur pour une association
    Inscrit en
    Août 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur pour une association
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 19
    Par défaut création d'une table en vba dans access
    Bonjour,
    Je suis sur access 2016
    J'ai un petit soucis que je ne comprends pas.
    quand je clic sur le bouton de sorti de mon formulaire je demande de créer une base avec des tables.
    La table se crée bien mais une erreur apparait sur la ligne de " Set Db = DBEngine.CreateDatabase(strdossier & "\" & strnombase, dbLangGeneral)
    "Erreur d'exécution '13' incompatibilité de type"

    Je ne sais pas comment mettre le texte de mon programme, alors je le colle ainsi dessous

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    Private Sub sortie_Click()
    If MsgBox("Vous quitter la compétition, désirez-vous la sauvegarder? ", 4) = vbYes Then
     Dim strdossier, strnombase, strtitre, strnomtable As String
     Dim fd, Db As Office.FileDialog
     
     Dim dbsnew As Database
     Dim sqfsauve, sqfvide As QueryDef
     Dim vtabarchive, vtabfiche, vtabtitre As Recordset
     Set vtafiche = CurrentDb.OpenRecordset("fiche", dbOpenDynaset)
     Set vtabarchive = CurrentDb.OpenRecordset("Archives", dbOpenDynaset)
     Set vtabtitre = CurrentDb.OpenRecordset("Titre", dbOpenDynaset)
     
     With vtabtitre
     strtitre = !Titre & "_" & !Ville & "_" & Left(!Date, 2) & "-" & Mid(!Date, 4, 2) & "-" & Right(!Date, 2)
     End With
     strnombase = strtitre & ".accdb"
     
     Set fd = Application.FileDialog(msoFileDialogFolderPicker)
     fd.Title = "Sélectionnez un dossier..."
     If fd.Show() Then
     strdossier = fd.SelectedItems(1)
    End If
    Set fd = Nothing
     
    If Dir(strdossier & "\" & strnombase) = "" Then
     With vtabarchive
     .AddNew
     !Nomarchive = strtitre
     .Update
     End With
     
     Set Db = DBEngine.CreateDatabase(strdossier & "\" & strnombase, dbLangGeneral)
     Else
     If MsgBox("Cette compétition a déjà été sauvegarder, désirez-vous la remplacer", 4) = vbYes Then
      Dim myFso, myFile, myFolder, strchemin
      Set myFso = CreateObject("Scripting.FileSystemObject")
      Set myFolder = myFso.GetFolder(strdossier)
      strchemin = strdossier & "/" & strnombase
      Kill (strchemin)   'strdossier & "\" & strnombase)
      Set Db = DBEngine.CreateDatabase(strdossier & "\" & strnombase, dbLangGeneral)
      Set dbsnew = DBEngine.Workspaces(0).OpenDatabase(strdossier & "\" & strnombase)
     End If
    End If
     
    '               Sauvegarde de titre
      Set sqfsauve = CurrentDb.CreateQueryDef("", "SELECT Titre.* INTO Titre IN """ & strdossier & "\" & strnombase & """ FROM Titre;")
      sqfsauve.Execute
    '               Sauvegarde de fiche
      Set sqfsauve = CurrentDb.CreateQueryDef("", "SELECT fiche.* INTO fiche IN """ & strdossier & "\" & strnombase & """ FROM fiche;")
      sqfsauve.Execute
    '               Sauvegarde de candidats
      Set sqfsauve = CurrentDb.CreateQueryDef("", "SELECT Candidats.* INTO Candidats IN """ & strdossier & "\" & strnombase & """ FROM Candidats;")
      sqfsauve.Execute
     
    With vtafiche
    If .EOF = False Then
     .MoveFirst
     Do While Not .EOF
     strnomtable = !Nomfiche
      Set sqfsauve = CurrentDb.CreateQueryDef("", "SELECT " & strnomtable & ".* INTO " & strnomtable & " IN """ & strdossier & "\" & strnombase & """ FROM " & strnomtable & ";")
      sqfsauve.Execute
     DoCmd.DeleteObject acTable, strnomtable
      Set sqfvide = CurrentDb.CreateQueryDef("", "Delete fiche.nomfiche, fiche.Nombathlete FROM fiche WHERE (((fiche.nomfiche)= '" & strnomtable & "'));")
      sqfvide.Execute
     .MoveNext
     Loop
    End If
    End With
     DoCmd.Close acForm, "Menu principale"
     DoCmd.OpenForm "Ouverture"
     Else
     DoCmd.Close acForm, "Menu principale"
     DoCmd.OpenForm "Ouverture"
    End If
    End Sub
    Si quelqu'un voit ou est le problème merci d'avance

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 110
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim strdossier, strnombase, strtitre, strnomtable As String
    Peux-tu me dire comment se comporte cette déclaration de variables selon toi ?

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  3. #3
    Membre averti
    Homme Profil pro
    Développeur pour une association
    Inscrit en
    Août 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur pour une association
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 19
    Par défaut
    Bonjour,

    Je penses qu'elle se comportent comme des chaines.
    Dois-je les déclarer autrement?

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    Seule la dernière variable sera effectivement déclarée comme string, le reste sera du Variant non ?

  5. #5
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 110
    Par défaut
    Bonjour,

    Non pas des chaines (String).

    Tout ce qui n'est pas explicitement typé en VBA est du Variant.

    D'où ce message d'erreur.

    Les déclarations doivent être effectuées comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim titi as String
    Dim toto as Integer
    Dim tete as String
    Ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim titi as String, toto as Integer, tete as String, tete as string
    Et surtout ne pas oublier la déclaration en en-tête de chaque module :

    Attention ! Ne pas connaitre les bases du VBA (comme tout autre langage) vous expose à des grosses déconvenues.
    Ici vous avez eu de la chance de tomber sur un message d'erreur explicite parce que vous l'utilisez comme paramètre typé dans fonction/méthode.
    Si ce n'était pas le cas vous n'auriez pas eu de message mais vos données auraient pu être altérées ce qui pour une application critique peut conduire à de gros problèmes.

    Cordialement,

    PS : je passe le DefType.
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  6. #6
    Membre averti
    Homme Profil pro
    Développeur pour une association
    Inscrit en
    Août 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur pour une association
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 19
    Par défaut
    Je vous remercie, pour cette explication.
    Je vous confirme que je me forme sur vos forum, qui sont d'une aide précieuse, et que je ne suis pas un programmeur confirmé.
    Et bien sur Option Explicit et bien déclarer en début de module.
    si je ne doit pas déclarer mes variables en string, je ne vois pas en quelle type je dois les déclarer, vu que je construit un nom de base avec des chaines de caractères.
    Pouvez-vous m'éclairer, sur le sujet.
    Merci d'avance

  7. #7
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 110
    Par défaut
    Nous ne sommes pas bien compris.

    Quand j'affirme :

    Non pas des chaines (String).
    C'est en réponse à

    Je penses qu'elle se comportent comme des chaines.
    Autrement dit, si pour vous toto titi et tata sont toutes en string :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim toto, titi, tata as string
    ce n'est pas vrai :

    toto et titi ne sont pas typées explicitement, elles sont donc en Variant. Seule Tata est typée en String.

    Mon conseil :
    Ne jamais présumer d'un fonctionnement ou d'une syntaxe. Il faut en être sûr et pour cela il n'y a que la documentation qui fait foi.
    Pour les variables :
    https://learn.microsoft.com/fr-fr/of...ring-variables
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  8. #8
    Membre averti
    Homme Profil pro
    Développeur pour une association
    Inscrit en
    Août 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur pour une association
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 19
    Par défaut
    Bonjour et merci,
    Je me suis trompé et je croyais quand les déclarant ainsi elles étaient toutes déclarées en string.
    Donc je viens d'apprendre une chose.
    J'ai donc déclaré chaque variable indépendamment en string, mais le message est réapparu.
    J'en ai déduit que ce n'était pas les variables chaine le problème, mais plutôt la variable Db que j'avais déclaré comme ceci 'Dim Fd, Db As Office.FileDialog'
    J'ai donc inversé pour voir comment cela réagirait. ' Dim Db, Fd As Office.FileDialog' et cela a fonctionné. Je n'ai plus eu le message d'erreur.
    Donc Db n'est pas une variable Office.FileDialog et est devenu variante.
    Est-ce une bonne chose ou alors en quelle type dois-je la déclarer?

  9. #9
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 110
    Par défaut
    Bonjour,

    En lisant le code attentivement j'ai l'impression que tu ne maitrise pas les déclarations de variables, leur type et leur durée de vie. C'est risqué.
    Avant de déclarer une variable tu dois avoir le réflexe suivant :
    Qu'est ce que je vais y mettre dedans ?
    Je regarde l'objet dans la doc (F1) et j'y affecte le type correspondant.
    Pour la variable db on voit qu'on y affecte un objet de type DAO.Database

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set Db = DBEngine.CreateDatabase(strdossier & "\" & strnombase, dbLangGeneral)
    Donc un db en variant comme tu le fais :

    ça fonctionnera mais tu te prive de l'autocomplétion.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim db as dao.database 'si tu utilise DAO et ADO
    ' ou
    dim db as database  'si tu n'utilise qui DAO
    serait plus approprié comme tu l'as déclaré ici :

    Je note également que tu ouvres des objets mais jamais tu ne les fermes pas. Ce n'est pas propre et ça peut créer de la consommation mémoire et des notamment curseurs ouverts sur les recordset.

    Tout objet ouvert doit être fermé ou libéré si la méthode close n'est pas disponible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    rst.close
    db.close
     
    set x = nothing
    set rst = nothing
    set db = nothing
    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  10. #10
    Membre averti
    Homme Profil pro
    Développeur pour une association
    Inscrit en
    Août 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur pour une association
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 19
    Par défaut
    Bonjour,
    Et encore merci pour ces réponses.
    Tu as raison je ne maitrise pas bien les définitions de variable car je ne comprend pas toujours les explications de la doc (F1)
    Mais grâce à vous je vais m'en sortir et améliorer mes connaissances.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Création d'une table de fait dans SSAS
    Par Gobelink dans le forum Débuter
    Réponses: 2
    Dernier message: 20/05/2014, 17h38
  2. [AC-2003] Création de nouveaux champs dans une table en VBA
    Par lambith dans le forum VBA Access
    Réponses: 24
    Dernier message: 31/03/2013, 10h56
  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, 10h58
  4. Lier une table sql server dans access
    Par PICANTO dans le forum Access
    Réponses: 1
    Dernier message: 11/04/2007, 12h42
  5. [VB.NET] création d'une table dans une base access
    Par smedini dans le forum Accès aux données
    Réponses: 1
    Dernier message: 31/12/2005, 12h53

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