dinh_trong_hoa > 21-06-13, 12:29 PM
(21-06-13, 11:22 AM)Xuân Thanh Đã viết: Đề bài bạn yêu cầu : Ghi cái mã nào thì hiển thị cái mã đó. Trong CSDL không có mã MX thì làm sao thể hiện được? Nếu y/c khác thì phải thực hiện cách khác. Đây là cách đặt vấn đề không rõ ràng nên thế.
paulsteigel > 21-06-13, 12:45 PM
(21-06-13, 12:29 PM)dinh_trong_hoa Đã viết:Bạn thử xem qua cái file demo tôi gửi chưa? Cách tiếp cận cũng giống bạn Xuanthanh nhưng tìm dạng fulltext trên tất cả các trường. Gõ vào cái gì nó sẽ đưa ra danh sách có chứa cái đấy! Nếu muốn tìm kiếm Exact thì thêm vài điều khiển nữa là được. Nhưng cơ bản giống tiếp cận trong file đính kèm ở trước.(21-06-13, 11:22 AM)Xuân Thanh Đã viết: Đề bài bạn yêu cầu : Ghi cái mã nào thì hiển thị cái mã đó. Trong CSDL không có mã MX thì làm sao thể hiện được? Nếu y/c khác thì phải thực hiện cách khác. Đây là cách đặt vấn đề không rõ ràng nên thế.
Dear Xuân Thanh,
Giờ mình sẽ mô tả công việc hiện tại của mình để bạn tiện chỉ dẫn.
Mình làm công việc quản lý tình hình mỹ phẩm của công ty. Công ty mẹ bên nước ngoài sẽ thường gởi thông tin các sản phẩm theo yêu cầu của công ty trong nước hoặc họ tự gởi nếu có gì mới hay thay đổi. Nhiệm vụ của mình là theo dõi dữ liệu. Khi sếp làm việc sếp bên nước ngoài quyết định tháng này bán cái gì, thì sẽ bảo kiểm tra thông tin có hay chưa, nếu chưa thì bảo nước ngoài gởi về.
Còn về phần dữ liệu thì một sản phẩm có nhiều code, có khi trùng nhau vì thế ý mình sẽ thiết kế một trường có tên là "hệ thống code" chứa toàn bộ code của một sản phẩm mỗi code sẽ cách nhau 1 dấu "," khi tìm sẽ dựa theo trường này, nếu dùng theo mẫu file demo chỉ nhập được 1 code và duy nhất. VD: nhập vào máy code "A" đến khi xếp hỏi lại dùng code "B" kết quả cho ra 0 thì tiêu. Còn nếu làm theo mẫu mình đăng ở mấy bai trước thì 1 lần chỉ kiểm tra được 1 giá trị trong khi thực tế 1 lần mình kiểm tra it nhất la 20 giá trị.
Mong các bạn hỗ trợ để giải quyết vấn đề.
Hiện mình đang ở SG nếu bạn Xuân Thanh cũng ở SG, mình muốn mời bạn chủ nhật này đi uống cafe. Trước để làm quen, sau thì mình muốn học hỏi thêm.
dinh_trong_hoa > 21-06-13, 12:59 PM
(21-06-13, 12:45 PM)paulsteigel Đã viết:(21-06-13, 12:29 PM)dinh_trong_hoa Đã viết:Bạn thử xem qua cái file demo tôi gửi chưa? Cách tiếp cận cũng giống bạn Xuanthanh nhưng tìm dạng fulltext trên tất cả các trường. Gõ vào cái gì nó sẽ đưa ra danh sách có chứa cái đấy! Nếu muốn tìm kiếm Exact thì thêm vài điều khiển nữa là được. Nhưng cơ bản giống tiếp cận trong file đính kèm ở trước.(21-06-13, 11:22 AM)Xuân Thanh Đã viết: Đề bài bạn yêu cầu : Ghi cái mã nào thì hiển thị cái mã đó. Trong CSDL không có mã MX thì làm sao thể hiện được? Nếu y/c khác thì phải thực hiện cách khác. Đây là cách đặt vấn đề không rõ ràng nên thế.
Dear Xuân Thanh,
Giờ mình sẽ mô tả công việc hiện tại của mình để bạn tiện chỉ dẫn.
Mình làm công việc quản lý tình hình mỹ phẩm của công ty. Công ty mẹ bên nước ngoài sẽ thường gởi thông tin các sản phẩm theo yêu cầu của công ty trong nước hoặc họ tự gởi nếu có gì mới hay thay đổi. Nhiệm vụ của mình là theo dõi dữ liệu. Khi sếp làm việc sếp bên nước ngoài quyết định tháng này bán cái gì, thì sẽ bảo kiểm tra thông tin có hay chưa, nếu chưa thì bảo nước ngoài gởi về.
Còn về phần dữ liệu thì một sản phẩm có nhiều code, có khi trùng nhau vì thế ý mình sẽ thiết kế một trường có tên là "hệ thống code" chứa toàn bộ code của một sản phẩm mỗi code sẽ cách nhau 1 dấu "," khi tìm sẽ dựa theo trường này, nếu dùng theo mẫu file demo chỉ nhập được 1 code và duy nhất. VD: nhập vào máy code "A" đến khi xếp hỏi lại dùng code "B" kết quả cho ra 0 thì tiêu. Còn nếu làm theo mẫu mình đăng ở mấy bai trước thì 1 lần chỉ kiểm tra được 1 giá trị trong khi thực tế 1 lần mình kiểm tra it nhất la 20 giá trị.
Mong các bạn hỗ trợ để giải quyết vấn đề.
Hiện mình đang ở SG nếu bạn Xuân Thanh cũng ở SG, mình muốn mời bạn chủ nhật này đi uống cafe. Trước để làm quen, sau thì mình muốn học hỏi thêm.
paulsteigel > 21-06-13, 02:12 PM
Private Function BuildSQL(txtIn As String, txtFields As String) As String
' Chia tham số tìm kiếm ra thành các phần tử của mảng để xây dựng truy vấn tìm kiếm
Dim inVar As Variant, fldName As Variant
Dim i As Long, j As Long, tmpVar As String, SqlTxt As String
inVar = Split(txtIn, txtDelm)
fldName = Split(txtFields, ",")
' Xây dựng chuỗi cấu thành truy vấn
For j = LBound(fldName) To UBound(fldName)
tmpVar = fldName(j)
fldName(j) = ""
For i = LBound(inVar) To UBound(inVar)
If Nz(Trim(inVar(i)), "") <> "" Then
fldName(j) = fldName(j) & "OR " & tmpVar & " Like '*" & inVar(i) & "*' "
End If
Next
fldName(j) = tmpVar & " IN (Select " & tmpVar & " From nxb Where " & Mid(fldName(j), 4) & ")"
SqlTxt = SqlTxt & "OR " & fldName(j)
Next
' Hoàn thiện chuỗi truy vấn
SqlTxt = "SELECT manxb, tennxb, diachi, dienthoai FROM nxb Where " & Mid(SqlTxt, 4) & ";"
BuildSQL = SqlTxt
End Function
dinh_trong_hoa > 21-06-13, 02:33 PM
(21-06-13, 02:12 PM)paulsteigel Đã viết: Thực ra, trong tìm kiếm người ta thường tìm cách đơn giản hóa vấn đề chứ không cần phải làm phức tạp ra. Google là một ví dụ về tìm kiếm.
Mình đã làm một file ví dụ cho bạn. Nếu muốn tìm theo nhiều điều kiện, người ta xử lý chuỗi tìm kiếm trước. Sau đó xây dựng thuật toán tìm kiếm để hỗ trợ tìm nhiều dữ kiện.
Mình cụ thể hóa cách làm của Xuan Thanh ra một bài như trong file liên kết trong bài đầu của mình.
Tài liệu mẫu ở đây
Cách tiếp cận thế này:
1. Xử lý dữ kiện tìm kiếm
2. Xây dựng truy vấn
3. Thực hiện.
Phần querry của mình là để làm mẫu vì thế nếu muốn dùng cho các kiểu dữ liệu khác nhau thì phải sửa tí chú.
Ở đây cốt lõi là
Trong đó txtFields là danh sách các trường cần tìm kiếm theoMã PHP:Private Function BuildSQL(txtIn As String, txtFields As String) As String
' Chia tham số tìm kiếm ra thành các phần tử của mảng để xây dựng truy vấn tìm kiếm
Dim inVar As Variant, fldName As Variant
Dim i As Long, j As Long, tmpVar As String, SqlTxt As String
inVar = Split(txtIn, txtDelm)
fldName = Split(txtFields, ",")
' Xây dựng chuỗi cấu thành truy vấn
For j = LBound(fldName) To UBound(fldName)
tmpVar = fldName(j)
fldName(j) = ""
For i = LBound(inVar) To UBound(inVar)
If Nz(Trim(inVar(i)), "") <> "" Then
fldName(j) = fldName(j) & "OR " & tmpVar & " Like '*" & inVar(i) & "*' "
End If
Next
fldName(j) = tmpVar & " IN (Select " & tmpVar & " From nxb Where " & Mid(fldName(j), 4) & ")"
SqlTxt = SqlTxt & "OR " & fldName(j)
Next
' Hoàn thiện chuỗi truy vấn
SqlTxt = "SELECT manxb, tennxb, diachi, dienthoai FROM nxb Where " & Mid(SqlTxt, 4) & ";"
BuildSQL = SqlTxt
End Function
txtFieldName = "manxb,tennxb,diachi,dienthoai"
Bạn có thể thử bằng cách gõ nội dung bất kỳ cần tìm kiếm và phân cách bằng dấu ";"
Thân!
P/S nếu bạn muốn có câu trả lời dễ nhấn cho ứng dụng của bạn thì hãy gửi bảng dữ liệu cần tìm kiếm lên, mọi người sẽ giúp bạn!
dinh_trong_hoa > 22-06-13, 01:44 PM
(21-06-13, 02:12 PM)paulsteigel Đã viết: Thực ra, trong tìm kiếm người ta thường tìm cách đơn giản hóa vấn đề chứ không cần phải làm phức tạp ra. Google là một ví dụ về tìm kiếm.
Mình đã làm một file ví dụ cho bạn. Nếu muốn tìm theo nhiều điều kiện, người ta xử lý chuỗi tìm kiếm trước. Sau đó xây dựng thuật toán tìm kiếm để hỗ trợ tìm nhiều dữ kiện.
Mình cụ thể hóa cách làm của Xuan Thanh ra một bài như trong file liên kết trong bài đầu của mình.
Tài liệu mẫu ở đây
Cách tiếp cận thế này:
1. Xử lý dữ kiện tìm kiếm
2. Xây dựng truy vấn
3. Thực hiện.
Phần querry của mình là để làm mẫu vì thế nếu muốn dùng cho các kiểu dữ liệu khác nhau thì phải sửa tí chú.
Ở đây cốt lõi là
Trong đó txtFields là danh sách các trường cần tìm kiếm theoMã PHP:Private Function BuildSQL(txtIn As String, txtFields As String) As String
' Chia tham số tìm kiếm ra thành các phần tử của mảng để xây dựng truy vấn tìm kiếm
Dim inVar As Variant, fldName As Variant
Dim i As Long, j As Long, tmpVar As String, SqlTxt As String
inVar = Split(txtIn, txtDelm)
fldName = Split(txtFields, ",")
' Xây dựng chuỗi cấu thành truy vấn
For j = LBound(fldName) To UBound(fldName)
tmpVar = fldName(j)
fldName(j) = ""
For i = LBound(inVar) To UBound(inVar)
If Nz(Trim(inVar(i)), "") <> "" Then
fldName(j) = fldName(j) & "OR " & tmpVar & " Like '*" & inVar(i) & "*' "
End If
Next
fldName(j) = tmpVar & " IN (Select " & tmpVar & " From nxb Where " & Mid(fldName(j), 4) & ")"
SqlTxt = SqlTxt & "OR " & fldName(j)
Next
' Hoàn thiện chuỗi truy vấn
SqlTxt = "SELECT manxb, tennxb, diachi, dienthoai FROM nxb Where " & Mid(SqlTxt, 4) & ";"
BuildSQL = SqlTxt
End Function
txtFieldName = "manxb,tennxb,diachi,dienthoai"
Bạn có thể thử bằng cách gõ nội dung bất kỳ cần tìm kiếm và phân cách bằng dấu ";"
Thân!
P/S nếu bạn muốn có câu trả lời dễ nhấn cho ứng dụng của bạn thì hãy gửi bảng dữ liệu cần tìm kiếm lên, mọi người sẽ giúp bạn!
paulsteigel > 22-06-13, 05:51 PM
Select a from tenbang where a in (Câu truy vấn phụ trả về danh sách các bản ghi thỏa mãn điều kiện đầu vào bạn vừa nhập)
select a from tenbang where a like '*" & từng mã tìm kiếm & "'"
dinh_trong_hoa > 26-06-13, 02:58 PM
(22-06-13, 05:51 PM)paulsteigel Đã viết: Xin phép giải thích một chút theo yêu cầu của bạn nhé;
1. Hàm Split được sử dụng để bẻ một chuỗi ra một mảng 1 chiều trong đó chuỗi được cấu thành từ các phần tử được phân cách nhau bằng dấu phân cách.
Cách sử dụng
Split([Chuỗi],[Dấu phân cách],[giới hạn],[cách so sánh])
Nếu chỉ đưa 1 tham số thì hàm tự động nhận dạng dấu phân cách là khoảng trắng " ";
Thường người ta chỉ dùng đến 2 tham số là cùng.
Ngược lại với hàm Split là hàm Join dùng để nối phần tử của mảng một chiều thành chuỗi.
2. Hàm BuildSQL trong bài là hàm tôi tự viêt bằng VBA để xử lý các điều kiện thành câu truy vấn hoàn chỉnh.
BuildSQL(txtIn As String, txtFields As String)
Tham số txtIn là chuỗi tham số đầu vào của câu tìm kiếm mà bạn muốn tìm, txtFields là chuỗi chứa tên các trường cần thực hiện lệnh tìm kiếm.
Ở đây chuỗi này tôi đặt là danh sách trường có phân cách bằng dấu phẩy.
Trong hàm này có nhiều biện pháp xử lý để hình thành câu truy vấn dạng
Câu truy vấn phụ có dạngMã PHP:Select a from tenbang where a in (Câu truy vấn phụ trả về danh sách các bản ghi thỏa mãn điều kiện đầu vào bạn vừa nhập)
Như vậy câu truy vấn phụ sẽ liệt kê tất cả các bản ghi gần giống với mã điều kiện đầu vào.Mã PHP:select a from tenbang where a like '*" & từng mã tìm kiếm & "'"
Tôi phải dùng câu truy vấn phụ để tránh làm phức tạp hóa cú pháp tìm kiếm.
Giờ thì bạn đã hiểu cách dùng Split và thủ tục của tôi rồi chứ.
Bài này bên cạnh việc phải tìm hiểu về cách viết câu lệnh truy vấn một cách nghiêm chỉnh (đọc tài liệu về SQL), thì phần còn lại đơn thuần chỉ là lập trình VBA.
Nếu bạn chưa hiểu về VBA thì hãy nên bắt đầu đọc một cuốn sách về VBA đã và thử làm một vài cấu trúc đơn giản, và nếu có thể thì cố gắng học về thuật toán. Bạn sẽ có thể tự mình làm được những điều như trên nhờ 2 nhóm kiến thức đó.
Ở đây có một lưu ý:
Trong sự kiện Change của textbox, nếu ta chỉ tham chiếu textbox.value thì nó sẽ không cập nhập cái ta đang gõ, mà phải dùng textbox.text.
paulsteigel > 26-06-13, 03:26 PM
(26-06-13, 02:58 PM)dinh_trong_hoa Đã viết:Có một bài tớ đã trả lời ở diễn đàn rồi vê việc transfer sang Excel đấy!...(22-06-13, 05:51 PM)paulsteigel Đã viết: Xin phép giải thích một chút theo yêu cầu của bạn nhé;
1. Hàm Split được sử dụng để bẻ một chuỗi ra một mảng 1 chiều trong đó chuỗi được cấu thành từ các phần tử được phân cách nhau bằng dấu phân cách.
Cách sử dụng
Split([Chuỗi],[Dấu phân cách],[giới hạn],[cách so sánh])
Nếu chỉ đưa 1 tham số thì hàm tự động nhận dạng dấu phân cách là khoảng trắng " ";
Thường người ta chỉ dùng đến 2 tham số là cùng.
Ngược lại với hàm Split là hàm Join dùng để nối phần tử của mảng một chiều thành chuỗi.
2. Hàm BuildSQL trong bài là hàm tôi tự viêt bằng VBA để xử lý các điều kiện thành câu truy vấn hoàn chỉnh.
BuildSQL(txtIn As String, txtFields As String)
Tham số txtIn là chuỗi tham số đầu vào của câu tìm kiếm mà bạn muốn tìm, txtFields là chuỗi chứa tên các trường cần thực hiện lệnh tìm kiếm.
Ở đây chuỗi này tôi đặt là danh sách trường có phân cách bằng dấu phẩy.
Trong hàm này có nhiều biện pháp xử lý để hình thành câu truy vấn dạng
Câu truy vấn phụ có dạngMã PHP:Select a from tenbang where a in (Câu truy vấn phụ trả về danh sách các bản ghi thỏa mãn điều kiện đầu vào bạn vừa nhập)
Như vậy câu truy vấn phụ sẽ liệt kê tất cả các bản ghi gần giống với mã điều kiện đầu vào.Mã PHP:select a from tenbang where a like '*" & từng mã tìm kiếm & "'"
Tôi phải dùng câu truy vấn phụ để tránh làm phức tạp hóa cú pháp tìm kiếm.
Giờ thì bạn đã hiểu cách dùng Split và thủ tục của tôi rồi chứ.
Bài này bên cạnh việc phải tìm hiểu về cách viết câu lệnh truy vấn một cách nghiêm chỉnh (đọc tài liệu về SQL), thì phần còn lại đơn thuần chỉ là lập trình VBA.
Nếu bạn chưa hiểu về VBA thì hãy nên bắt đầu đọc một cuốn sách về VBA đã và thử làm một vài cấu trúc đơn giản, và nếu có thể thì cố gắng học về thuật toán. Bạn sẽ có thể tự mình làm được những điều như trên nhờ 2 nhóm kiến thức đó.
Ở đây có một lưu ý:
Trong sự kiện Change của textbox, nếu ta chỉ tham chiếu textbox.value thì nó sẽ không cập nhập cái ta đang gõ, mà phải dùng textbox.text.
Dear paulsteigel,
Tiếp theo bài trước, sau khi listbox đã thể hiện các giá trị cần tìm, mình muốn rút các giá trị đó ra excel. Nhờ bạn hướng dẫn giùm mình !
Thank
Option Compare Database
Function Export2Excel(Optional qryName As String, Optional qryString As String, Optional ExlFileName As String) As Boolean
'On Error GoTo errHandler
If qryName = "" Then
If qryString = "" Then
MsgBox "Chua co cau lenh Truy van SQL..", vbInformation
GoTo errHandler
End If
' Tao Query tam thoi
CurrentDb.CreateQueryDef "tmp_Qry", qryString
qryName = "tmp_Qry"
End If
If ExlFileName = "" Then ExlFileName = CurrentProject.Path & "\" & qryName & ".xls"
' Xoa file Excel neu da ton tai
If Dir(ExlFileName) <> "" Then Kill ExlFileName
' Xuat ra Excel
'DoCmd.OutputTo acOutputQuery, qryName, acCmdOutputToExcel, ExlFileName
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, qryName, ExlFileName, True
Export2Excel = True
errHandler:
If Export2Excel Then
MsgBox "Da xuat thanh cong ra Excel..Ten tap tin la: [" & vbclrf & ExlFileName, vbInformation
Else
MsgBox "Viec xuat file ra Excel khong thanh cong...", vbInformation
End If
Err.Clear
On Error Resume Next
' xoa Query tam
If qryName = "tmp_Qry" Then DoCmd.DeleteObject acQuery, qryName
End Function
Sub Test()
'Call Export2Excel("Query1")
Call Export2Excel(, "SELECT a.tentg, Count(b.tensach) AS Dausach FROM tacgia AS a INNER JOIN sach AS b ON a.matg=b.matg GROUP BY a.tentg;")
End Sub
dinh_trong_hoa > 26-06-13, 03:35 PM
(26-06-13, 03:26 PM)paulsteigel Đã viết:(26-06-13, 02:58 PM)dinh_trong_hoa Đã viết:Có một bài tớ đã trả lời ở diễn đàn rồi vê việc transfer sang Excel đấy!...(22-06-13, 05:51 PM)paulsteigel Đã viết: Xin phép giải thích một chút theo yêu cầu của bạn nhé;
1. Hàm Split được sử dụng để bẻ một chuỗi ra một mảng 1 chiều trong đó chuỗi được cấu thành từ các phần tử được phân cách nhau bằng dấu phân cách.
Cách sử dụng
Split([Chuỗi],[Dấu phân cách],[giới hạn],[cách so sánh])
Nếu chỉ đưa 1 tham số thì hàm tự động nhận dạng dấu phân cách là khoảng trắng " ";
Thường người ta chỉ dùng đến 2 tham số là cùng.
Ngược lại với hàm Split là hàm Join dùng để nối phần tử của mảng một chiều thành chuỗi.
2. Hàm BuildSQL trong bài là hàm tôi tự viêt bằng VBA để xử lý các điều kiện thành câu truy vấn hoàn chỉnh.
BuildSQL(txtIn As String, txtFields As String)
Tham số txtIn là chuỗi tham số đầu vào của câu tìm kiếm mà bạn muốn tìm, txtFields là chuỗi chứa tên các trường cần thực hiện lệnh tìm kiếm.
Ở đây chuỗi này tôi đặt là danh sách trường có phân cách bằng dấu phẩy.
Trong hàm này có nhiều biện pháp xử lý để hình thành câu truy vấn dạng
Câu truy vấn phụ có dạngMã PHP:Select a from tenbang where a in (Câu truy vấn phụ trả về danh sách các bản ghi thỏa mãn điều kiện đầu vào bạn vừa nhập)
Như vậy câu truy vấn phụ sẽ liệt kê tất cả các bản ghi gần giống với mã điều kiện đầu vào.Mã PHP:select a from tenbang where a like '*" & từng mã tìm kiếm & "'"
Tôi phải dùng câu truy vấn phụ để tránh làm phức tạp hóa cú pháp tìm kiếm.
Giờ thì bạn đã hiểu cách dùng Split và thủ tục của tôi rồi chứ.
Bài này bên cạnh việc phải tìm hiểu về cách viết câu lệnh truy vấn một cách nghiêm chỉnh (đọc tài liệu về SQL), thì phần còn lại đơn thuần chỉ là lập trình VBA.
Nếu bạn chưa hiểu về VBA thì hãy nên bắt đầu đọc một cuốn sách về VBA đã và thử làm một vài cấu trúc đơn giản, và nếu có thể thì cố gắng học về thuật toán. Bạn sẽ có thể tự mình làm được những điều như trên nhờ 2 nhóm kiến thức đó.
Ở đây có một lưu ý:
Trong sự kiện Change của textbox, nếu ta chỉ tham chiếu textbox.value thì nó sẽ không cập nhập cái ta đang gõ, mà phải dùng textbox.text.
Dear paulsteigel,
Tiếp theo bài trước, sau khi listbox đã thể hiện các giá trị cần tìm, mình muốn rút các giá trị đó ra excel. Nhờ bạn hướng dẫn giùm mình !
Thank
Xem ở đây này!
Bạn có thể tham khảo thủ tục TestMã PHP:Option Compare Database
Function Export2Excel(Optional qryName As String, Optional qryString As String, Optional ExlFileName As String) As Boolean
'On Error GoTo errHandler
If qryName = "" Then
If qryString = "" Then
MsgBox "Chua co cau lenh Truy van SQL..", vbInformation
GoTo errHandler
End If
' Tao Query tam thoi
CurrentDb.CreateQueryDef "tmp_Qry", qryString
qryName = "tmp_Qry"
End If
If ExlFileName = "" Then ExlFileName = CurrentProject.Path & "\" & qryName & ".xls"
' Xoa file Excel neu da ton tai
If Dir(ExlFileName) <> "" Then Kill ExlFileName
' Xuat ra Excel
'DoCmd.OutputTo acOutputQuery, qryName, acCmdOutputToExcel, ExlFileName
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, qryName, ExlFileName, True
Export2Excel = True
errHandler:
If Export2Excel Then
MsgBox "Da xuat thanh cong ra Excel..Ten tap tin la: [" & vbclrf & ExlFileName, vbInformation
Else
MsgBox "Viec xuat file ra Excel khong thanh cong...", vbInformation
End If
Err.Clear
On Error Resume Next
' xoa Query tam
If qryName = "tmp_Qry" Then DoCmd.DeleteObject acQuery, qryName
End Function
Sub Test()
'Call Export2Excel("Query1")
Call Export2Excel(, "SELECT a.tentg, Count(b.tensach) AS Dausach FROM tacgia AS a INNER JOIN sach AS b ON a.matg=b.matg GROUP BY a.tentg;")
End Sub