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

Macros et VBA Excel Discussion :

Questions concernant la création d'une table MDB en VBA Excel


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Automatisme, robotique et info indus
    Inscrit en
    Avril 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Automatisme, robotique et info indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 49
    Par défaut Questions concernant la création d'une table MDB en VBA Excel
    Bonjour,

    Je souhaite créer une une base de donnée MDB à partir de VBA Excel. Après diverses recherches sur le net, j'en suis arrivé à utiliser deux méthodes, mais j'ai quelques questions à leur propos.

    1- en utilisant une requête SQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Dim cnn As Object
        Dim cat As Object
     
        Set cnn = CreateObject("ADODB.Connection")
        Set cat = CreateObject("ADOX.Catalog")
        cat.Create "Provider=Microsoft.Jet.OLEDB.4.0; Jet OLEDB:Engine Type=5; Data Source=E:\2017\Bilan.mbd"
        cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\2017\Bilan.mbd"
        cnn.Execute "CREATE TABLE Files (Id INT PRIMARY KEY NOT NULL, Path VARCHAR(255))", adCmdText + adExecuteNoRecords
     'cnn.Execute "CREATE UNIQUE INDEX UX_Id ON Files (Id )", adCmdText
        cnn.Close
        Set cat = Nothing
        Set cnn = Nothing
    Ce code me crée bien ma base et ma table.

    Nom : Screenshot_3.png
Affichages : 365
Taille : 58,1 Ko

    En utilisant cette méthode, y-a-t-il un moyen de faire en sorte que le champ Id s'auto-incrémente au fur et à mesure des ajouts d'enregistrements?

    1- en utilisant ADOX

    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
        Dim cnn As Object
        Dim cat As Object
        Dim objTable As Object
        Dim objKey As Object
     
        Set cnn = CreateObject("ADODB.Connection")
        Set cat = CreateObject("ADOX.Catalog")
        Set objTable = CreateObject("ADOX.Table")
        Set objKey = CreateObject("ADOX.Key")
        cat.Create "Provider=Microsoft.Jet.OLEDB.4.0; Jet OLEDB:Engine Type=5; Data Source=E:\2017\Bilan.mbd"
        cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\2017\Bilan.mbd"
        Set cat.ActiveConnection = cnn
        objTable.Name = "Files"
        With objTable.Columns
         .Append "Id", adInteger
          .Append "Path", adWChar, 255
        End With
        objKey.Name = "Id"
        objKey.Type = adKeyPrimary
        objKey.Columns.Append "Id"
        objTable.Keys.Append objKey
        cat.Tables.Append objTable
        cnn.Close
        Set objTable = Nothing
        Set cat = Nothing
        Set cnn = Nothing
    Nom : Screenshot_4.png
Affichages : 366
Taille : 57,4 Ko

    Même question, y-a-t-il un moyen de faire en sorte que le champ Id s'auto-incrémente au fur et à mesure des ajouts d'enregistrements?

    N'étant pas un expert en VBA et bases de données, quels sont les avantages / inconvénients de ces deux méthodes?

    Voyez vous dans ces deux codes des erreurs ou choses choquantes?

    Merci.

    Ikes qui ne demande qu'à apprendre et comprendre.

  2. #2
    Membre averti
    Homme Profil pro
    Automatisme, robotique et info indus
    Inscrit en
    Avril 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Automatisme, robotique et info indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 49
    Par défaut
    Bon, je me répond à moi même, j'ai trouvé une réponse pour l'auto-incrémentation avec ADOX.

    J'ai trouvé l'info ici, c'est plutôt complet et bien expliqué. Et ça fonctionne!

    Nom : Screenshot_5.png
