Dùng SQL trên Excel

Chia sẻ bởi:hands
★★★★★
Quảng cáo

Kính gửi Anh chị,
Em có File sưu tầm trên mạng dùng SQL – Coi như Table là một Database và sẽ dùng SQL để lọc, tính toán…như trên SQLSERV thì làm thế nào ạ. Em đọc Code mà chưa hiểu cách chạy. Mong anh chị chỉ giúp ạ (Bỏ qua việc cài đặt Add in có sẵn ạ).

Có 1 cách dùng câu lệnh SQL, đó là dùng ADO liên kết. Cụ thể là topic www.giaiphapexcel.com/diendan/threads/ADO-Excel-Ketoan.25759/
Một cách khác tương tự SQL query đó là Power Query

Bạn làm như sau để chạy:

'Khai bao bien
  Dim cn as Object, sql as String
  Dim [B]FPath[/B] As String, [B]FName[/B] As String
  '[B]FPath[/B] và [B]FName[/B] là đường dẫn đầy đủ và tên của file dữ liệu nguồn, dùng cho câu .ConnectionString bên dưới

'Ket noi du lieu nguon
    Set cn = CreateObject("ADODB.Connection")
    With cn
        .Provider = "Microsoft.ACE.OLEDB.12.0"
        .ConnectionString = "Data Source=" & [B]FPath[/B] & "" & [B]FName[/B] & ";" & "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
        .Open
    End With

'Cau lenh SQL cua ban:
    sql = "SELECT MAX(NVL.[hh_ten]) AS TENHH "
    '....
    '....
    sql = sql & "FROM (([nhapxuat_vatlieu_chitiet$] NXCT "

sql = sql & "INNER JOIN [nhapxuat_vatlieu$] NX ON NXCT.[nxct_nx_id]=NX.[nx_id]) "
    sql = sql & "INNER JOIN [nguyenvatlieu$] NVL ON NXCT.[nxct_hh_id]=NVL.[hh_id]) "

sql = sql & "GROUP BY NXCT.nxct_hh_id"

'Truy van, ghi ket qua ra trang tinh
    Set rs = cn.Execute(sql)
    Sheet1.Range("A1").CopyFromRecordset rs   'Thay doi bang vi tri chep ket qua cua ban

Mình thử mà không được ? Không rõ mình còn thiếu Refer đến thư viện nào không mà không chạy được ? Với mình hỏi là mình không muốn câu lệnh SQL nó cố định trong đoạn VBA mà khi mình gõ đoạn code đó tại A1 của Sheet4 thì nó chạy ?

Đoạn sub này của bạn sửa thành thế này

Sub sql_1()

'Khai bao bien
Dim cn As Object, sql As String
Dim FPath As String, FName As String
'FPath và FName là du?ng d?n d?y d? và tên c?a file d? li?u ngu?n, dùng cho câu .ConnectionString bên du?i
FName = ThisWorkbook.Path & "" & ThisWorkbook.Name
'Ket noi du lieu nguon
Set cn = CreateObject("ADODB.Connection")
With cn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "Data Source=" & FName & ";" & "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
.Open
End With
sql = "SELECT * FROM RangeName WHERE Reporter='Albania'"

Set rs = cn.Execute(sql)
Sheet4.Range("A2").CopyFromRecordset rs 'Thay doi bang vi tri chep ket qua cua ban
End Sub

Cảm ơn Vân. Vân cho mình hỏi là mình muốn linh hoạt trong câu lệnh SQL nên muốn cho nó đoạn lênh SQL vào ô A1 để tiện. Mình đã sửa như File mà không được. Vân xem giúp mình với nhé !

Bạn thử bằng sub này xem

Sub sql_1()

'Khai bao bien
Dim cn As Object, sql As String
Dim FPath As String, FName As String
'FPath và FName là du?ng d?n d?y d? và tên c?a file d? li?u ngu?n, dùng cho câu .ConnectionString bên du?i
FName = ThisWorkbook.Path & "" & ThisWorkbook.Name
'Ket noi du lieu nguon
Set cn = CreateObject("ADODB.Connection")
With cn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "Data Source=" & FName & ";" & "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
.Open
End With
'sql = "SELECT * FROM RangeName WHERE Reporter='Albania' and Partner='World'"
sql = Sheet4.Range("A1").Value

