Trích lọc và tìm kiếm dùng SQL?

Liên hệ QC

manhhung12

Thành viên thường trực
Tham gia
20/3/08
Bài viết
232
Được thích
88
Tôi đã đọc bài viết về sử dụng query của Ptm0412 (xin lỗi: không phải TuanVNUNI). Hay lắm nhưng ta lại phải tạo bảng từ MS access. Vậy có thể chỉ đơn thuần dùng bảng trên excel. Có ai đã làm như vậy cho anh em xem với.
Ta có thể dùng name động đẻ định nghĩa các field và table trong 1 sheet của excel không?
ví dụ:
set bang1=offset(sheet1!$b$4,,1,conta("C:C"),5) gồm các fiéld sau:
field1=offset(sheet1!$b$4,,1,conta("C:C"),1)
field2=offset(sheet1!$b$4,,2,conta("C:C"),1)
fiẻld=offset(sheet1!$b$4,,3,conta("C:C"),1)
....
sau đó truy vấn trên bảng này và các field như vậy không?
 
Lần chỉnh sửa cuối:
Thứ bảy mình đã nêu cách xem Excel họ viết như thế nào để từ đó phát triển theo cách của mình http://www.giaiphapexcel.com/forum/showthread.php?t=12940

Mình gửi bạn thư viện object theo Email của bạn rồi đấy.

Mình gửi Manhhung12 ví dụ, bạn xem và cho mình ý kiến nhé.
Xin lỗi mình chưa xóa các Module không liên quan, vậy bạn xem code trong Sub Code_SQL trong Module so_ct nhé
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Mình gửi Manhhung12 ví dụ, bạn xem và cho mình ý kiến nhé.
Xin lỗi mình chưa xóa các Module không liên quan, vậy bạn xem code trong Sub Code_SQL trong Module so_ct nhé
Bạn có 1 SW nào dùng đẻ tìm pass của file excel kg? Hom trước mình có đowloa 1file về trong đó có các *.xla (kg sử dụng đến và có muốn sử dụng cũng kg có pass để biết nó dùng cho cái gì) nên mình muốn remove nó đi.
 
Upvote 0
To manhhung12: Rất tiếc mình không có, bạn gửi tin nhờ ndu ấy
 
Upvote 0
Hi!
Sao lại báo lỗi ờ dòng
th = InputBox("Nhap thang:")

Thân.
 
Upvote 0
To Thien:
Vì là File ví dụ nên mình chưa chặn lỗi, bạn nhập số từ 1 đến 5 vì dữ liệu tạm có vậy thôi. Xin lỗi nha.
 
Upvote 0
Có 1 thí dụ khác lấy database query từ file Excel khác đây.
FIle này là file mẫu dùng minh hoạ cho topic Database Query, bài 13. Bạn có thể đọc thêm trong topic đó. Query lọc theo mã NCC lấy từ combobox.
Giải nén thư mục Data vào ổ D. Nếu bạn tự làm file mới thì ở đâu cũng được.
 

File đính kèm

Upvote 0
To Thien:
Vì là File ví dụ nên mình chưa chặn lỗi, bạn nhập số từ 1 đến 5 vì dữ liệu tạm có vậy thôi. Xin lỗi nha.
Mình chạy file rồi nhưng kg hiểu sao cứ báo lỗi ở dòng:
HTML:
mydir = Left(nguon, Len(nguon) - Len(ActiveWorkbook.Name))
"can't find project or library"
Trước đó mình đã khai báo:

HTML:
Dim th, nguon
Dim mydir, sqlstr As String
 
Upvote 0
Mình gửi Manhhung12 ví dụ, bạn xem và cho mình ý kiến nhé.
Xin lỗi mình chưa xóa các Module không liên quan, vậy bạn xem code trong Sub Code_SQL trong Module so_ct nhé
Tôi đã xem bài của bạn, tuy nhiên do máy của tôi xài Vista và thằng con nó cài SQL server nên nó xung đột (tôi đoán vậy) các hàm thông thường trong excel mà nó báo là kg có (hàm Len() chẳng hạn). và mỗi lần tôi Import External Data -> New database Query thì nó yêu cầu add từ MSO 2k3 (office 2003) nên tôi kg chạy được Modul ban gửi. Tuy nhiên vì vạn record macro nên trong code khó nhìn quá.
Ban xem bài của Đào Việt Cường viết:
http://www.giaiphapexcel.com/forum/showthread.php?t=63
Rất hay và rõ ràng.
Thân
 
Upvote 0
To manhhung12:
Không phải đâu bạn ơi, ngay cả Office2003 cũng không có mà mình lợi dụng Ad-In Analysic ToolPark nó bổ xung cho thôi, muốn có phải cài đặt cơ.
 
Upvote 0
To manhhung12:
Không phải đâu bạn ơi, ngay cả Office2003 cũng không có mà mình lợi dụng Ad-In Analysic ToolPark nó bổ xung cho thôi, muốn có phải cài đặt cơ.
Analysic ToolPark : Mình đã chọn rồi nhưng vẫn bi lỗi.
Nhân đây các bạn cho hỏi câu lệnh sau:
HTML:
        .CommandText = Array( _
        "SELECT CtNX.NhaCC, DSNCC.TenNCC, DSNCC.MST, DSNCC.Dunodky, DSNCC.Ducodky, CtNX.SoCT, CtNX.NgayCT, CtNX.Noidung, CtNX.TratienNCC, CtNX.CongtienNX+CtNX.congvat AS 'Muahang'" & Chr(13) & "" & Chr(10) & "FROM `D:\Data\Nhaplieu`.CtNX" _
  1:       , _   
        " CtNX, `D:\Data\Nhaplieu`.DSNCC DSNCC" & Chr(13) & "" & Chr(10) & "WHERE DSNCC.msNCC = CtNX.NhaCC AND ((DSNCC.msNCC='" & MS & "'))" _
        )
Tại sao tại dòng có đánh số 1 màu xanh (do tôi thêm vào):
, _
nhưng nếu tôi để lên trên như sau
`D:\Data\Nhaplieu`.CtNX", _

hay `D:\Data\Nhaplieu`.CtNX,CtNX," _
hay: `D:\Data\Nhaplieu`.CtNX CtNx," _

thì báo lỗi???
`D:\Data\Nhaplieu`.CtNX CtNx" tương đương
`D:\Data\Nhaplieu`.DSNCC DSNCC" chứ, vì theo tôi hiểu đay là danh sách các table mà SQL tham chiếu để nhận các Field và đưa vào table kết quả.
Các bạn giải thích hộ. Trong Êxcl tôi thấy nó hơi khác với trong access hoặc VB
 
Lần chỉnh sửa cuối:
Upvote 0
Đó là dấu ngắt dòng Macro nó thu lại thế thôi, xin lỗi mình chưa chỉnh sửa
 
Upvote 0
Ta có thể dùng name động đẻ định nghĩa các field và table trong 1 sheet của excel không?
ví dụ:
set bang1=offset(sheet1!$b$4,,1,conta("C:C"),5) gồm các fiéld sau:
field1=offset(sheet1!$b$4,,1,conta("C:C"),1)
field2=offset(sheet1!$b$4,,2,conta("C:C"),1)
fiẻld=offset(sheet1!$b$4,,3,conta("C:C"),1)
Trong file nhaplieu tôi cũng đã thử đặt name động như bạn nói, nhưng MSQuery không nhận dạng nó như 1 Visible table, rốt cuộc tôi phải đặt name tĩnh. Bù lại khi đã đặt name cho 1 table thì không cần đặt name cho fields.
Tại sao tại dòng có đánh số 1 màu xanh (do tôi thêm vào):
, _
nhưng nếu tôi để lên trên như sau
`D:\Data\Nhaplieu`.CtNX", _
Đó là dấu phẩy quy định của hàm Array(), tôi cũng không hiểu hết, chỉ là record macro.
Dù vậy `D:\Data\Nhaplieu`.CtNX", _ vẫn chạy tốt.

Còn câu lệnh SQL nếu bạn xem trong cửa sổ Edit Query sẽ thấy không khác gì trong Access:

SELECT CtNX.NhaCC, DSNCC.TenNCC, DSNCC.MST, DSNCC.Dunodky, DSNCC.Ducodky, CtNX.SoCT, CtNX.NgayCT, CtNX.Noidung, CtNX.TratienNCC, CtNX.CongtienNX+CtNX.congvat AS 'Muahang'
FROM `D:\Data\Nhaplieu`.CtNX CtNX, `D:\Data\Nhaplieu`.DSNCC DSNCC
WHERE DSNCC.msNCC = CtNX.NhaCC AND ((DSNCC.msNCC='nt'))

Chỉ là khi đưa vào hàm Array() của VBA trong câu lệnh CommandText nó mới phải theo 1 cấu trúc mà VBA xử lý được.
 
Upvote 0
Trong file nhaplieu tôi cũng đã thử đặt name động như bạn nói, nhưng MSQuery không nhận dạng nó như 1 Visible table, rốt cuộc tôi phải đặt name tĩnh. Bù lại khi đã đặt name cho 1 table thì không cần đặt name cho fields.
Vậy khi đã có name và ta coi đó là 1 table thì có cần dùng array trong câu lệnh SQL không nhỉ? Vì nếu VBA coi đó là 1 table thì Table chính là array (như thế thì rất tiện và câu lệnh SQL sẽ rất dễ nhìn.
 
Upvote 0
Nếu bạn nắm vững cấu trúc câu lệnh SQL thì bỏ qua cái record macro, vì record macro luôn dùng phương thức ActiveSheet.QueryTables.Add và hàm Array(). Bạn hãy dùng như bài 7 topic
http://www.giaiphapexcel.com/forum/showthread.php?t=12940
khai báo connection, khai báo recordset, rồi dùng phương thức Execute((SQLText)
TuanVNUNI topic đó đã viết:
Sub DoFillRangeBySQL(ByVal CellResult As Range, ByVal SQLText As String)
Dim oConn As New ADODB.Connection
Dim oRS As ADODB.Recordset

.....
Set oRS = oConn.Execute(SQLText)
.....
CellResult.CopyFromRecordset oRS
.....
End Sub
'-------------------------------------------------
Sub DoReport1()
DoFillRangeBySQL Range("A1"), "SELECT * FROM NKC WHERE DVKH = 'KH001' "
End Sub
 
Upvote 0
Nếu bạn nắm vững cấu trúc câu lệnh SQL thì bỏ qua cái record macro, vì record macro luôn dùng phương thức ActiveSheet.QueryTables.Add và hàm Array(). Bạn hãy dùng như bài 7 topic
http://www.giaiphapexcel.com/forum/showthread.php?t=12940
khai báo connection, khai báo recordset, rồi dùng phương thức Execute((SQLText)
Câu lệnh SQL thì tôi cũng có viết và nắm được nguyên tắc. Tuy nhiên, việc liên kết dl và các tham chiếu cũng như thư viện (để tạo connect, recordset, ....) trong môi trường excel thì tôi còn chưa rành. vả lại câu lệnh SQL theo tôi hiểu thì là câu lệnh chuẩn còn ở mỗi môi trường 1 khác( ví dụ: sêlêct ... from 'd:\f1.xls'.hh hh: trong excel còn trong Access: from f1 as a where a.x = b.y ...)
Vậy bạn đã làm nhiều thì có thể đưa lên 1 ví dụ đầy đủ đẻ anh em hoc tập với (các bảng tính, đặt tên bảng tính rồi form, các sub/function trong đó, câu lệnh SQL truy vấn...)
 
Upvote 0
Tôi cũng chưa làm gì nhiều, khi viết các bài đó là vừa tự nghiên cứu, vưà thử nghiệm vừa viết ra. File thí dụ ở trên là 1 dạng như vậy. Mục đích của topic là truyền bá cách tổ chức CSDL và các thủ thuật tạo, sử dụng Query, nhằm xử lý dữ liệu không làm file bị nặng. Cho nên không đi sâu vào VBA. VBA tôi cũng hạng ruồi thôi.

Tuy nhiên, việc liên kết dl và các tham chiếu cũng như thư viện (để tạo connect, recordset, ....) trong môi trường excel thì tôi còn chưa rành.

Vậy bạn tìm hiểu thêm trong chính phần tôi trích dẫn bài 15 trên đây. Rồi bạn cứ dùng wizard của Excel tạo query.
- Trong cửa sổ MS Query có nút nhấn view SQL bạn copy nó để gán cho 1 biến SQLString nào đó. Nếu câu lệnh SQL xuống dòng bạn phải nhét vào 1 ký tự xuống dòng chr(10)
- Bạn có thể dùng các biến khác để gán file path, file name, criteria1, 2, 3, sau đó chẻ nhỏ câu SQL ra, nhét các biến vào bằng toán tử &
- Cuối cùng dùng recordset và connection
Vậy bạn đã làm nhiều thì có thể đưa lên 1 ví dụ đầy đủ đẻ anh em hoc tập với (các bảng tính, đặt tên bảng tính rồi form, các sub/function trong đó, câu lệnh SQL truy vấn...)
Thí dụ chẳng phải đã có rồi sao? Tuy nhiên cần phải nhắc lại: Tạo CSDL và trích lọc tính toán CSDL thành 1 báo cáo là 2 chuyện hoàn toàn khác nhau và nên (nếu không nói là cần) tách ra các file khác nhau.
Vậy thì:
- Bảng tính (sheet chứa dữ liệu không công thức), tên bảng tính (table), form nhập liệu kèm code (Sub/function) là thuộc về CSDL và nhập liệu.
- Truy vấn (query) đơn giản hoặc phức tạp là thuộc về xử lý dữ liệu để ra báo cáo. tất nhiên có thể dùng VBA để tự động hoá phần này như đã tự động hoá phần kia.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom