macro pour creer une table access depuit un excel

chich

XLDnaute Occasionnel
Bonsoir a tous
je cherche une solution qui a partir d'un bouton dans un userform excel
déclenche la suppression de la table "LES CLIANTS" dans un fichier access "Listable.accdb"
et creer une nouvelle table access"LES CLIANTS" avec un clé automatique qui accepte les doublons
depuis un autre fichier excel "xxxxxxx"dans mon fichier access "Listable.accdb" dans le meme repertoire
merci d'avance
Cordialement
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Bonsoir chich

Avec une petite recherchr sur le net, tu aurais trouvé ceci : ACCESS ;)

Et ceci à adapter à ton cas

VB:
Sub cree_table()
'Nécessite d 'activer les références:
    'Microsoft ActiveX Data Objects x.x Library
    'et
    'Microsoft ADO Ext. x.x for DDL and Security
Dim Cnn As ADODB.Connection
Dim Cat As ADOX.Catalog
Dim MaTableIndex As ADOX.Table
Dim NomTable As String
Dim Fichier As String
On Error GoTo Fin
Fichier = "C:\reptest\MaNouvelleBase.accdb"
Set Cnn = New ADODB.Connection
Cnn.Open "Provider='Microsoft.Jet.OLEDB.4.0';" & _
    "Data Source='" & Fichier & "';"
Set Cat = New ADOX.Catalog
Set Cat.ActiveConnection = Cnn
'Nom de la table qui va être ajoutée
    NomTable = "MaTable"
Set MaTableIndex = CreateObject("ADOX.Table")
'Définit les champs pour la nouvelle table
    With MaTableIndex
        .Name = NomTable
        With .Columns
            .Append "ChampDate", adDate, 50
            .Append "ChampNombre", adInteger, 50
            .Append "ChampTexte", adWChar, 80
        End With
    End With
    'Création table
    Cat.Tables.Append MaTableIndex
    Set Cat = Nothing
Fin:
Cnn.Close
Set Cat = Nothing
Set MaTableIndex = Nothing
Set Cnn = Nothing
End Sub
 
Dernière édition:

chris

XLDnaute Barbatruc
Bonjour

Par définition une clé n'accepte pas les doublons. Tu veux sans doute une numérotation automatique qui ne contrôle pas les autres champs et dont l'utilité du coup interroge...

Une base de données bien conçue est comme un mécanisme d'horlogerie : tous les rouages doivent être interdépendants, bien pensés et bien assemblés pour que cela tourne parfaitement.

Les tables doivent être définies de façon précise...

Ta question laisse penser que tu bricoles la base...

Tu devrais avoir une table correctement structurée, que tu peux éventuellement vider de ses enregistrements pour en charger de nouveaux, mais balancer des lignes Excel comme table n'est pas le meilleur moyen de tirer partie des possibilités d'un Système de bases de données relationnelles tel qu'Access...
 

chich

XLDnaute Occasionnel
Bonjour

Par définition une clé n'accepte pas les doublons. Tu veux sans doute une numérotation automatique qui ne contrôle pas les autres champs et dont l'utilité du coup interroge...

Une base de données bien conçue est comme un mécanisme d'horlogerie : tous les rouages doivent être interdépendants, bien pensés et bien assemblés pour que cela tourne parfaitement.

Les tables doivent être définies de façon précise...

Ta question laisse penser que tu bricoles la base...

Tu devrais avoir une table correctement structurée, que tu peux éventuellement vider de ses enregistrements pour en charger de nouveaux, mais balancer des lignes Excel comme table n'est pas le meilleur moyen de tirer partie des possibilités d'un Système de bases de données relationnelles tel qu'Access...
Re
comme tu dit oui je bricole je passe par access que je découvre pour gérer le grand volume de donne ou il y a des doublons
si on peux vider une table existante et la réalimenter je suis preneur
Cordialement
 

Modeste geedee

XLDnaute Barbatruc
Bonsour®
Bonjour

Par définition une clé n'accepte pas les doublons. Tu veux sans doute une numérotation automatique qui ne contrôle pas les autres champs et dont l'utilité du coup interroge...

Une base de données bien conçue est comme un mécanisme d'horlogerie : tous les rouages doivent être interdépendants, bien pensés et bien assemblés pour que cela tourne parfaitement.

Les tables doivent être définies de façon précise...****

Ta question laisse penser que tu bricoles la base...