Affichages : 318
Taille : 57,7 Ko

    Bon, par contre je suis toujours preneur pour des réponses à mes autres questions.

    Edit: j'ai aussi trouvé des infos sur l'implémentation de l'auto-incrémentation .

  3. #3
    Invité
    Invité(e)
    Par défaut
    bonsoir,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cn.Execute "CREATE TABLE Files (Id AUTOINCREMENT PRIMARY KEY NOT NULL, Path VARCHAR(255))"
    Dernière modification par Invité ; 06/04/2017 à 13h32.

  4. #4
    Membre averti
    Homme Profil pro
    Automatisme, robotique et info indus
    Inscrit en
    Avril 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Automatisme, robotique et info indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 49
    Par défaut
    Merci dysorthographie.

    Pour le choix de la méthode, y-a-t-il des avantages à utiliser l'une plutôt que l'autre (hors le fait que celle en SQL soit plus simple à écrire)?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je ne sais pas si ça répond à ta question, mais en 20 d'expérience je n'ai jamais utilisé Adodx!

  6. #6
    Membre averti
    Homme Profil pro
    Automatisme, robotique et info indus
    Inscrit en
    Avril 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Automatisme, robotique et info indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 49
    Par défaut
    Bonjour,

    Bon, j'ai suivi tes conseils dysorthographie et me suis donc lancer dans la création de mes tables à l'aide de requêtes SQL.
    Et après pas mal de recherches et d'essais, j'arrive presque à mes fins.

    J'ai pour l'instant deux petits soucis. Pour le premier, l'une des colonnes doit s'appeler Year, sauf que c'est un mot clé et du coup j'ai une erreur lors de l’exécution de la requête. J'ai donc mis 'Year', ça fonctionne, mais du coup j'ai aussi les simples cotes dans le nom de la colonne. Y-a-t-il une syntaxe spécifique pour utiliser un mot clé comme nom de colonne ou n'est-ce tout simplement pas possible?

    Mon code actuel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
       cnn.Execute "CREATE TABLE t_Imputation (Id int NOT NULL IDENTITY(1, 1) PRIMARY KEY," _
                    & "FilePath varchar(255) NOT NULL," _
                    & "FileName varchar(8) NOT NULL," _
                    & "'Year' int NOT NULL," _
                    & "Week int NOT NULL," _
                    & "ProjectNumber varchar(6) NULL," _
                    & "ProjectElement varchar(6) NULL," _
                    & "TacheCode varchar(3) NULL," _
                    & "Imputation real NOT NULL," _
                    & "CONSTRAINT fk_FilePath_FileName FOREIGN KEY (FilePath, FileName) REFERENCES t_Files(Path, Name) ON DELETE CASCADE ON UPDATE NO ACTION," _
                    & "CONSTRAINT chk_ProjectNumber CHECK (ProjectNumber LIKE '[0-9][0-9][0-9][0-9][0-9][0-9]')," _
                    & "CONSTRAINT chk_ProjectElement CHECK (ProjectElement IN ('IMP01','ETU01','ETU02','ETU03','ETU05','DEPL01','CHA02','ATE01','SYCN01','SYDE01'))," _
                    & "CONSTRAINT chk_TacheCode CHECK (TacheCode IN ('30','75','150','V','JS','VT','X','VX')))", adCmdText + adExecuteNoRecords
    Pour le deuxième problème, cela concerne les nombres. Dans le code ci-dessus, j'ai des soucis avec la colonne Imputation. Par exemple, si je rentre la valeur 33,2 dans ma base, je me retrouve avec la valeur 33.2016971 après validation.
    Pour cette colonne, j'ai essayé différents formats (decimal(x,y), numeric(x,y)), mais à chaque fois je me retrouve avec un format currency dans la base et ça merdouille lorsque je saisis une valeur et que je tente de valider. J'ai à chaque fois un message d'erreur.

    Nom : Screenshot_6.png
Affichages : 280
Taille : 17,0 Ko

    Nom : Screenshot_7.png
