Code VBA Lấy dữ liệu từ File khác bằng SQL
Dear Anh chị thân mến,
Em muốn lấy số liệu từ File" NKBH "vào Sheet Data của File " Lay so lieu" với điều kiện lọc như tại sheet Bao cao của File" Lay so lieu " gồm 3 điều kiện Lọc từ ngày đến ngày và Lọc theo tên công ty. Em mới làm được một đoạn thôi ạ. Chưa hoàn chỉnh vì không biết làm sao tiếp ạ. Mong A chị giúp đỡ ạ.
Bạn thử cái này.
2698
Sub ImportData_Test()
Dim owb As Workbook
Dim cn As Object, pro As String, EXT As String, name As String, sql As String, ngay1 As Long, ngay2 As Long, ten As String
With Sheets("bao cao")
ngay1 = .Range("C3").Value2
ngay2 = .Range("c4").Value2
ten = .Range("C2").Value
End With
Dim rst As Object
'On Error Resume Next
Set rst = CreateObject("ADODB.recordset")
Set cn = CreateObject("ADODB.Connection")
Sheets("Data").Range("A2:J10000").ClearContents
name = ThisWorkbook.Path & "NKBH.xlsx"
pro = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
EXT = ";Extended Properties=""Excel 12.0;HDR=No;"";"
cn.Open (pro & name & EXT)
sql = "SELECT * from [sheet1$A1:J100000] WHERE F5=" & "'" & ten & "'" & "AND F1 BETWEEN " & ngay1 & " and " & ngay2 & ";"
rst.Open sql, cn, 3, 1
Sheet1.Range("A2").CopyFromRecordset rst
rst.Close
cn.Close
End Sub
Quá tuyệt vời ạ ! Cảm ơn anh nhiều ạ …!
www.giaiphapexcel.com/diendan/threads/code-vba-l%E1%BA%A5y-d%E1%BB%AF-li%E1%BB%87u-t%E1%BB%AB-file-kh%C3%A1c-b%E1%BA%B1ng-sql.142859/
Khóa học SprinGO phù hợp
Ứ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
Bạn tự ý sửa cú pháp bắt buộc của của người ta nên code nó chạy sai là đúng rồi. Các ký hiệu F5, F1 là ký hiệu đại diện cho cột thứ 5 (Field 5) chứ không phải địa chỉ cột của Excel nhé.
Tôi cũng có một góp ý về cách tổ chức xử lý bảng tính của bạn (mà tôi thấy cũng nhiều người có cùng kiểu xử lý giống bạn) là:
Khi bạn muốn tìm kiếm, lọc dữ liệu một file data nào đó thì cũng nên phân tích kỹ, "tính trước" nhưng trường hợp truy vấn có thể phát sinh (có thể bây giờ chưa cần nhưng sau có khi cần) để đưa ra hết các điều kiện lọc dữ liệu lên UserForm hay Sheet rồi viết code một lần để lọc theo tất cả các điều kiện đó, khỏi phải lắc nhắc, sau này phát sinh rồi lại sửa code, nếu lúc đó không có ai hỗ trợ bạn thì sao.
2699
Bạn thiết lập điều kiện cho Advance filter thiết và khai báo range sai nên code không hiểu.
Tôi sửa đoạn code trong file bạn như bên dưới, bạn thay lại đường dẫn theo máy bạn.
Ở range lưu điều kiện cho Advance Filter, bạn thêm dấu >= cho và <= cho
– Điều kiện cho Advance Filter dạng Date mà bạn lại dùng công thức chuyển nó thành Text thì làm sao nó tìm ra được. =C4 & TEXT(C6:"dd/mm/yyy")
– Mấy điều kiện lọc này có 3 ô, gõ tay vô được rồi, tại sao phải dùng công thức nữa chi cho rắc rối cuộc đời. Bạn cứ gõ đúng định dạng ngày tháng trên máy tính là được.
Tôi cũng định đề xuất bạn làm kiểu này, Bạn đang suy nghĩ lập trình dần dần đúng hướng rồi đó, giảm thiểu việc can thiệp vô code nhiều khi có thay đổi.
Mục 2: bạn nên đặt tên trước cho cái cùng dữ liệu (chỉ cần vài dòng dữ liệu), sau đó dùng cái hàm tạo Name động cập nhật lại range. Tại sao tôi đề xuất bạn đặt tên range trước vì theo như cách bạn đề xuất: khai báo cứng (hard code) trong code vùng (A:L), sau này muốn thay đổi cột thì lại phải vô code sửa. Nếu khai báo tên Range thì khi thay đổi vùng bạn chỉ cần làm thủ công tạo Named range cho cùng mới rồi chạy code thôi.
– Tôi thêm vô 2 cái module: hàm lấy tên file và hàm tạo name động.
– Hiện tại thì khi bấm nút [Tổng hợp Data], nó sẽ hiện hộp thoại yêu cầu trỏ đường dẫn tới file lấy dữ liệu luôn.
– Ở kế ô "E3", tôi có thêm cái nút để lấy đường dẫn file lưu vào ô "E3". Nếu bạn không muốn mỗi khi bấm nút [Tổng hợp] rồi chọn đường dẫn thì làm cách này. Trong code đổi lại chút ở đoạn tham chiếu đến file dữ liệu.
sPath = GetFileOpen
—> đổi lại sPath = ActiveSheet.Range("E3").Value
Mấy code lấy tên file, tạo name động thì bạn cứ copy vô dự án mà xài thôi. Khi nào rảnh thì ngâm cứu học hỏi nó tại sao nó chạy như vậy.
Muốn tự động, không phải gõ thủ công đường dẫn thì phải thêm code cho nó là bình thường.
Nếu bạn muốn đơn giản hơn thì cứ thông qua đặt tên range (define named range) mà truyền tham số vào code.
– Bạn đặt tên range cho ô "E3" là: sPath. Sau này đổi địa chỉ sang ô khác thì cũng chỉ cần đặt tên đúng như vậy là được rồi.
– Code: khai báo biến sPath = Range("sPath")
(bạn ngâm cứu đặt tên cho cái range điều kiện tìm kiếm giống vậy luôn đi)
Set TK = Range("DKTiemKiem")
Bạn xem lại cách dùng If Then Else nhé.
Sửa lại:
Còn việc chạy 2 cái Sub mà cái 1 sai nó thoát chắc do lệnh Exit Sub hoặc báo lõi hệ thống gì đó nó ngưng cái Sub Gop luôn.
Nó có hiện thông báo lỗi gì không?
Bạn đổi tên Sub LayData thành Function LayData và dùng lệnh Exit Function thay thế Exit sub trong đó thử xem.
F5 là cột 5 đó bạn, cụ thể là cột E (Ten Cong ty trong file NKBH) đó.