Tu devrais avoir une table correctement structurée, que tu peux éventuellement vider de ses enregistrements pour en charger de nouveaux, mais balancer des lignes Excel comme table n'est pas le meilleur moyen de tirer partie des possibilités d'un Système de bases de données relationnelles tel qu'Access...
:rolleyes:;):cool:
**** l'idéal serait de respecter les règles de CODD...
https://fr.wikipedia.org/wiki/12_règles_de_Codd
 

Lone-wolf

XLDnaute Barbatruc
Bonjour à tous :)

@chich : pour créer une table dans une base existante.

VB:
Sub CreeTable()
'Activer la référence ActiveX Data Object 2.8 Library

Dim cn As ADODB.Connection
Dim sSQL As String
Dim CheminBase As String

  CheminBase = ThisWorkbook.Path & "\Base.accdb"

sSQL = "CREATE TABLE CLIENTS (" & _
            "ID COUNTER CONSTRAINT PrimaryKey PRIMARY KEY, " & _
           "Nom varchar(80), " & "Prénom varchar(80), " & "Adresse varchar(255), " & _
           "Code_Postal varchar(30), " & "Ville varchar(80), " & _
          "Téléphone varchar(30), " & "Email varchar(80))"
  
  Set cn = New ADODB.Connection
  cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _
  "Data Source=" & CheminBase & ";"
  cn.Execute sSQL
End Sub

Pour supprimer une table existante

VB:
Sub Suppr_Table()
'Activer la référence Microsoft DAO Object library
Dim db As DAO.Database
Dim CheminBase As String

    CheminBase = ThisWorkbook.Path & "\Base.accdb"

    Set db = OpenDatabase(CheminBase)

    db.TableDefs.Delete "CLIENTS"

End Sub
 
Dernière édition:

chich

XLDnaute Occasionnel
Bonjour à tous :)

@chich : pour créer une table dans une base existante.

VB:
Sub CreeTable()
'Activer la référence ActiveX Data Object 2.8 Library

Dim cn As ADODB.Connection
Dim sSQL As String
  CheminBase = ThisWorkbook.Path & "\Base.accdb"

sSQL = "CREATE TABLE CLIENTS (" & _
  "ID COUNTER CONSTRAINT PrimaryKey PRIMARY KEY, " & _
  "Nom varchar(80), " & "Prénom varchar(80), " & "Adresse varchar(255), " & _
  "Code_Postal varchar(30), " & "Ville varchar(80), " & _
  "Téléphone varchar(30), " & "Email varchar(80))"
  
  Set cn = New ADODB.Connection
  cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _
  "Data Source=" & CheminBase & ";"
  cn.Execute sSQL
End Sub

Pour supprimer une table existante

VB:
Sub Suppr_Table()
'Activer la référence Microsoft DAO Object library
Dim db As DAO.Database
Dim CheminBase As String

    CheminBase = ThisWorkbook.Path & "\Base.accdb"

    Set db = OpenDatabase(CheminBase)

    db.TableDefs.Delete "CLIENTS"

End Sub

Re
merci je m'explique plus clairement je souhaite d'abord supprimer la table clients existante
puis en créer une nouvelle dans la quelle il faut importer la "CLIENTS" d'un autre classeur excel "xxxxx"a jours
que je téléchargé toutes les heures pour actualiser ma base de donner access "Listable.accdb" qui existe

-Pour Sub Suppr_Table() c'est OK ca fonctionne très bien!
-Pour Sub CreeTable() ca plante j' ai le message la base existe déjà !
-Comment importer la feuil "CLIENTS" du classeur télécharger dans le meme repertoire
que ma base de donner access "Listable.accdb" qui existe?
Merci d'avance
Cordilement
 

chris

XLDnaute Barbatruc
Bonjour

Nous avions bien compris ton 1er post mais nous somme plusieurs à t'avoir conseillé de ne pas procéder de cette manière car transférer une liste Excel comme table Access pourrit la base mais puisque tu persistes...
 

Lone-wolf

XLDnaute Barbatruc
Re à tous :)

Si tu y tiens vraiment, la base de données ainsi que le classeur source doivent être dans Documents.

VB:
Public Const Fichier$ = "C:\Users\chich\Documents\Base.accdb"

'Activer la référence Microsoft Access 15.0 Object Library
Sub Insertion_Donnees()
Dim acc As New Access.Application

