-
Xin code vba gọp dữ liệu nhiều file access có cùng cấu trúc lại với nhau.
k2d_nh0k > 27-03-21, 10:51 AM
Chuyện là mình có nhiều file access có cùng cấu trúc với nhau, mình muốn viết code để gọp lại tất cả làm 1.
Ví dụ: file DATA1,DATA2,..... GỌP VÀO FILE TẠM DATA.
Nhờ các cao nhân giúp đỡ.
Mình có tìm được code của anh ongke0711 nhưng khi sử dụng thì đối với field có data type là number bỏ qua và không gộp.
Hiện tại mình chưa liên hệ được với ongke0711 nhờ giúp.
Nhờ mọi người giúp đỡ .
Mã:Option Explicit
Dim DBFile As Variant
Private Sub gopFile_Click()
MergeTables
End Sub
Private Sub MergeTables()
Dim rsDest As New ADODB.Recordset
Dim rsSource As New ADODB.Recordset
Dim fld As ADODB.Field
Dim DBFileList As Collection
Dim SourceTable As String
Dim DestTable As String
Set DBFileList = New Collection
DBFileList.Add "DATA1.accdb"
DBFileList.Add "DATA2.accdb"
DBFileList.Add "DATA3.accdb"
SourceTable = "TBP350A" 'Tên table giông nhau o tat ca cac file DATA 1,2,3
DestTable = "TBP350A"
Set rsDest = GetRecordset("SELECT * FROM " & DestTable & "", "DATA.accdb")
For Each DBFile In DBFileList
Debug.Print "Lay du lieu tu file: " & DBFile
Set rsSource = GetRecordset("SELECT * FROM " & DestTable & "", DBFile)
Do Until rsSource.EOF
rsDest.AddNew
For Each fld In rsSource.Fields
If (fld.Attributes And dbAutoIncrField) = dbAutoIncrField Then
'do nothing - bo qua field AutoNumber
Else
rsDest.Fields(fld.Name).Value = fld.Value
End If
Next
rsDest.Update
rsSource.MoveNext
Loop
rsSource.Close
Next
MsgBox "Thanh cong", vbOKOnly, "Thông báo"
rsDest.Close
Set rsDest = Nothing
Set rsSource = Nothing
End Sub
Function GetRecordset(strSQL As String, DBName As Variant) As ADODB.Recordset
On Error GoTo HandleError
Dim DBPath As String
DBPath = CurrentProject.Path
Dim conn As New ADODB.Connection
If conn.State And adStateOpen = adStateOpen Then conn.Close
With conn
.ConnectionString = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" & DBPath & "\" & DBName & ";Uid=;Pwd=;"
.Open
End With
Dim rsCont As New ADODB.Recordset
With rsCont
.CursorType = adOpenDynamic
.CursorLocation = adUseClient
.LockType = adLockOptimistic
.Open strSQL, conn
'.ActiveConnection = Nothing
End With
'conn.Close
Set GetRecordset = rsCont
Exit Function
HandleError:
MsgBox "Error: " & Err.Number & vbCrLf & "Description: " & Err.Description
Exit Function
End Function
đường dẫn download file : http://upfile.vn/ImFCKqZCKrBC/gop-file-7z.html -
RE: Xin code vba gọp dữ liệu nhiều file access có cùng cấu trúc lại với nhau.
ongke0711 > 27-03-21, 11:40 AM
Chút nữa rảnh tôi xem lại như thế nào.
Nếu các Table giống y như nhau thì dùng thư viện DAO với câu lệnh INSERT INTO để chèn nguyên gói dữ liệu vào file đích cũng được, khỏi dùng vòng lặp. -
RE: Xin code vba gọp dữ liệu nhiều file access có cùng cấu trúc lại với nhau.
k2d_nh0k > 27-03-21, 12:23 PM
(27-03-21, 11:40 AM)ongke0711 Đã viết: Chút nữa rảnh tôi xem lại như thế nào.
Nếu các Table giống y như nhau thì dùng thư viện DAO với câu lệnh INSERT INTO để chèn nguyên gói dữ liệu vào file đích cũng được, khỏi dùng vòng lặp.
Cảm ơn anh. Do em mới tìm hiểu về Access nên không biết làm như thế nào nhờ anh chỉ giúp.
Anh xem thêm giúp em trong code chỉ chạy được 3 file DATA1,DATA2,DATA3 thôi. Với trường hợp nhiều file thì phải thêm code nhưng nếu cả 20 file thì phải thêm nhiều lần.
Mong anh nhín chút thời gian giúp đỡ. -
RE: Xin code vba gọp dữ liệu nhiều file access có cùng cấu trúc lại với nhau.
ongke0711 > 27-03-21, 12:56 PM
(27-03-21, 12:23 PM)k2d_nh0k Đã viết: Anh xem thêm giúp em trong code chỉ chạy được 3 file DATA1,DATA2,DATA3 thôi. Với trường hợp nhiều file thì phải thêm code nhưng nếu cả 20 file thì phải thêm nhiều lần.
Vậy :
- 20 file .accdb này nằm rải rác hay nằm cùng 1 folder?
- Tên các file này có gì đặt biệt không? được đặt tên tuỳ ý?
- Tên Table trong 20 file này giống nhau hay đặt theo qui ước nào đó?
Thường dữ liệu dạng này nên lưu thành file Text (.CSV) cho gọn nhẹ. Khi tổng hợp thì dùng ADO import vô thôi.
Còn lý do code trên không cập nhật cho Field có DataType dạng Number là do trong code tôi có dùng code để loại bỏ trường dạng AutoNumber nhưng code này chỉ hoạt động cho DAO chứ không hoạt động trong ADODB.
Bạn kiếm dòng code: For Each fld In rsSource.Fields --> sửa lại như bên dưới. Bỏ cụm IF...End If
Mã PHP:For Each fld In rsSource.Fields
rsDest.Fields(fld.Name).Value = fld.Value
Next -
RE: Xin code vba gọp dữ liệu nhiều file access có cùng cấu trúc lại với nhau.
k2d_nh0k > 27-03-21, 04:49 PM
(27-03-21, 12:56 PM)ongke0711 Đã viết:
(27-03-21, 12:23 PM)k2d_nh0k Đã viết: Anh xem thêm giúp em trong code chỉ chạy được 3 file DATA1,DATA2,DATA3 thôi. Với trường hợp nhiều file thì phải thêm code nhưng nếu cả 20 file thì phải thêm nhiều lần.
Vậy :
- 20 file .accdb này nằm rải rác hay nằm cùng 1 folder?
- Tên các file này có gì đặt biệt không? được đặt tên tuỳ ý?
- Tên Table trong 20 file này giống nhau hay đặt theo qui ước nào đó?
Thường dữ liệu dạng này nên lưu thành file Text (.CSV) cho gọn nhẹ. Khi tổng hợp thì dùng ADO import vô thôi.
Cảm ơn anh em sửa code chạy được rồi.
Cho em trả lời câu hỏi của anh ở trên:
- 20 file .accdb nằm cùng 1 folder.
- Tên các file thường có cùng dạng. ví dụ: data1,data2,....,data20.
- Tên các Table của 20 file điều giống nhau.
Do đây là dữ liệu nhận từ công ty nước ngoài và được lưu dưới dạng .accdb, còn em thì không rành về access nên không biết chuyển đổi thành file Text(.CSV)
Cảm ơn anh vì đã giúp. -
RE: Xin code vba gọp dữ liệu nhiều file access có cùng cấu trúc lại với nhau.
ongke0711 > 27-03-21, 06:23 PM
(27-03-21, 04:49 PM)k2d_nh0k Đã viết: Cho em trả lời câu hỏi của anh ở trên:
- 20 file .accdb nằm cùng 1 folder.
- Tên các file thường có cùng dạng. ví dụ: data1,data2,....,data20.
- Tên các Table của 20 file điều giống nhau.
Do đây là dữ liệu nhận từ công ty nước ngoài và được lưu dưới dạng .accdb, còn em thì không rành về access nên không biết chuyển đổi thành file Text(.CSV)
File của bạn đây. Link: https://www.mediafire.com/file/nbhwyn6mb...s.rar/file
Tôi dùng câu lệnh SQL Insert dữ liệu cho nhanh, không cần dùng ADO.
Chú ý:
- Đây là file làm theo CSDL của bạn, chưa có bẫy lỗi import trùng dữ liệu.
- Qui định là thứ tự và số cột ở toàn bộ các file là giống nhau. -
RE: Xin code vba gọp dữ liệu nhiều file access có cùng cấu trúc lại với nhau.
k2d_nh0k > 30-03-21, 12:00 PM
(27-03-21, 06:23 PM)ongke0711 Đã viết:
(27-03-21, 04:49 PM)k2d_nh0k Đã viết: Cho em trả lời câu hỏi của anh ở trên:
- 20 file .accdb nằm cùng 1 folder.
- Tên các file thường có cùng dạng. ví dụ: data1,data2,....,data20.
- Tên các Table của 20 file điều giống nhau.
Do đây là dữ liệu nhận từ công ty nước ngoài và được lưu dưới dạng .accdb, còn em thì không rành về access nên không biết chuyển đổi thành file Text(.CSV)
File của bạn đây. Link: https://www.mediafire.com/file/nbhwyn6mb...s.rar/file
Tôi dùng câu lệnh SQL Insert dữ liệu cho nhanh, không cần dùng ADO.
Chú ý:
- Đây là file làm theo CSDL của bạn, chưa có bẫy lỗi import trùng dữ liệu.
- Qui định là thứ tự và số cột ở toàn bộ các file là giống nhau.
Anh kiểm tra lại giúp em, sao em down về giải nén trong thư mục Data chỉ có 4 file K1,K2,K3,K4. -
RE: Xin code vba gọp dữ liệu nhiều file access có cùng cấu trúc lại với nhau.
ongke0711 > 30-03-21, 03:37 PM
-
RE: Xin code vba gọp dữ liệu nhiều file access có cùng cấu trúc lại với nhau.
k2d_nh0k > 30-03-21, 04:08 PM
(30-03-21, 03:37 PM)ongke0711 Đã viết:
(30-03-21, 12:00 PM)k2d_nh0k Đã viết: Anh kiểm tra lại giúp em, sao em down về giải nén trong thư mục Data chỉ có 4 file K1,K2,K3,K4.
Ý bạn là sao?
Trong file đó gồm 1 Folder Data và 1 file .accdb.
Folder Data: bạn sẽ chứa tất cả các file .accbd mà bạn cần gộp.
Vậy thôi.
Xin lỗi anh nhe. Tại để chung thu mục củ khi giải nén ra trùng tên nên tưởng file gopfile.accdb là file củ.
Một lần nữa cảm ơn anh nhiều vì đã giúp đỡ.