J'utilise actuellement le code suivant pour exporter des données d'une feuille de calcul vers une base de données MS Access. Le code parcourt chaque ligne et insère des données dans la table MS Access.
Public Sub TransData()
Application.ScreenUpdating = False
Application.EnableAnimations = False
Application.EnableEvents = False
Application.DisplayAlerts = False
ActiveWorkbook.Worksheets("Folio_Data_original").Activate
Call MakeConnection("fdMasterTemp")
For i = 1 To rcount - 1
rs.AddNew
rs.Fields("fdName") = Cells(i + 1, 1).Value
rs.Fields("fdDate") = Cells(i + 1, 2).Value
rs.Update
Next i
Call CloseConnection
Application.ScreenUpdating = True
Application.EnableAnimations = True
Application.EnableEvents = True
Application.DisplayAlerts = True
End Sub
Public Function MakeConnection(TableName As String) As Boolean
'*********Routine to establish connection with database
Dim DBFullName As String
Dim cs As String
DBFullName = Application.ActiveWorkbook.Path & "\FDData.mdb"
cs = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & DBFullName & ";"
Set cn = CreateObject("ADODB.Connection")
If Not (cn.State = adStateOpen) Then
cn.Open cs
End If
Set rs = CreateObject("ADODB.Recordset")
If Not (rs.State = adStateOpen) Then
rs.Open TableName, cn, adOpenKeyset, adLockOptimistic
End If
End Function
Public Function CloseConnection() As Boolean
'*********Routine to close connection with database
On Error Resume Next
If Not rs Is Nothing Then
rs.Close
End If
If Not cn Is Nothing Then
cn.Close
End If
CloseConnection = True
Exit Function
End Function
Le code ci-dessus fonctionne bien pour quelques centaines de lignes d’enregistrements, mais il semblerait que ce sera plus de données à exporter. Comme 25 000 enregistrements, il est possible d’exporter sans parcourir en boucle tous les enregistrements et une seule instruction SQL INSERT pour insérer en bloc toutes les données dans Ms.Access Table en une fois?
Toute aide sera très appréciée.
EDIT: PROBLÈME RÉSOLU
Juste pour information si quelqu'un cherche cela, j'ai fait beaucoup de recherches et trouvé que le code suivant fonctionnait bien pour moi, et il est très rapide grâce à SQL INSERT, (27648 enregistrements en 3 secondes seulement !!!! ):
Public Sub DoTrans()
Set cn = CreateObject("ADODB.Connection")
dbPath = Application.ActiveWorkbook.Path & "\FDData.mdb"
dbWb = Application.ActiveWorkbook.FullName
dbWs = Application.ActiveSheet.Name
scn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath
dsh = "[" & Application.ActiveSheet.Name & "$]"
cn.Open scn
ssql = "INSERT INTO fdFolio ([fdName], [fdOne], [fdTwo]) "
ssql = ssql & "SELECT * FROM [Excel 8.0;HDR=YES;DATABASE=" & dbWb & "]." & dsh
cn.Execute ssql
End Sub
Vous travaillez toujours pour ajouter un nom de champ spécifique au lieu d'utiliser "Sélectionner *". Nous avons essayé différentes manières d'ajouter des noms de champ, mais cela ne fonctionnait pas pour le moment.
est-il possible d'exporter sans parcourir tous les enregistrements
Pour une plage dans Excel comportant un grand nombre de lignes, vous constaterez peut-être une amélioration des performances si vous créez un objet Access.Application
dans Excel, puis utilisez-le pour importer les données Excel dans Access. Le code ci-dessous se trouve dans un module VBA du même document Excel qui contient les données de test suivantes.
Option Explicit
Sub AccImport()
Dim acc As New Access.Application
acc.OpenCurrentDatabase "C:\Users\Public\Database1.accdb"
acc.DoCmd.TransferSpreadsheet _
TransferType:=acImport, _
SpreadSheetType:=acSpreadsheetTypeExcel12Xml, _
TableName:="tblExcelImport", _
Filename:=Application.ActiveWorkbook.FullName, _
HasFieldNames:=True, _
Range:="Folio_Data_original$A1:B10"
acc.CloseCurrentDatabase
acc.Quit
Set acc = Nothing
End Sub
@ Ahmed
Le code ci-dessous spécifie les champs d'une plage nommée à insérer dans MS Access. La bonne chose à propos de ce code est que vous pouvez nommer vos champs dans Excel comme bon vous semble (si vous utilisez *, les champs doivent correspondre exactement entre Excel et Access) car vous pouvez voir que j'ai nommé une colonne Excel "Haha" même si la colonne Access est appelée "dte".
Sub test()
dbWb = Application.ActiveWorkbook.FullName
dsh = "[" & Application.ActiveSheet.Name & "$]" & "Data2" 'Data2 is a named range
sdbpath = "C:\Users\myname\Desktop\Database2.mdb"
sCommand = "INSERT INTO [main] ([dte], [test1], [values], [values2]) SELECT [haha],[test1],[values],[values2] FROM [Excel 8.0;HDR=YES;DATABASE=" & dbWb & "]." & dsh
Dim dbCon As New ADODB.Connection
Dim dbCommand As New ADODB.Command
dbCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sdbpath & "; Jet OLEDB:Database Password=;"
dbCommand.ActiveConnection = dbCon
dbCommand.CommandText = sCommand
dbCommand.Execute
dbCon.Close
End Sub