acc.opencurrentdatabase Fichier                         'Table Access"                                           'Plage du tableau Excel
acc.DoCmd.TransferSpreadsheet acImport, 8, "CLIENTS", "Tables Access.xlsm", True, "A1:L22"
acc.closecurrentdatabase
Set acc = Nothing
End Sub

EDIT: c'est bizarre le message d'erreur. Voici un exemple avec deux tables.

VB:
'Activer la référence Microsoft ActiveX Data Object 2.8 Library
Public Const Fichier$ = "C:\Users\chich\Documents\Base.accdb"

Sub CreeTables()
Dim cn As ADODB.Connection
Dim sSQL1$, sSQL2$

    sSQL1 = "CREATE TABLE CLIENTS (" & _
            "ID COUNTER CONSTRAINT PrimaryKey PRIMARY KEY, " & _
            "Titre varchar(80), " & "Nom varchar(80), " & "Prénom varchar(80), " & "Fonction varchar(255), " & _
            "Société varchar(255), " & "Adresse varchar(255), " & "Code_Postal varchar(30), " & "Ville varchar(80), " & _
            "Téléphone varchar(30), " & "Fax varchar(30), " & "Email varchar(80), " & "N°_Client varchar(80))"

    sSQL2 = "CREATE TABLE REPRESENTANTS (" & _
            "ID COUNTER CONSTRAINT PrimaryKey PRIMARY KEY, " & _
            "Titre varchar(80), " & "Nom varchar(80), " & "Prénom varchar(80), " & "Fonction varchar(255), " & _
            "Société varchar(255), " & "Adresse varchar(255), " & "Code_Postal varchar(30), " & "Ville varchar(80), " & _
            "Téléphone varchar(30), " & "Fax varchar(30), " & "Email varchar(80))"

    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _
            "Data Source=" & Fichier & ";"
    cn.Execute sSQL1
    cn.Execute sSQL2

End Sub

tables.gif
 
Dernière édition:

chich

XLDnaute Occasionnel
Re à tous :)

Si tu y tiens vraiment, la base de données ainsi que le classeur source doivent être dans Documents.

VB:
Public Const Fichier$ = "C:\Users\chich\Documents\Base.accdb"

'Activer la référence Microsoft Access 15.0 Object Library
Sub Insertion_Donnees()
Dim acc As New Access.Application

acc.opencurrentdatabase Fichier                         'Table Access"                                           'Plage du tableau Excel
acc.DoCmd.TransferSpreadsheet acImport, 8, "CLIENTS", "Tables Access.xlsm", True, "A1:L22"
acc.closecurrentdatabase
Set acc = Nothing
End Sub

EDIT: c'est bizarre le message d'erreur. Voici un exemple avec deux tables.

VB:
'Activer la référence Microsoft ActiveX Data Object 2.8 Library
Public Const Fichier$ = "C:\Users\chich\Documents\Base.accdb"

Sub CreeTables()
Dim cn As ADODB.Connection
Dim sSQL1$, sSQL2$

    sSQL1 = "CREATE TABLE CLIENTS (" & _
            "ID COUNTER CONSTRAINT PrimaryKey PRIMARY KEY, " & _
            "Titre varchar(80), " & "Nom varchar(80), " & "Prénom varchar(80), " & "Fonction varchar(255), " & _
            "Société varchar(255), " & "Adresse varchar(255), " & "Code_Postal varchar(30), " & "Ville varchar(80), " & _
            "Téléphone varchar(30), " & "Fax varchar(30), " & "Email varchar(80), " & "N°_Client varchar(80))"

    sSQL2 = "CREATE TABLE REPRESENTANTS (" & _
            "ID COUNTER CONSTRAINT PrimaryKey PRIMARY KEY, " & _
            "Titre varchar(80), " & "Nom varchar(80), " & "Prénom varchar(80), " & "Fonction varchar(255), " & _
            "Société varchar(255), " & "Adresse varchar(255), " & "Code_Postal varchar(30), " & "Ville varchar(80), " & _
            "Téléphone varchar(30), " & "Fax varchar(30), " & "Email varchar(80))"

    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _
            "Data Source=" & Fichier & ";"
    cn.Execute sSQL1
    cn.Execute sSQL2

End Sub

Regarde la pièce jointe 1012260

Re
Super merci beaucoup
un dernier souci j'ai besoin d'une colonne a gauche de la table qui numérote automatiquement
chaque enregistrement de la table importer
Cordialement
 

Discussions similaires

Statistiques des forums

Discussions
312 198
Messages
2 086 126
Membres
103 127
dernier inscrit
willwebdesign