Lấy dữ liệu từ file excel đang đóng, sang file excel đang mở bằng ADODB (ADO)!
– Em xin nhờ các anh chị giúp đỡ lấy dữ liệu file excel đang đóng sang file excel đang mở bằng VBA xử dụng ADODB (ADO)
– Em có ngồi kiếm code đễ sửa chữa nhưng đa số code mở lên 1 bảng chọn file, hoặc copy địa chỉ cố định. Hai vấn đề này khiến em không thể sửa code trên mạng để dùng được
– Vì:
+ Dữ liệu em là cập nhật mới, tức là chỉ số dòng luôn tăng lên sau mỗi lần cần lấy dữ liệu => copy địa chỉ cố định là em chết rồi
+ Mỗi lần dùng code, code bắt chọn file, nếu có 600 file thì tức là 600 lần chọn => vậy em cũng chết rồi
– Xin giúp đỡ code VBA xử dụng ADO để lấy dữ liệu file đang đóng sang file đang mở, không bắt chọn file, copy(ghi) được vùng có chỉ số động( luôn tăng)
2455
Em chân thành cảm ơn! Và mong được sự giúp đỡ!
(file đính kèm dang_dong, dang_mo)
Bạn thử code này coi
Sub GPE()
Dim cn As Object, rs As Object
Dim eRow&, includeList$, excludeList$, Sql$
With Sheet1
eRow = .Range("A" & Rows.Count).End(xlUp).Row
If eRow > 2 Then .Range("A2:C" & eRow).Clear
End With
With Application.FileDialog(msoFileDialogFilePicker)
.Filters.Add "All Excel", "*.xls*"
.AllowMultiSelect = False
.Show
If .SelectedItems.Count < 1 Then MsgBox ("Ban khong chon file nao"): Exit Sub
If .SelectedItems.Count Then
On Error Resume Next
Set cn = CreateObject("adodb.connection")
cn.Open ("provider=Microsoft.ACE.OLEDB.12.0;data source=" & .SelectedItems(1) & ";mode=Read;extended properties=""Excel 12.0;hdr=no"";")
Sql = "SELECT * FROM [$A2:C] WHERE f1 is not Null"
Set rs = cn.Execute(Sql)
If Not rs.EOF Then Sheet1.Range("A2").CopyFromRecordset rs
rs.Close: cn.Close
Set rs = Nothing: Set cn = Nothing
On Error GoTo 0
End If
End With
End Sub
File này có đủ chỗ cho dữ liệu của 600 file không bạn nhỉ?
file định dạng *.xlsm có thể chứa tối đa 1048576 dòng, nếu 600 file mỗi file tầm 1747 dòng thì toang.
Nhìn lại thấy nick cậu "Thư sinh áo trắng" này, theo cậu này mấy topic thì biết đang nghiên cứu tiền ảo hay Bitcoin gì đó, nhưng ngại không dám đưa dữ liệu thật, hỏi hết cái này sang cái khác.
Tạm đoán việc @Thư Sinh Áo Trắng đang làm do vậy có mấy ý như này:
1. Bitcoin có ý nghĩa thật sự chứ không phải chỉ hư danh là tiền ảo, công nghệ Blockchain của BTC có ý nghĩa thật trong cuộc sống, chỉ là người ta đang lạm dụng và bơm giá thôi.
2. Việc lấy dữ liệu thô có nhiều trang web cho phép lấy giữ liệu giá cũ (đã qua) nó có thể nhẹ nhàng hơn nhiều so với cách cậu đang làm.
3. Muốn giao dịch thì phải có phương pháp, và phải có hiệu quả, một rừng dữ liệu thô không được liên kết thì kg có ý nghĩa gì cả.
4. Nếu việc đang làm dễ dàng như vậy thì chắc hẳn các nhà toán học, coder, … chắc giàu dữ lắm.
———
Hy vọng mình đoán sai 🙂
Em cảm ơn các bác đã đã chia sẻ.
Thực tế là em cũng phải thử hết cái này đến cái khác xem nó ra làm sao? Vì sao mà phải nhiều máy phần cứng khủng chỉ để giải thuật toán?Hihi. Không thấy chủ top vào nói gì nhỉ. Chứ thực sự em cũng không nghĩ là dữ liệu nó sử dụng tới hơn triệu dòng. Còn nếu mà thực sự nhiều dữ liệu thế thì chắc dùng cách khác có lẽ hay hơn.
Sơ sơ 1 sheets em đang xử dụng tới 20 triệu cell và 1 file nặng tầm 200 mê.
Vì file nặng phải chia tách nhỏ ra để chạy code không đơ.
Phương châm em giờ. Code chạy không đơ quá 15 phút là đc.
Do chia tách nhiều nên nhiều file ạ.File này có đủ chỗ cho dữ liệu của 600 file không bạn nhỉ?
Phải dùng nhiều sub và func để thu nhỏ hoặc dàn ra nhiều cột. Nhưng làm sao file vba không thôi tầm 200 mê thì chạy code còn kiên nhẫn đc, nếu quá 200 mê/ file thì chia nhỏ file ra nữa và có thể cả 1000 file ạ
Nghiên cứu lĩnh vực gì vậy, bình thường ít khi lưu dữ liệu tới 20 triệu cell, những kết quả xử lý không nên lưu trong file.
Dữ liệu nhiều nên chuyển sang các phần mềm quản trị dữ liệu hoặc lưu dưới dạng file text
Em tập tành xây một số đường hồi quy.
Vì excel em coi là cái gốc mọi lập trình khác, em mới nhập môn nên cũng chưa nghĩ tới ngôn ngữ hay phần mềm khác ạ.
Hiện cách chia thành nhiều file, 1 máy và nhiều Sub/Func thì thu nhỏ hay phóng to dữ liệu vẫn ổn anh ạ.
Anh có thể giởi thiệu qua phần mềm và lưu file dạng text thì có tính toán đc như VBA không ạ?
Code chạy tốt anh ạ! Em cảm ơn anh cho em code!
-Nhờ anh và các anh nâng cấp nên một chút, chỗ........... With Application.FileDialog(msoFileDialogFilePicker) <----- Chỗ này em muốn là đường dẫn đến file cố định một file->1 Sheet->1 vùng cần ghi, không phải pick chọn file ạ! ............Tức là em bỏ qua phần Pick chọn file ạ! Mà là đường dẫn cụ thể ạ!
– Bỏ qua bẫy lỗi, và không hiện thông báo: Khi cung cấp đúng địa chỉ(đường dẫn file đóng) cần ghi dữ liệu thì ông Code phải làm chuẩn đưa nó về file mở cho Em. Nghĩa là chạy code là phải lấy được giữ liệu ở file đóng mà code không kêu ca gì(nhưng phải chuẩn). Nôm na là giấy trắng mực đen không thể có chuyện lỗi được hoặc ràng buộc để không để ra lỗi cho quá trình ghi và dán
– Giữ nguyên định dạng hiện thị ở file đóng khi copy sang file mở(file thực thi có code VBA)
Em chân thành cảm ơn anh @buiquangthuan
Phần mềm Excel
Đọc file text: [URL='www.giaiphapexcel.com/diendan/threads/b%c3%a0i-12-filesystemobject.129399/']www.giaiphapexcel.com/diendan/threads/bài-12-filesystemobject.129399/
Lưu theo dạng text: Tìm trên diễn đàn
Dữ liệu đầu vào nên là file .CSV cho nhẹ nhàng, bỏ hết các định dạng, công thức…không cần thiết. Tôi thấy dữ liệu từ sàn thường được lưu về dưới dạng .csv hoặc dùng ứng dụng (python api) cũng lấy dữ liệu về xử lý cũng ở dạng .csv
Nếu được là CSV thì ngwoif ta dùng Powershell append đống files lại với nhau rồi hãy import. Làm việc tới mức độ nhiều files thế này thì bắt buộc phải biết Powershell. Nếu muốn lâu dài hơn thì phải học qua kỹ thuật CSDL Phân Vùng (partitioned database)
Thớt này làm việc với dữ liệu hàng khủng của hàng khủng mà không chịu cập nhật kiến thức rồi cứ ngồi đấy than "em chết rồi", "em cũng chết rồi". Nếu cái cơ quan này cứ mãi dùng thớt ở công việc này thì chính cơ quan cũng đang dãy chết.
Hàng khủng của hàng khủng này chỉ có dân chuyên nghiệp về Data Migration mới quản lý nổi.
Về nghề Data thì người này tối thiểu phải trên bậc tôi.
Tôi nghĩ là cỡ SQL Server bản chính trở lên chứ SQL Server Express cũng sụm.
Chú: số files nhiều thì phân nhóm chúng thành nhiều thư mục. 1000 files phân ra vài chục nhóm chỉ mất chừng 1 giờ đòng hồ là tối đa. Hình như các cô cậu công tử tiểu thơ ngày nay cứ tưởng tượng làm viiệc kéo chuột 1 giờ là "gãy tay", "em chết mất". Trong khi ngược lại, chơi ghêm cả buổi chả sao hết. Người không quen như tôi nhìn cái ghêm 20 phút là tối cả mặt mũi. Suy ra, chỉ là thói quen thôi. Kéo chuột cho công việc vài phút là mỏi tay, bấm ghêm càng lâu càng khoái?
Thấy có nhiều ý hay … Tôi gợi ý cho 1 cách … còn thực hiện hay ko thì tùy
1/ tạo 1 CSDL SQLite ( File *.sqlite, *.db +…) 1 File cở sở dữ liệu SQLite cho lưu tối đa 2048 GB và chạy đa nền tảng
2/ VD: những cái gì mà ko phải tạo mối quan hệ tính toán như DataXuat , DataNhap … lưu vào đó
3/ khi cần truy xuất cực nhanh … hãy hình dung nó cho lưu với cái Data khủng đó
4/ Nhưng cái gì cần tính toán linh tinh thì lưu vào Files *.accdb ( Access ) … làm gì đó tùy
….
….
Sử dụng SQLite
1/ để sử dụng được SQLite trên Windows các bản sau này có sẳn thư viện API cứ thế khai báo mà xài …. rất khó
2/ cài Driver của nó xong dùng ADODB của Ms cứ thế kết nối mà xài …. rất đơn giản như xài trên VBA vậy
3/ nếu ko thích 2 mục trên thì có thể tự tay viết lấy 1 DLL mà sử dụng … VD: VB6 họ cũng viết ok …. Delphi thì quá ok hơn VB6
….
…
Hiện tại tôi đang viết 1 Hàm duy nhất có thể truy xuất được dữ liệu Access , Excel, SQLite chung vào 1 Hàm ( tạm keo SQL Builder ) vì thấy nhiều ttrang trên Quốc tế họ sẻ sử dụng CSDL là SQLite phổ biến trong thời gian tới…
…
hãy hình dung 1 chút
1/ 1 File Excel nếu lưu khoãng 15MB … thì cái gì sẻ xảy ra
2/ 1 File Access tối đa = 2GB
3/ SQL Server Ms Free = 10 GB
4/ SQL Server Ms trả phí = ko giới hạn = Tiền ??? = mang qua máy Khác = ?? qua OS = ? qua Linux = ?
….
Tạm nói sơ bộ vậy … có hứng nói tiếp …. ko thì Run
20 triệu cell thì nó bao nhiêu dòng và bao nhiêu cột vậy bạn?
Dạ! Khoảng 15 cái bảng 500.000 x 3 cột ( năm trăm nghìn dòng), với 15 cái bảng cỡ 100.000( môt trăng nghìn dòng) x 3 cột. Em cũng chưa kéo được đến cuối bảng, để xem sao? Do nó lệch dòng các bảng với nhau để kéo xem từng bảng cũng Not ResPending luôn ấy ạ! Còn chạy code thì đau tim lắm! hic hic
Giờ tính lại hóa ra tầm gần 30 triệu Cell/ 1 Sheet ạ!
Và khoảng 600 đến 1000 file như vậy!
Do file quá nặng phải chia tách ra để chạy code VBA, ví nó hay bị Not Respending khổ lắm anh ạ! Do chưa thể cập nhật công nghệ mới nên chơi kiểu phóng to thu nhỏ dữ liệu rồi tính toán ạ!
Thành ra nó nảy sinh mấy chủ đề của em mấy nay ạ!
Chỉnh em code bài 2 với! Em muốn nó là đường dẫn cố định không phải chọn file!
Ơi anh @buiquangthuan @snow25 @Maika8008 @HieuCD @phuocam
– Ở bài 2: anh @buiquangthuan cho code chạy ứng với trường hợp lấy dữ liệu một vùng của một sheet trong file đóng
– Và ở bài 21 này. Em có nhu cầu lấy dữ liệu một vùng của nhiều Sheet trong file đang đóng. Mô tả như sau:
2456
– Code em chế từ code anh @buiquangthuan như sau:Sub Get_data_from_multiple_sheets() Dim cn As Object, rs As Object, sRAddress Dim eRow&, includeList$, excludeList$, Sql$, shName, CopyAddress, PateAddress, lRAddress, ClearAddress shName = Array("sh1", "sh2", "sh3") CopyAddress = Array("$A2:A", "$A2:A", "$A2:A") PateAddress = Array("A2", "B2", "C2") lRAddress = Array("A", "B", "C") ClearAddress = Array("A2:A", "B2:B", "C2:C") For chon = 0 To 2 With Sheets("dich") eRow = .Range(lRAddress(chon) & Rows.Count).End(xlUp).Row If eRow > 2 Then .Range(ClearAddress(chon) & eRow).Clear End With Next chon With Application.FileDialog(msoFileDialogFilePicker) .Filters.Add "All Excel", "*.xls*" .AllowMultiSelect = False .Show If .SelectedItems.Count < 1 Then MsgBox ("Ban khong chon file nao"): Exit Sub If .SelectedItems.Count Then On Error Resume Next Set cn = CreateObject("adodb.connection") cn.Open ("provider=Microsoft.ACE.OLEDB.12.0;data source=" & .SelectedItems(1) & ";mode=Read;extended properties=""Excel 12.0;hdr=no"";") For chon = 0 To 2 Sql = "SELECT * FROM [" & shName(chon) & "CopyAddress(chon)] WHERE f1 is not Null" '<---chưa hiểu f1,f2...f9 là gì,chỉ giúp em với nhé! Set rs = cn.Execute(Sql) If Not rs.EOF Then Sheets("dich").Range(PateAddress(chon)).CopyFromRecordset rs End If Next chon rs.Close: cn.Close Set rs = Nothing: Set cn = Nothing On Error GoTo 0 End If End With End Sub– Code bài 2 chạy tốt. Mỗi một Sheet của file đóng ta chạy một Sub.
– Các bác giúp em chỉnh code cho phép ghi dữ liệu nhiều sheet của file đóng -> sang file đang mở với ạ! Em chân thành cảm ơn!
(có file đính kèm)
Đây là code nhờ bác @Maika8008 sửa lại code bài 2 của bác @buiquangthuan ,được code mới trong trường hợp không muốn pick file mà dùng đường dẫn cố định.
muốn pick file mà dùng đường dẫn cố định.Sub lay_data_file_dong_sang_file_mo_Maika8008() Dim cn As Object, rs As Object, strPath As String Dim eRow&, includeList$, excludeList$, Sql$ With Sheet1 eRow = .Range("A" & Rows.Count).End(xlUp).Row If eRow > 2 Then .Range("A2:C" & eRow).Clear End With strPath = ThisWorkbook.Path & "" & "dang_dong.xlsm" 'Duong dan co dinh On Error Resume Next Set cn = CreateObject("adodb.connection") cn.Open ("provider=Microsoft.ACE.OLEDB.12.0;data source=" & strPath & ";mode=Read;extended properties=""Excel 12.0;hdr=no"";") Sql = "SELECT * FROM [$A2:C] WHERE f1 is not Null" Set rs = cn.Execute(Sql) If Not rs.EOF Then Sheet1.Range("A2").CopyFromRecordset rs rs.Close: cn.Close Set rs = Nothing: Set cn = Nothing On Error GoTo 0 End SubCảm ơn anh
www.giaiphapexcel.com/diendan/threads/l%E1%BA%A5y-d%E1%BB%AF-li%E1%BB%87u-t%E1%BB%AB-file-excel-%C4%91ang-%C4%91%C3%B3ng-sang-file-excel-%C4%91ang-m%E1%BB%9F-b%E1%BA%B1ng-adodb-ado.155340/
Khóa học Power PI – Ứng dung trong Nhân sự
TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...
Xem khóa học
File của bạn thì sửa strSh = "Sheet" & i thành "Sh" & i
Tôi sửa code bên dưới cũng được nhưng bạn sửa để hiểu thêm 1 chút.
Code cho bài #27
Khoẻ?
Với hàng dữ liệu đó thì trong nghề gọi là data mining. Mà data mining thì người làm tự xoay sở các bề mặt của nó để còn moi ra được tin tức hữu ích. Đằng này nhờ người khác làm thì mỗi lần chuyển mặt hay pivot lại phải nhờ thêm code?
Tạo sheet Nguon lưu tên file vả địa chỉ dữ liệu
Chạy code
Code làm mấy việc sau:
1. Mở file đang đóng
2. Chép dữ liệu vào.
3. Đóng và lưu file.
Làm hàng ngày thì học Power Query mà làm. Microsoft tốn công sức ra cai này là để đáp ứng nhu cầu chuyển đổi dữ liệu từ nơi này sang nơi khác. ADO là là một tiện ích đọc/ghi dữ liệu ơ lớp trong (*1), rành nó thì mới có hiệu quả, cứ mỗi nhu cầu lại phải nhờ viết code giùm là khong nên.
Thời buổi công nghệ siêu xa lộ mà bám mãi các kiểu làm cũ rích.
(*1) ứng dụng vi tính có thể ví như củ hành. Những phần mềm có thể thuộc về lớp nào của củ hành. ADO nằm khoảng lớp thứ 3 đếm từ ngoài vào. Trong khi Power Query nằm ở lớp ngoài cùng. Các lớp càng sâu càng đòi hỏi người dùng phải biết về công nghệ và nền tảng công nghẹ.
thế là tốt rồi cứ thế phát huy ….
Bạn có thể qua link sau tham khảo thêm … tùy chỉnh và chỉ sử dụng còn ko học được gì từ code cả … nếu có thì cũng chút chút thôi
http://www.giaiphapexcel.com/diendan/threads/t%E1%BB%95ng-h%E1%BB%A3p-g%E1%BB%99p-nhi%E1%BB%81u-sheet-trong-1-file-%C3%81p-d%E1%BB%A5ng-cho-excel-access-sqlite.159404/