Affichages : 289
Taille : 43,5 Ko

    Sinon, voici le code complet de création de mes tables. Avez-vous des remarques qui me permettrait d'améliorer celui-ci?

    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
    Sub CreateNewMDBSQL()
     
    '***************************************************************************
    'Création de la base de données bilan
    '***************************************************************************
     
    'Déclaration
        Dim cnn As Object
        Dim cat As Object
     
    'Initialisation
        Set cnn = CreateObject("ADODB.Connection")
        Set cat = CreateObject("ADOX.Catalog")
     
    'Création de la base de données Bilan.accdb
        cat.Create "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & ThisWorkbook.Path & "\Bilan.accdb; Mode =" & adModeShareExclusive
        Set cnn = cat.ActiveConnection
     
    'Création de la table Files
        cnn.Execute "CREATE TABLE t_Files (FileId int NOT NULL IDENTITY(1, 1) PRIMARY KEY," _
                    & "Path varchar(255) NOT NULL," _
                    & "Name varchar(8) NOT NULL," _
                    & "DateLastModified datetime NOT NULL," _
                    & "UpdateRequired bit DEFAULT True," _
                    & "Excluded bit DEFAULT False," _
                    & "CONSTRAINT chk_FileExist UNIQUE (Path,Name)," _
                    & "CONSTRAINT chk_FileName CHECK (Name LIKE '[Ss][0-5][1-9].xlsm')," _
                    & "CONSTRAINT chk_DateLastModified CHECK (DateLastModified >= #01/01/2017# AND DateLastModified <= date()))", adCmdText + adExecuteNoRecords
     
    'Création de la table Imputation
       cnn.Execute "CREATE TABLE t_Imputation (Id int NOT NULL IDENTITY(1, 1) PRIMARY KEY," _
                    & "FilePath varchar(255) NOT NULL," _
                    & "FileName varchar(8) NOT NULL," _
                    & "'Year' int NOT NULL," _
                    & "Week int NOT NULL," _
                    & "ProjectNumber varchar(6) NULL," _
                    & "ProjectElement varchar(6) NULL," _
                    & "TacheCode varchar(3) NULL," _
                    & "Imputation decimal(2,2) NOT NULL," _
                    & "CONSTRAINT fk_FilePath_FileName FOREIGN KEY (FilePath, FileName) REFERENCES t_Files(Path, Name) ON DELETE CASCADE ON UPDATE NO ACTION," _
                    & "CONSTRAINT chk_ProjectNumber CHECK (ProjectNumber LIKE '[0-9][0-9][0-9][0-9][0-9][0-9]')," _
                    & "CONSTRAINT chk_ProjectElement CHECK (ProjectElement IN ('IMP01','ETU01','ETU02','ETU03','ETU05','DEPL01','CHA02','ATE01','SYCN01','SYDE01'))," _
                    & "CONSTRAINT chk_TacheCode CHECK (TacheCode IN ('30','75','150','V','JS','VT','X','VX')))", adCmdText + adExecuteNoRecords
        cnn.Close
        Set cat = Nothing
        Set cnn = Nothing
     
    End Sub

  7. #7
    Invité
    Invité(e)
    Par défaut
    bonjour,
    les mots réservés comme les mots composés s'écrivent entre crochets!

    D'une marnière général les champs s'écrivent entre crochets!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "[year],[la Date],[l''apostrophe]
    dans le nom des champs on proscrira les apostrophe!
    Dernière modification par Invité ; 21/04/2017 à 08h21.

  8. #8
    Membre averti
    Homme Profil pro
    Automatisme, robotique et info indus
    Inscrit en
    Avril 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Automatisme, robotique et info indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 49
    Par défaut
    Oui, effectivement c'est bien ça. J'avais trouvé de la doc là dessus, mais impossible de la retrouver.
    Merci dysorthographie.

    Par contre, pour mes problèmes de nombre, une idée?

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Par contre, pour mes problèmes de nombre, une idée?
    NUMBER(18, 2)

  10. #10
    Membre averti
    Homme Profil pro
    Automatisme, robotique et info indus
    Inscrit en
    Avril 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Automatisme, robotique et info indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 49
    Par défaut
    Mon code, il n'en veut pas du format number.
    Et avec numeric ou decimal, toujours impossible de valider l'enregistrement.

  11. #11
    Invité
    Invité(e)
    Par défaut
    j'ai test "CREATE TABLE BOF (Id AUTOINCREMENT PRIMARY KEY NOT NULL, Path NUMERIC (18,2))" et ça fonction!

  12. #12
    Membre averti
    Homme Profil pro
    Automatisme, robotique et info indus
    Inscrit en
    Avril 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Automatisme, robotique et info indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 49
    Par défaut
    Et bien chez moi, ça ne veut pas.
    Que je crée ma table avec une requête SQL ou que je passe par ADOX, je me retrouve avec un format currency dans ma base et l'impossibilité de valider les enregistrements.
    J'ai ce beau message d'erreur :

    Nom : Screenshot_8.png
Affichages : 277
Taille : 16,2 Ko

    Si je ne trouve pas la solution, je vais me limiter au format float.

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/04/2009, 23h20
  2. [XL-2000] trier et renommer une table access depuis vba excel
    Par lascrabbleuse dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 14/04/2009, 16h05
  3. Création d'une table temp en vba
    Par isabelle b dans le forum VBA Access
    Réponses: 2
    Dernier message: 12/12/2008, 08h10
  4. Question sur la création d'une table
    Par air dans le forum Oracle
    Réponses: 4
    Dernier message: 23/10/2005, 12h46
  5. INTERBASE Création d'une table
    Par Corben dans le forum InterBase
    Réponses: 2
    Dernier message: 19/06/2004, 20h55

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