Sử dụng ADO để copy dữ liệu từ file này sang file khác
Mình có 2 file cùng nằm trong 1 thư mục : Nguon.xlsm và Dich.xlsm
Trong file: Nguon.xlsm . Ta có vùng dữ liệu cần cập nhật , gồm 242 cột (từ cột "AB" đến cột "JI") , bắt đầu từ dòng 35 đến dòng cuối cùng trong cột "AB"
File : Dich.xlsm cũng có cấu trúc tương tự . Mình xin code để thực hiện công việc :
Thứ 1 : "Cập nhật vùng dữ liệu từ file : Nguon.xlsm đến Dich.xlsm bằng ADO (chỉ phần dữ liệu , bỏ qua phần tiêu đề)"
Thứ 2 : Sau khi cập nhật xong , thì chạy 1 marco trên file: Dich.xlsm (để xác nhận nội dung đã được làm mới chẳn hạn)
Xin các bạn quan tâm giúp đỡ, xin cám ơn+-+-+-++-+-+-++-+-+-+
Bạn sử dụng Code sau
Option Explicit
Sub Update()
On Error GoTo Handle
Dim cnn As Object, lsSQL As String, lrs As Object, FileFullName As String
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
FileFullName = Application.ThisWorkbook.Path & "Nguon.xlsm"
With cnn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" _
& "Data Source=" & FileFullName _
& ";Extended Properties=""Excel 12.0;HDR=No"";"
.Open
End With
lsSQL = "Select * From [CSDL$AB35:IJ100000] Where f1 Is Not Null"
lrs.Open lsSQL, cnn, 3, 1
If Sheets("SP").[AB35] = "" Then
Sheets("SP").Range("AB35").CopyFromRecordset lrs
Else
Sheets("SP").Range("AB35").End(xlDown).Offset(1, 0).CopyFromRecordset lrs
End If
MsgBox "Da Update CSDL", vbInformation
Set lrs = Nothing
cnn.Close: Set cnn = Nothing
Exit Sub
Handle:
MsgBox Err.Description
End Sub
www.giaiphapexcel.com/diendan/threads/s%E1%BB%AD-d%E1%BB%A5ng-ado-%C4%91%E1%BB%83-copy-d%E1%BB%AF-li%E1%BB%87u-t%E1%BB%AB-file-n%C3%A0y-sang-file-kh%C3%A1c.82596/
Ứng dụng AI và Chat GPT trong Quản trị nhân sự
Học xong khóa này, học viên có thể: Hiểu đúng bản chất AI, các nhóm AI phổ biến và cách AI “hoạt động” ở...
Xem khóa học
Có vẻ như bạn biết ADO?
Mình sẽ không chỉnh sửa một dòng Code nào cả, chỉ nêu ra 1 số vấn đề bạn thắc mắc
1/
Bạn hiểu CSDL thì cấu trúc như thế nào?
Đoạn màu đỏ có ý nghĩa gì?
2/
Cái này nằm ngoài khả năng của mình vì mình không được đào tạo và cũng không tìm kiếm được thông tin phát sinh hay gì gì đó trong suy nghĩ của bạn.
3/
Bạn đưa ra yêu cầu là
Nên mình chỉ hiểu là bạn muốn Copy dữ liệu qua File khi chạy Macro không biết "thâm ý" phía sau của bạn là gì cả. Và để giải quyết "suy đoán riêng của mình" mình đã đưa ra giải pháp =>bạn hiểu và bạn có thể thay đổi phải không?
Cuối cùng: Chúc bạn tìm được giải pháp tốt nhất nhé!
Chào tạm biệt!
Chỉ tham chiếu đến 65536 dòng thôi bạn.
Vấn đề này mình đã test trên 2010 và 2013 thì đúng là không thể tham chiếu vùng vượt qua con số 65.536 dòng. Trên 2007 mình trước giờ không xài nên không test được.
Chuyển dữ liệu sang lưu trữ tại 1 bảng của Access, ưu điểm là dể truy vấn, dung lượng lưu trữ nhiều…
Chuyển sheet CSDL vào 1 bảng của Access, sau đó cần cái gì thì ở Excel mình kết nối với bảng đó là được.
———————
Code ở trên ta chẳng cần quan tâm, chỉ cần biết áp dụng là được (truyền tham số vào)
Cú pháp
Ví dụ:
Toàn bộ code đặt trong Module của file Dich.xlsm
Vậy bài toán của bạn là: GHI DỮ LIỆU VÀO FILE ĐANG ĐÓNG (chứ hổng phải lấy dữ liệu từ file đang đóng)
Nói chung là: TÔI KHÔNG BIẾT (Dù biết có loại code dạng này nhưng chả có nhu cầu gì nên cũng cóc thèm nghiên cứu)
Định sửa đoạn này:
Thành:
Nhưng thấy cũng chưa ổn (hết lỗi nhưng kết quả không chính xác)
Để suy nghĩ thêm xem
Vậy để xác định cái Lrows đó thì phải làm sao? Mở file rồi xác định?
=================================================
Vâng! Thì tôi đâu có trách bạn gì đâu (bạn hiểu lầm thôi)
Bạn cũng biết rằng mấy cái vụ nghiên cứu lập trình này nó phải có "cảm hứng"… Chỉ vì tôi hổng có nhu cầu thực tế nên cũng hổng có cảm hứng để nghiên cứu —-> Tức là LỖI TỪ TÔI mà thôi
Ẹc… Ẹc…
Trong khi chờ đợi, bạn có thể tạm dùng giải pháp: Mở file, copy dữ liệu, paste vào rồi đóng file và lưu
Tôi nghĩ thế cũng đâu có vấn đề gì
Như bài [URL='https://www.giaiphapexcel.com/forum/showthread.php?82596-S%E1%BB%AD-d%E1%BB%A5ng-ADO-%C4%91%E1%BB%83-copy-d%E1%BB%AF-li%E1%BB%87u-t%E1%BB%AB-file-n%C3%A0y-sang-file-kh%C3%A1c&p=513073#post513073'%5D21 tôi đã đề cập, để lưu trữ dữ liệu với dung lượng lớn thì phải chọn cái khác chứ không phải excel, mà đó là Access hoặc SQL Server.
======================================
Với tôi dữ liệu lên đến 10.000 dòng là đã quá nhiều, tôi chưa từng có dữ liệu hết dòng trên excel 2007 và nếu có chăng đi nữa tôi cũng chọn giải pháp khác vì với số lượng dòng như thế này chắc gì máy cùi bấp như của tôi nó chạy nổi. Với yêu cầu của bạn tôi thật sự bó tay.
1.) Về dung lượng:
– SQL Server bạn có thể tham khảo [URL='https://msdn.microsoft.com/en-us/library/ms143432.aspx'%5DTại đây
– Access chỉ được 2 gigabyte
2.) Về bảo mật:
– SQL Server có chính sách bảo mật hơn là Access.
3.) Kết nối dữ liệu từ xa qua Internet:
– SQL Server là ưu thế.
– Access: Có thể được nhưng phức tạp (Xin lỗi mình chưa thử dạng này)
Trên đây là những điểm nhận xét riêng của mình, dĩ nhiên sẽ còn có những điểm đáng lưu ý khác.
======================================
Để giữ định dạng thì chỉ có cách mở file, copy và paste thôi
Hoặc cũng có cách là sau khi lấy được dữ liệu, ta tự mình định dạng lại (bằng tay hoặc bằng code)
1./ Kết nối với file nguồn.
2./ Lấy danh sách sheet của file nguồn đó.
3./ Duyệt qua từng sheet. Lưu ý nên loại bỏ những bảng mà không phải là tên sheet (Name, filter…)
4./ Đọc dữ liệu của từng sheet.
=========================
Trường hợp của bạ hoàn toàn có thể làm được, nhưng CSDL của bạn không thuộc dạng chuẩn nên khuyến cáo không nên dùng ADO. Bạn có thể thử với code sau để tham khảo
Bạn chắc là dùng Excel 2003. Vậy bạn sửa lại 1 chút
Hàm GetData trả về một mảng dữ liệu 2 chiều (dòng và cột). Muốn lấy dòng cuối cùng thì dùng UBound để xác định chỉ số dòng cuối cùng rồi lấy nó ra.
Không nên sửa cái gì cả vì nếu bạn có khả năng sửa thì đã không hỏi.
thắc mắc: ADO dùng để lấy dữ liệu hàng loạt. Chỉ lấy dòng cuối thì dùng nó làm gì?
Bạn lập một tiêu đề như phần tô đậm ở trên. Và mở một câu hỏi khác ở mục "Lập trình với Excel" này. Sẽ có người giúp bạn. Nếu có file mẫu đăng lên thì sẽ nhận được câu trả lời sớm và chính xác hơn.
Thớt này bàn về ADO. Công cụ ActiveX chỉ giành cho những người đã có kinh nghiệm ít nhiều về VBA.