Set rs = cn.Execute(sql)
Sheet4.Range("A2").CopyFromRecordset rs 'Thay doi bang vi tri chep ket qua cua ban
End Sub

www.giaiphapexcel.com/diendan/threads/d%C3%B9ng-sql-tr%C3%AAn-excel.150184/

Khóa học Power PI – Ứng dung trong Nhân sự
Khóa học SprinGO phù hợp

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
★★★★★ 5 ★ 1 👤 1 ▥ 0
Quảng cáo

Bạn nên đọc

One Response

  1. hands says:

    Có 1 cách dùng câu lệnh SQL, đó là dùng ADO liên kết. Cụ thể là topic http://www.giaiphapexcel.com/diendan/threads/ADO-Excel-Ketoan.25759/
    Một cách khác tương tự SQL query đó là Power Query

    Em chào Anh. Nhờ Anh xem giúp em vấn đề Code SQL theo File với ạ.
    – Tại A1 (Em tạo 2 mã SQL): Mã 1 chạy nhưng không lấy được tiêu đề làm sao để có được tiêu đề ạ; Mã 2 em không chay ra được kết quả là vì sao ạ và làm sao để lấy được tiêu đề ạ ? Mong anh giúp đỡ ạ.

    – Tiêu đề phải copy từ Data sang hoặc điền tay. Đáng lẽ khai báo ConnectionString có HDR=YES thì phải có Header nhưng hiện tại không thấy chạy
    – Mã 2 có tính Sum nhưng thiếu Group By những field không tính toán. Sửa như sau:
    SELECT Distinct ,SUM([Trade Value (US$)]) As FROM RangeName Group By

    Nếu lấy 3 cột thì phải Group By 2 cột không tính toán:

    SELECT Distinct ,,SUM([Trade Value (US$)]) As FROM RangeName Group By ,

    Để lưu dòng tiêu đề vô Sheet thì bạn phải dùng code gán riêng, còn dùng CopyFromRecordset là chỉ lấy Recordset (tức các record thôi chứ không có Field)
    Thêm dòng code này vô:

    Dim iCol As Integer
    For iCol = 1 To rs.Fields.Count
        Sheet4.Cells(2, iCol).Value = rs.Fields(iCol - 1).Name
    Next

    Em hỏi nốt anh cái này ạ. Em muốn thêm số thứ tự vào Code SQL em làm thế này mà không chạy được thì làm sao ạ

    SELECT ROW_NUMBER() OVER (ORDER BY ) AS [Số thứ tự],,,,,,[Trade Value (US$)] FROM RangeName WHERE ='ALB' and [Trade Value (US$)] > 20000000

    – Hàm ROW_NUMBER() chỉ dùng cho CSDL SQL Server thôi nhé.
    – Nếu như các dòng dữ liệu của em có 1 field làm khoá (Primary Key) để phân biệt dòng này với dòng khác thì có thể dùng Subquery lồng vô để tạo tự động số thứ tự dòng. Đối với trường hợp dữ liệu như hiện tại thì anh bó tay.
    Em ngâm cứu cách tạo thêm cột Stt sau bằng code riêng trong Excel đi.

    Thêm cột STT đơn giản hơn bằng câu SQL sau:

    SELECT 1 AS [Số thứ tự],[Classification],[Trade Flow],[Reporter],[Partner],[Reporter ISO],[Trade Value (US$)]
    FROM RangeName WHERE [Reporter ISO]='ALB' and [Trade Value (US$)] > 20000000

    Sau đó thêm các câu lệnh sau:

    Dim LastRw
    LastRw = Sheet4.[A10000].End(xlUp).Row
    Sheet4.Range("A3:A" & LastRw).Value = Evaluate("=Row(R:R)")

    Liên quan đến chủ đề này, nếu biết SQL join table nhưng chưa rành VBA thì sử dụng Power Query (Merge) cho dễ.
    Trong file đính kèm có 2 sheet query, thay đổi validation và refresh là được

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm