Làm báo cáo bằng Add-in A-Tools
Anh cho em hỏi, cách đánh số TT có điều kiện trong Atools
Trân trọng!
Trong Add-in A-Tools cho phép chúng ta lập trình VBA hay nói cách khác viết macro để chạy cùng hàm BS_SQL. Mục đích lập trình VBA cùng các sự kiện chạy BS_SQL để ta có thể thay đổi giá trị của phần tử mảng hoặc định dạng trước hoặc sau khi dữ liệu được đổ vào bảng tính.
Bạn mở file tại đường dẫn dưới đây để them cấu trúc các dạng thủ tục sự kiện
C:\A-Tools\HELP & DEMOS\A-Tools VBA Programming\BS_SQL OnEvents.txt
Đọc tại liệu "
A-Tools_Query_Report_Help.pdf" trang 45.
Cho phép chạy một macro trước khi cập nhật dữ liệu vào bảng tính.
Khai báo trong tham số OPTIONS của hàm BS_SQL: OnBeforeUpdate=DoBeforeUpdate
=BS_SQL(“chuỗi khai báo SQL”, “…;OnBeforeUpdate = DoBeforeUpdate)
Trong môi trường lập trình (VBE), viết thủ tục "DoBeforeUpdate" trong một module theo cấu trúc sau:
[GPECODE=vb]Sub DoBeforeUpdate(ByVal OldDataTable As Range, ByVal NewDataTable As Range, ByVal DataArray)
'Có thể đổi tên thủ tục
‘+ OldDataTable: là đối tượng quản lý vùng dữ liệu cũ (trước khi hàm BS_SQL chạy)
‘+ NewDataTable: là đối tượng quản lý vùng dữ liệu mới (sau khi hàm BS_SQL chạy)
'+ DataArray: la mảng 2 chiều. Các phần tử dòng và cột nhận giá trị từ 0
'Giá trị tại dòng 1 cột 2 của mảng là DataArray(1,2) , trên bảng tính Excel thì là giá trị của dòng 2 cột 3.
End Sub[/GPECODE]
Trong ví dụ của bạn tôi tạo một module sau đó làm các việc sau:
Dán đoạn khai báo hai hàm API của A-Tools, mục đích để thay đổi giá trị của phần tử mảng kết quả trả về.
[GPECODE=vb]Option Explicit
#If VBA7 Then
Declare PtrSafe Function GetFieldNames Lib "AddinATools.dll" (ByRef FieldNames) As Long
Declare PtrSafe Function SetDataValue Lib "AddinATools.dll" (ByVal Row As Long, ByVal Column As Long, ByVal Value As Variant) As Long
#Else
Declare Function GetFieldNames Lib "AddinATools.dll" (ByRef FieldNames) As Long
Declare Function SetDataValue Lib "AddinATools.dll" (ByVal Row As Long, ByVal Column As Long, ByVal Value As Variant) As Long
#End If[/GPECODE]
Viết macro "DoBeforeUpdate" dưới đây để thay đổi STT của bảng kết quả, STT chỉ tính khi giá trị cột "Chức vụ" khác trống.
[GPECODE=vb]Sub DoBeforeUpdate(ByVal OldDataTable As Range, ByVal NewDataTable As Range, ByVal DataArray)
'DataArray: la mang 2 chieu. Cac phan tu dong va cot nhat gia tri tu 0
'Gia tri tai dong 1 cot 2 = DataArray(1,2) , tren bang tinh thi la gia tri cua dong 2 cot 3
Const ColumnIndex = 0 'Cot STT (A)
Const ColumnCV = 6 'Cot Chuc Vu (G)
Dim Row, Index As Long
'MsgBox "OldDataTable:" & OldDataTable.Address & Chr(13) & "NewDataTable:" & NewDataTable.Address, , "OnBeforeUpdate"
For Row = LBound(DataArray, 1) To UBound(DataArray, 1)
If DataArray(Row, ColumnCV) <> "" Then
Index = Index + 1
SetDataValue Row, ColumnIndex, Index 'Ghi STT vao mang
Else
SetDataValue Row, ColumnIndex, ""
End If
Next Row
End Sub
[/GPECODE]
Công thức trong bảng tính Excel
Cũ là:
=bs_sql('In cong SP'!$A$10,"HR=NO; INSERT=YES")
Sửa thành:
=bs_sql('In cong SP'!$A$10,"HR=NO; INSERT=YES;
OnBeforeUpdate=DoBeforeUpdate")
Với khả năng cho phép viết macro (VBA) chạy cùng thì Add-in A-Tools xử lý để làm báo cáo rất linh động. Đó là sự phối hợp sức mạng của 3 thứ: Add-in A-Tools + SQL + VBA.
Bạn tải file tôi làm và xem macro tôi viết sẽ hiểu ngay.