OVH Cloud OVH Cloud

macro pour creer une table access depuit un excel

10 réponses
Avatar
Gortex
Bonjour,
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

Sub Connecte_base_Access()
Dim rs As Object
Dim Nom_Base, Chemin_Base, SQL ', connstring

Set conn = CreateObject("ADODB.Connection")
Nom_Base = "Listable.accdb"
Chemin_Base = ThisWorkbook.Path & "" & Nom_Base
'chaine de connexion
connstring = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" & Chemin_Base
'Connexion a la base
conn.Open connstring
End Sub
Sub Import_Click()
Dim rs As Object
Dim SQL

Set rs = CreateObject("ADODB.recordset")

SQL = "Delete * from [LES CLIANTS]
rs.Open SQL, conn, 3, 3

rs.Close
MsgBox "Attention: la table est suprimer!!"
End Sub

10 réponses

Avatar
Michd
Bonjour,
Je te propose cette manière de procéder.
Prends le temps de lire la procédure, et adapte le code selon ton
environnement.
Exemple Chemin par le vrai chemin de ta base de données.
Il en va de même pour le nom de la feuille et de la plage
de cellules à exporter.
Tu peux mettre à procédure dans un module standard de ton
projet et tu appelles la procédure au moment voulu à partir
du formulaire.
Si tes données dans Excel sont modifiées, il ne faut pas oublier
d'enregistrer le classeur avant d'exporter ses données.
Je n'ai pas testé la procédure, je n'ai pas l'environnement pour le faire!
'---------------------------------------------------------
Sub Access_Export_Table()
'Dans Excel il fut ajouté la référence suivante
'"Microsoft Access xx.0 Objects library"
'pour ce faire, barre des menus / outils / références
'cocher la référence mentionnée.
'Déclaration de la variable
Dim AppAccess As Access.Application
'Crée une instance d'Access
Set AppAccess = CreateObject("Access.application")
'Rend visible la base de données. Ce n'est pas
'obligatoire, après test, tu peux mettre à False
AppAccess.Visible = True
'Ouvre la base de données en mode exclusif
AppAccess.OpenCurrentDatabase "C:CheminListable.accdb", True
'Supprime la table "NomDeLaTable" de la base de
'Données que l'on vient d'ouvrir
'CLIANTS -> ne devrait-il pas s'écrire "CLIENTS".
DoCmd.DeleteObject acTable, "LES CLIANTS"
'Transfer les données
AppAccess.DoCmd.TransferSpreadsheet acImport, 8, _
"NomTableDeDestinationDesDonnées", _
ThisWorkbook.FullName, True, "Feuil1!A1:G50"
'"Feuil1!A1:G50" : plage de cellules à exporter
'Fermeture de la base de données
AppAccess.CloseCurrentDatabase
'Suppression de l'objet de la mémoire vive.
Set AppAccess = Nothing
End Sub
'---------------------------------------------------------
MichD
Avatar
Michd
Une petite correction :
Remplace le 8 de cette ligne de code :
AppAccess.DoCmd.TransferSpreadsheet acImport, 8, _
"NomTableDeDestinationDesDonnées", _
ThisWorkbook.FullName, True, "Feuil1!A1:G50"
'"Feuil1!A1:G50" : plage de cellules à exporter
PAR
acSpreadsheetTypeExcel15 -> le 15 représente la version de Microsoft Office que tu as.
MichD
Avatar
gortex
Le lundi 21 Mai 2018 à 03:46 par Michd :
Une petite correction :
Remplace le 8 de cette ligne de code :
AppAccess.DoCmd.TransferSpreadsheet acImport, 8, _
"NomTableDeDestinationDesDonnées", _
ThisWorkbook.FullName, True, "Feuil1!A1:G50"
'"Feuil1!A1:G50" : plage de cellules à exporter
PAR
acSpreadsheetTypeExcel15 -> le 15 représente la version de
Microsoft Office que tu as.
MichD
Re merci
J'ai remplacer le 8 par 15 mais ca plante
j'ai ce message
erreur d'execution 2508 la valeur de l'argument feuille n'est pas valide
Cordialement
Avatar
Michd
Bonjour,
J'ai fait un petit fichier à partir du tien à titre d'exemple :
https://www.cjoint.com/c/HEvtnfbQGoi
Attention, dans mon application, la feuille de "Résultat" s'appelle "Résultat" et non "objectif
final". En fait, tu peux lui donner le nom que tu désires... mais il faudra faire quelques
substitutions dans le code.
J'espère que les 31 lignes respectent scrupuleusement la présentation de fichier exemple.
MichD
Avatar
Michd
erreur d'aiguillage
MichD
Avatar
gortex
Le lundi 21 Mai 2018 à 00:36 par Gortex :
Bonjour,
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
Sub Connecte_base_Access()
Dim rs As Object
Dim Nom_Base, Chemin_Base, SQL ', connstring
Set conn = CreateObject("ADODB.Connection")
Nom_Base = "Listable.accdb"
Chemin_Base = ThisWorkbook.Path & "" & Nom_Base
'chaine de connexion
connstring = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};
DBQ=" & Chemin_Base
'Connexion a la base
conn.Open connstring
End Sub
Sub Import_Click()
Dim rs As Object
Dim SQL
Set rs = CreateObject("ADODB.recordset")
SQL = "Delete * from [LES CLIANTS]
rs.Open SQL, conn, 3, 3
rs.Close
MsgBox "Attention: la table est suprimer!!"
End Sub
Re
merci est il possible d'adapter
le champ ID COUNTER CONSTRAINT PrimaryKey PRIMARY KEY
svp merci
Cordialement
Avatar
Michd
Bonjour,
Cette procédure fonctionne très bien, je l'ai testé!
Tu dois définir les variables dans la procédure.
Tu places la procédure dans un module standard.
Au lieu de définir une variable locale "PlageCellules"
pour définir la plage de cellules à exporter, tu peux
définir cette plage dans le formulaire avant d'appeler
la procédure et passer cette variable à titre de paramètre
à la procédure Sub Access_Export_Table(PlageCellules as string)
Assure-toi que tu supprimer la variable dans la procédure si tu
décides de fonctionner ainsi. Tu peux procéder ainsi pour aussi
les autres variables en les passant à titre de paramètres.
Après tes tests, nul besoin de faire afficher la base de données.
La procédure est simple et très rapide!
Perso. je donne un nom différent à la base que je veux créer et
celle que je veux supprimer.
Pour toutes les versions d'Excel de 2007 à 2016, il faut utiliser
ceci : acSpreadsheetTypeExcel12
'---------------------------------------------------------
Sub Access_Export_Table()
'Dans Excel il fut ajouté la référence suivante
'"Microsoft Access xx.0 Objects library"
'pour ce faire, barre des menus / outils / références
'cocher la référence mentionnée.
'Déclaration de la variable
Dim AppAccess As Access.Application
Dim MaBase As String
Dim NomTable As String
Dim TableASupprimer As String
Dim PlageCellules As String
'***********VARIABLES À DÉFINIR************
'Chemin + nom de la base de données
MaBase = "F:DocumentsMichD.accdb"
'Nom de la nouvelle table à créer
'avec les données dans Excel
NomTable = "MichD1"
'Nom de la table à supprimer
TableASupprimer = "MichD"
'La plage de cellules à exporter vers la
'nouvelle base de données
PlageCellules = "Feuil1!A1:G50"
'**********************************************
'Crée une instance d'Access
Set AppAccess = CreateObject("Access.application")
'Rend visible la base de données. Ce n'est pas
'obligatoire, après test, tu peux mettre à False
AppAccess.Visible = True
'Ouvre la base de données en mode exclusif
AppAccess.OpenCurrentDatabase MaBase, True
'Transfer les données
AppAccess.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, _
NomTable, ThisWorkbook.FullName, True, PlageCellules
'Supprime la table "NomDeLaTable" de la base de
'Données que l'on vient d'ouvrir
AppAccess.DoCmd.DeleteObject acTable, TableASupprimer
'Fermeture de la base de données
AppAccess.CloseCurrentDatabase
'Suppression de l'objet de la mémoire vive.
Set AppAccess = Nothing
End Sub
'---------------------------------------------------------
MichD
Avatar
Michd
J'ai ajouté une petite gestion d'erreur au cas où la table à supprimer n'existe plus.
'---------------------------------------------------------
Sub Access_Export_Table()
'Dans Excel il fut ajouté la référence suivante
'"Microsoft Access xx.0 Objects library"
'pour ce faire, barre des menus / outils / références
'cocher la référence mentionnée.
'Déclaration de la variable
Dim AppAccess As Access.Application
Dim MaBase As String
Dim NomTable As String
Dim TableASupprimer As String
Dim PlageCellules As String
Dim gestionerreur As String
'***********VARIABLES À DÉFINIR************
'Chemin + nom de la base de données
MaBase = "F:DocumentsMichD.accdb"
'Nom de la nouvelle table à créer
'avec les données dans Excel
NomTable = "MichD1"
'Nom de la table à supprimer
TableASupprimer = "MichD"
'La plage de cellules à exporter vers la
'nouvelle base de données
PlageCellules = "Feuil1!A1:G50"
'**********************************************
On Error GoTo gestionerreur
'Crée une instance d'Access
Set AppAccess = CreateObject("Access.application")
'Rend visible la base de données. Ce n'est pas
'obligatoire, après test, tu peux mettre à False
AppAccess.Visible = True
'Ouvre la base de données en mode exclusif
AppAccess.OpenCurrentDatabase MaBase, True
'Transfer les données
AppAccess.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, _
NomTable, ThisWorkbook.FullName, True, PlageCellules
'Supprime la table "NomDeLaTable" de la base de
'Données que l'on vient d'ouvrir
AppAccess.DoCmd.DeleteObject acTable, TableASupprimer
'Fermeture de la base de données
AppAccess.CloseCurrentDatabase
'Suppression de l'objet de la mémoire vive.
Set AppAccess = Nothing
Exit Sub
gestionerreur:
MsgBox err.Number & ", " & err.Description
Resume Next
End Sub
'---------------------------------------------------------
MichD
Avatar
Michd
Je n'ai plus l'adresse de l'auteur de cette procédure. Évidemment, il faut adapter...
Cet exemple montre comment traiter la PrimaryKey et les propriétés uniques d'un index.
Le code crée une nouvelle table avec deux colonnes.
La PrimaryKey et les propriétés uniques sont employées pour faire référence à une colonne, la clef
primaire, pour laquelle on ne permet pas des valeurs doubles.
Tu devras charger ces 2 références :
'"Microsot ADO Ext 2.X for dll and security" et
"Microsof ActiveX Data Object 2.8 Library"
IL faut updater la chaîne de connexion à Access, voir à cette adresse :
https://www.connectionstrings.com/access/
'-----------------------------------------------------------------
Sub PrimaryKeyX()
Dim catNorthwind As New ADOX.Catalog
Dim tblNew As New ADOX.Table
Dim idxNew As New ADOX.Index
Dim idxLoop As New ADOX.Index
Dim colLoop As New ADOX.Column
' Relier le catalogue
catNorthwind.ActiveConnection="Provider=Microsoft.Jet.OLEDB.4.0;" & _
"data source=c:Program Files" & _
"Microsoft OfficeOfficeSamplesNorthwind.mdb;"
' Nommer nouvelle table
tblNew.Name = "NewTable"
' Apposer un champ numérique et des textes à la nouvelle table.
tblNew.Columns.Append "NumField", adInteger, 20
tblNew.Columns.Append "TextField", adVarWChar, 20
' Apposer le nouvel index principal primaire sur la colonne de NumField
' à la nouvelle table
idxNew.Name = "NumIndex"
idxNew.Columns.Append "NumField"
idxNew.PrimaryKey = True
idxNew.Unique = True
tblNew.Indexes.Append idxNew
' Apposer un index sur TextField à la nouvelle table.
' Noter la technique différente : indication de l'index
' et du nom de colonne comme paramètres de la méthode d'apposition
tblNew.Indexes.Append "TextIndex", "TextField"
' Apposer la nouvelle table
catNorthwind.Tables.Append tblNew
With tblNew
Debug.Print tblNew.Indexes.Count & " Indexes in " & _
tblNew.Name & " Table"
' Énumérer la collection d'index.
For Each idxLoop In .Indexes
With idxLoop
Debug.Print "Index " & .Name
Debug.Print " Primary key = " & .PrimaryKey
Debug.Print " Unique = " & .Unique
' Énumérer la collection de colonnes de chaque objet d'index.
Debug.Print " Columns"
For Each colLoop In .Columns
Debug.Print " " & colLoop.Name
Next colLoop
End With
Next idxLoop
End With
' Supprimer la nouvelle table car c'est une démonstration
catNorthwind.Tables.Delete tblNew.Name
Set catNorthwind = Nothing
End Sub
'-----------------------------------------------------------------
MichD
Avatar
gortex
Le mardi 22 Mai 2018 à 02:10 par Michd :
Je n'ai plus l'adresse de l'auteur de cette procédure.
Évidemment, il faut adapter...
Cet exemple montre comment traiter la PrimaryKey et les
propriétés uniques d'un index.
Le code crée une nouvelle table avec deux colonnes.
La PrimaryKey et les propriétés uniques sont employées
pour faire référence à une colonne, la clef
primaire, pour laquelle on ne permet pas des valeurs doubles.
Tu devras charger ces 2 références :
'"Microsot ADO Ext 2.X for dll and security" et
"Microsof ActiveX Data Object 2.8 Library"
IL faut updater la chaîne de connexion à Access, voir à
cette adresse :
https://www.connectionstrings.com/access/
'-----------------------------------------------------------------
Sub PrimaryKeyX()
Dim catNorthwind As New ADOX.Catalog
Dim tblNew As New ADOX.Table
Dim idxNew As New ADOX.Index
Dim idxLoop As New ADOX.Index
Dim colLoop As New ADOX.Column
' Relier le catalogue
catNorthwind.ActiveConnection="Provider=Microsoft.Jet.OLEDB.4.0;"
& _
"data source=c:Program Files" & _
"Microsoft OfficeOfficeSamplesNorthwind.mdb;"
' Nommer nouvelle table
tblNew.Name = "NewTable"
' Apposer un champ numérique et des textes à la nouvelle table.
tblNew.Columns.Append "NumField", adInteger, 20
tblNew.Columns.Append "TextField", adVarWChar, 20
' Apposer le nouvel index principal primaire sur la colonne de NumField
' à la nouvelle table
idxNew.Name = "NumIndex"
idxNew.Columns.Append "NumField"
idxNew.PrimaryKey = True
idxNew.Unique = True
tblNew.Indexes.Append idxNew
' Apposer un index sur TextField à la nouvelle table.
' Noter la technique différente : indication de l'index
' et du nom de colonne comme paramètres de la méthode
d'apposition
tblNew.Indexes.Append "TextIndex", "TextField"
' Apposer la nouvelle table
catNorthwind.Tables.Append tblNew
With tblNew
Debug.Print tblNew.Indexes.Count & " Indexes in " & _
tblNew.Name & " Table"
' Énumérer la collection d'index.
For Each idxLoop In .Indexes
With idxLoop
Debug.Print "Index " & .Name
Debug.Print " Primary key = " & .PrimaryKey
Debug.Print " Unique = " & .Unique
' Énumérer la collection de colonnes de chaque objet d'index.
Debug.Print " Columns"
For Each colLoop In .Columns
Debug.Print " " & colLoop.Name
Next colLoop
End With
Next idxLoop
End With
' Supprimer la nouvelle table car c'est une démonstration
catNorthwind.Tables.Delete tblNew.Name
Set catNorthwind = Nothing
End Sub
'-----------------------------------------------------------------
MichD
Bonsoir
merci a vous
Cordialement