paulsteigel > 26-06-13, 10:11 PM
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 > 27-06-13, 06:12 PM
(26-06-13, 10:11 PM)paulsteigel Đã viết:Mã 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
Thực ra thì không có gì cao siêu quá bác Lại ạ, một phần là do bác mới bắt đầu với VBA nên tiếp cận với những thứ như thế này sẽ khá khó.
Tôi xin phép cắt nghĩa đơn giản lại như thế này.
Hàm Export2Excel là một hàm tự tạo và cách sử dụng như thế này:
Export2Excel([Tên Query], [Chuỗi chứa truy vấn], [Tên tập tin Excel])
+ Trong đó nếu có tên query thì có thể bỏ trống tham số thứ 2, 3. Nếu bỏ trống tham số thứ 3 thì tên file
excel xuất ra sẽ chính là tên query của bạn.
Call Export2Excel ([Tên truy vấn], , [tên file excel])
+ Nếu bạn không có tên query thì bắt buộc phải có chuỗi truy vấn và tên tập tin Excel để xuất ra.
Lúc này gọi hàm thế này
Call Export2Excel (,[Chuỗi truy vấn], [tên file excel])
1. Lưu đoạn code tôi gửi ở trên vào một Module
2. Tại bất kỳ một thủ tục nào - ví dụ, bạn tạo một nút bấm CmdExport và tại sự kiện Click của nó, bạn đặt một đoạn gọi hàm của tôi thế này:
+ nếu đã có query:
Call Export2Excel("Query1")
+ Nếu bạn muốn xuất kết quả tìm kiếm ra file excel thì đơn giản là
Call Export2Excel(,frmResult.Form.RecordSource,[Tên file excel])
Trong đó frmResult là tên khung chứa subform hiển thị kết quả.
Đấy cách làm thế đấy bạn ạ
Thân
dinh_trong_hoa > 27-06-13, 06:28 PM
(26-06-13, 10:11 PM)paulsteigel Đã viết:Mã 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
Thực ra thì không có gì cao siêu quá bác Lại ạ, một phần là do bác mới bắt đầu với VBA nên tiếp cận với những thứ như thế này sẽ khá khó.
Tôi xin phép cắt nghĩa đơn giản lại như thế này.
Hàm Export2Excel là một hàm tự tạo và cách sử dụng như thế này:
Export2Excel([Tên Query], [Chuỗi chứa truy vấn], [Tên tập tin Excel])
+ Trong đó nếu có tên query thì có thể bỏ trống tham số thứ 2, 3. Nếu bỏ trống tham số thứ 3 thì tên file
excel xuất ra sẽ chính là tên query của bạn.
Call Export2Excel ([Tên truy vấn], , [tên file excel])
+ Nếu bạn không có tên query thì bắt buộc phải có chuỗi truy vấn và tên tập tin Excel để xuất ra.
Lúc này gọi hàm thế này
Call Export2Excel (,[Chuỗi truy vấn], [tên file excel])
1. Lưu đoạn code tôi gửi ở trên vào một Module
2. Tại bất kỳ một thủ tục nào - ví dụ, bạn tạo một nút bấm CmdExport và tại sự kiện Click của nó, bạn đặt một đoạn gọi hàm của tôi thế này:
+ nếu đã có query:
Call Export2Excel("Query1")
+ Nếu bạn muốn xuất kết quả tìm kiếm ra file excel thì đơn giản là
Call Export2Excel(,frmResult.Form.RecordSource,[Tên file excel])
Trong đó frmResult là tên khung chứa subform hiển thị kết quả.
Đấy cách làm thế đấy bạn ạ
Thân
paulsteigel > 28-06-13, 09:18 AM
dinh_trong_hoa > 28-06-13, 09:46 AM
(28-06-13, 09:18 AM)paulsteigel Đã viết: Xin phép được trả lời bạn thế này cho có đầu có cuối!
1. Về cú pháp optional trong tham số của hàm
Về nguyên tắc, một hàm số, thủ tục, ta có thể xây dựng tham số cho nó theo cách
Function/Sub Ham(thamso1 as string, Optional thamso2 as long [=1]) as boolean
Trong đó (1) việc khai báo kiểu của tham số thì bạn rõ rồi; (2) từ khóa Optional có nghĩa là không bắt buộc giá trị [=1] tức là mặc định nếu không cung cấp tham số khi gọi hàm thì lấy giá trị này.
Như vậy khi gọi hàm ta có 2 cách gọi: (1) Call Ham("abc",2) hoặc (2) Call Ham("abc")
Nếu không có từ khóa optional thì khi gọi hàm bạn bắt buộc phải gọi theo cách 1.
Cách sử dụng từ khóa Optional sẽ giúp việc gọi hàm đơn giản hơn.
Ngoài ra đôi khi bạn còn thấy họ dùng byref hoặc byval trước khi khai báo tên biến tham số. Phần này tôi sẽ giải đáp sau vì đó là kiến thức bậc cao trong lập trình VBA rồi.
2. Về CurrentProject.
Có vẻ bạn chưa có khái niệm về các loại đối tượng trong VBA, nếu nói về cái này thì sẽ phải viết hơi dài, tôi xin tạm cắt nghĩa thế này.
Bạn đang lập trình trong CSDL access QLTV.MDB, tập hợp các đối tượng trong Dự án (project) QLTV cho phép tương tác và tham chiếu được thì có nhiều nhưng bạn có thể sử dụng 2 loại đối tượng toàn cục của dự án này là:
CurrentDB: tham chiếu đến đối tượng quản lý kết nối dữ liệu (DataEngine) của dự án. Với đối tượng này ta có thể gọi được các đối tượng con của nó có liên quan đến dữ liệu như bảng dữ liệu, querry..;
CurrentProject: Tham chiếu đến đối tượng quản lý ứng dụng của Dự án và cho phép tham chiếu đến các đối tượng con của nó như Forms, Report ...vv
Trong bài tôi có dùng CurrentProject.Path để lấy được đường dẫn chứa thư mục làm việc của QLTV.MDB
3. Về OutputTo là lệnh thực hiện việc xuất dữ liệu ra ngoải (export) khi bạn đang ở chế độ xem preview đối với dữ liệu (báo cáo chẳng hạn...). Trong bài tôi đã bỏ dòng lệnh này mà dùng lệnh Transfer...
4. Về câu hỏi của bạn liên quan đến Export2Excel
Nếu kết quả tìm kiếm được hiển thị trên Listbox thì bạn dùng Rowsource vì đây chính là câu truy vấn để lọc kết quả và cung cấp cho listbox.
Nếu bạn dùng 1 subform để hiện thị kết quả thì bạn hãy nhớ là, subform được chứa trong 1 Container (khung chứa), vậy nếu muốn tham chiếu đến truy vấn dữ liệu cho subform bạn phải tham chiếu đến frame chứa subform trước, chẳng hạn khung chứa có tên là frminvoicesub. Cú pháp như sau.
[frminvoicesub].Form.RecordSource
Vậy gọi hàm xuất trong 2 trường hợp là
1. Call Export2Excel("",Listbox1.RowSource,"ExcelFileName1.xls")
2. Call Export2Excel("",[frminvoicesub].Form.RecordSource,"ExcelFileName1.xls")
Bạn hiểu ý tôi rồi đúng không.
Xin tự nhiên hỏi tiếp nhé!
Đặng Đình Ngọc
paulsteigel > 28-06-13, 09:56 AM
Private Function BuildSQL(txtInput As String, txtFieldList As String, txtTableName As String) As String
'TYPE: Xay dung chuoi truy van dang Fuzzy dung toan tu OR khong su dung AND
'IN: Chuoi tham so tim kiem
'OUT: Chuoi truy van
' Chia nho tham so tim kiem thanh chuoi dieu kien
Dim inVar As Variant, fldName As Variant, fldType As Variant
Dim i As Long, j As Long, tmpVar As String, SqlTxt As String
' tach chuoi thanh mang
inVar = Split(txtInput, txtDelm)
fldName = Split(txtFieldList, ",")
' Xay dung cau truy van
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) & "*' "
Next
fldName(j) = tmpVar & " IN (Select " & tmpVar & " From nxb Where " & Mid(fldName(j), 4) & ")"
SqlTxt = SqlTxt & "OR " & fldName(j)
Next
' Xay dung chuoi truy van cuoi cung bang cach them ten bang
SqlTxt = "SELECT " & txtFieldList & " FROM " & txtTableName & " Where " & Mid(SqlTxt, 4) & ";"
BuildSQL = SqlTxt
End Function
Xuân Thanh > 28-06-13, 10:09 AM
Private Sub cmdExport_Click()
Call Export2Excel("", Me.lstResult.RowSource, "ExcelFileName1.xls")
End Sub
dinh_trong_hoa > 28-06-13, 10:42 AM
(28-06-13, 09:56 AM)paulsteigel Đã viết: Rất vui là bạn đã có thể ứng dụng được phần nào đó, hãy xem file ví dụ này!
http://www.sfdp.net/tai-lieu-khac/thuthu...m/qltv.zip
Xem form frmSubFormSearch nhé... - nhấn nút EXP để xuất!
Tôi đã sửa lại chút ít hàm Export2Excel để gọi Excel mở file đó ra luôn;
Bạn xem qua cú pháp trong form FrmSUbformSearch nhé!
paulsteigel > 28-06-13, 10:55 AM
(28-06-13, 10:42 AM)dinh_trong_hoa Đã viết:Bạn nên gửi file đây! mình sửa hộ - vì không biết cái bạn đang làm nên nói sẽ rất khó.(28-06-13, 09:56 AM)paulsteigel Đã viết: Rất vui là bạn đã có thể ứng dụng được phần nào đó, hãy xem file ví dụ này!
http://www.sfdp.net/tai-lieu-khac/thuthu...m/qltv.zip
Xem form frmSubFormSearch nhé... - nhấn nút EXP để xuất!
Tôi đã sửa lại chút ít hàm Export2Excel để gọi Excel mở file đó ra luôn;
Bạn xem qua cú pháp trong form FrmSUbformSearch nhé!
Bạn ơi !
File của mình dùng listbox thì chỉnh lại chổ nào,mình dùng listbox +sự kiện click với ý định là khi truy vẫn thấy dữ liệu nhập sai thì click vào row đó, nó liên kết với master form và mình sửa lại, còn dùng quenry thì không có sự kiện click
thank
dinh_trong_hoa > 28-06-13, 11:33 AM
(28-06-13, 10:55 AM)paulsteigel Đã viết:(28-06-13, 10:42 AM)dinh_trong_hoa Đã viết:Bạn nên gửi file đây! mình sửa hộ - vì không biết cái bạn đang làm nên nói sẽ rất khó.(28-06-13, 09:56 AM)paulsteigel Đã viết: Rất vui là bạn đã có thể ứng dụng được phần nào đó, hãy xem file ví dụ này!
http://www.sfdp.net/tai-lieu-khac/thuthu...m/qltv.zip
Xem form frmSubFormSearch nhé... - nhấn nút EXP để xuất!
Tôi đã sửa lại chút ít hàm Export2Excel để gọi Excel mở file đó ra luôn;
Bạn xem qua cú pháp trong form FrmSUbformSearch nhé!
Bạn ơi !
File của mình dùng listbox thì chỉnh lại chổ nào,mình dùng listbox +sự kiện click với ý định là khi truy vẫn thấy dữ liệu nhập sai thì click vào row đó, nó liên kết với master form và mình sửa lại, còn dùng quenry thì không có sự kiện click
thank
gửi vô ngocdd@sfdp.net