Je recherche une solution pour importer des données à partir d'un fichier Excel dans une base de données (par exemple: fichier d'accès MS).
Je peux obtenir l'idée ainsi que la structure mais parce que je suis nouveau à quelque chose Comme ceci, il est vraiment difficile de terminer le travail. P>
ci-dessous est mon code, qui devrait faire ceci: p>
insérer code> instruction à importer mais comment? Étant donné que les valeurs à importer seraient une valeur d'une variable exécutée à partir de la toute première cellule des fichiers Excel jusqu'à la fin de celui-ci. Li>
ol> Veuillez ignorer le commentaire parce que j'utilise ma langue maternelle pour faciliter la compréhension à l'avenir P>
Sub Import_Data()
'Khai bao bien lien quan den Database
Dim connection As ADODB.connection
Dim record As ADODB.Recordset
'Khai bao cau lenh Query
Dim SQLstr As String
'Khai bao connection string
Dim connectionstring As String
Dim dbstring As String
'Duong dan den file import
Dim fdlg As FileDialog
Application.ScreenUpdating = False
'Chon datafile
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "Access files", "*.accdb, *.mdb"
If .Show = True Then
datapath = .SelectedItems(1)
Else
Exit Sub
End If
End With
'Chon file import
Set fdlg = Application.FileDialog(msoFileDialogFilePicker)
With fdlg
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "Excel files", "*.xls,*.xlsx,*.xlsm"
If .Show = True Then
importstring = .SelectedItems(1)
Else
Exit Sub
End If
End With
'Connect to Database
Set connection = New ADODB.connection
With connection
.Provider = "Microsoft.ACE.OLEDB.12.0"
.connectionstring = "Data Source=" & datapath & ";"
.ConnectionTimeout = 30
.Open
If .State = adStateOpen Then
MsgBox "welcome " & Environ("Username") & " ket noi den database"
Else: Exit Sub
End If
End With
Dim a, c As Integer
Dim b, d As Integer
Dim ImpWb As Workbook
Dim ImpWs As Worksheet
Set ImpWb = Application.Workbooks.Open(importstring)
ImpWb.Application.Visible = True
Set ImpWs = ImpWb.Worksheets("Sheet1")
With ImpWs.UsedRange
a = .Rows.Count
b = .Columns.Count
For c = 2 To a
For d = 1 To b
SQLstr = "Insert into Test values(" & Cells(c, d).Value & ")"
connection.Execute SQLstr
Next d
Next c
End With
ImpWb.Close
connection.Close
Set ImpWs = Nothing
Set ImpWb = Nothing
Set connection = Nothing
End Sub
3 Réponses :
Bonjour, vous reconnaissez ou découvert déjà la fonction Magic Connection.Execute. Voici la musique de jouer. Tout son besoin est une chaîne SQL valide à insérer. C'est (presque) tous. SQL Strings peut être tiré single par un seul ou un groupe séparé par un ";" À la fin
INSERT INTO table1 (column1,column2 ,..) VALUES (value1,value2 ,...), (value1,value2 ,...), ... (value1,value2 ,...); --<<<<<<<<<<< see the ";"
Merci Thomas Ceci comme apprendre des phrases d'écriture et jour après jour, je sais que je vais améliorer mes compétences grâce à votre commentaire. BTW, mes données sont grandes, elle devrait être mille lignes par jour et serait énorme pour le mois, ce que je ne peux pas taper une valeur exacte à l'intérieur des parenthèses. C'est ce que je me batte. Je sais que je viens de taper quelque chose comme "pour C = 1 à un sqlstr =" Insert dans le tableau (Colonne1) Valeurs ("& Cellules (1, A) .value &") "" Puis exécutez SQLSTR pour importer des données sur une colonne de base de données. Mais que si ma base de données ait moins de dix ou vingt colonnes?
C'est pourquoi ces lignes sont généralement autogogenerées. Il existe également une fonction SQL qui importera tout le fichier CSV. Je suggère de lire un peu plus sur SQL d'abord. C'est le véritable pouvoir et non l'accès ou l'excellent chose que vous utilisez. BTW SQL est beaucoup plus rapide comme ADO;). Et c'est aussi bien plus facile de créer des chaînes SQL au lieu de fiddeler les choses ADO ensemble. Sauf le problème de l'évasion. Mais que vous pouvez mettre en une routine intelligente et peut oublier plus tard. Ive écrit des wrappers pour mes affaires pour générer des choses standard SQL. S'amuser :)
Il y a aussi cette approche en utilisant SQL
Sub test() Dim c As ADODB.Connection Dim s As String Dim strSQL As String s = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=c:\â¦...\TestDBs\API_TEST.accdb;" & _ "Persist Security Info=False;" Set c = New ADODB.Connection c.ConnectionString = s c.Open ' Excel workbook, sheet name test1 strSQL = "INSERT INTO tblDestination ( Firstname )" & _ "SELECT [test1$].FirstName " & _ "FROM [EXCEL 12.0;HDR=YES;IMEX=2;DATABASE=C:\Databases\csv\test1.xlsx].[test1$];" c.Execute strSQL c.Close End Sub
Tu es brillant. J'ai eu l'idée de cela. Mais que diriez-vous de ma base de données avoir vingt colonnes et mon Excel a les mêmes colonnes? Y a-t-il de toute façon définir une variable pour eux?
base de données = c: \ bases de données \ csv \ test1.xlsx]. [Test1 $ A5: A10]; Code>
des commentaires ci-dessus, il est devenu plus clair maintenant que le problème que vous rencontrez est comment construire les instructions SQL à l'intérieur de VBA em>. Cependant, vous êtes très proche que vous ne le pensez. Cette fonction ci-dessous construira une instruction insertion pour chaque ligne de données L'autre mise en garde est supposant que tous les champs sont numériques. Si vous avez des champs de texte, vous devrez ajouter ' code> avant et après chaque champ, comme
' & .Cells (c, d) .Value & & ' code>. Si vous connaissez les colonnes qui ont besoin de texte, vous pouvez modifier l'entrée avec un cas de sélection sur le numéro de colonne selon vos besoins. P> P>
Qu'est-ce qui ne fonctionne pas exactement? Et quelle est la question exacte. (Voir exemple minimal reproductible ).