Để làm được báo cáo một cách linh hoạt thì phải tổ chức lại CSDL. CSDL của bạn mình đưa cả 12 tháng về một sheet với các cột:
MA | NF | ĐD | SĐ | THANG/NGAY|
Để làm báo cáo động, tùy chỉnh từ tháng x đến tháng y mình pải viết một hàm GetColumnByMonth trong VBA để tự tạo câu khai báo các cột dữ liệu cần lấy ra. Nếu bạn làm báo cáo thật trên file Excel khác bạn phải copy mã nguồn của hàm và dán vào module trong VBA của file đó.
[GPECODE=vb]Function GetColumnByMonth(ByVal iFromMonth As Integer, ByVal iToMonth As Integer, Optional ByVal bSumColumn As Boolean = True) As String
Dim I As Integer
Dim s As String
For I = iFromMonth To iToMonth
If I <> iFromMonth Then s = s & "," & vbCrLf
s = s & "SUM(IIF(DATA.THANG=" & I & ",DATA.NF,0)), " & _
"SUM(IIF(DATA.THANG=" & I & ",DATA.[DD],0))," & _
"SUM(IIf(Data.THANG = " & I & ", Data.[SD], 0))"
Next I
If bSumColumn Then
If s <> "" Then s = s & "," & vbCrLf
s = s & "SUM(IIF(DATA.THANG>=" & iFromMonth & " AND DATA.THANG<=" & iToMonth & ",DATA.NF,0)), " & _
"SUM(IIF(DATA.THANG>=" & iFromMonth & " AND DATA.THANG<=" & iToMonth & ",DATA.[DD],0)), " & _
"SUM(IIF(DATA.THANG>=" & iFromMonth & " AND DATA.THANG<=" & iToMonth & ",DATA.[SD],0))"
End If
GetColumnByMonth = s
End Function[/GPECODE]
Tại ô C5 ( nơi khai báo SQL đặt công thức:
Mã:
="SELECT RECNO(), DATA.MA," &
[B]GetColumnByMonth[/B](D3,F3) &
"FROM DATA
INNER JOIN DMHH ON DATA.MA=DMHH.MA
WHERE DATA.THANG>=CELL(D3) AND DATA.THANG<=CELL(F3)
GROUP BY DATA.MA"
Ô D3, F3 tương ứng với từ tháng x đến tháng y
Tại ô B8 (ô đầu tiên của báo cáo), đặ công thức:
=bs_sql(C5,"INSERT=YES;HR=NO")
Bây giờ bạn có được báo cáo tùy chỉnh khoảng thời gian theo tháng. Hiện tại tôi để khoảng thời gian là 3 tháng một, bạn có thể tùy chỉnh mốc đầu tiên là bao nhiêu thì mốc hai sẽ tăng +2. Nếu bạn muốn khoảng thời gian lớn hơn thì copy sheet "THBC Thang" thành sheet khác vừa tự chỉnh sửa.
Nếu Windows của bạn là 32-bit thì Office bắt buộc là 32-bit.
Nếu Windows của bạn là 64-bit thì Office có thể là 32-bit hoặc 64-bit.
Trường hợp bị như trên là do bạn cài A-Tools sai phiên bản giữa 32 và 64-bit.
Office 32-bit thì cài A-Tools 32-bit, Office 64-bit thì cài A-Tools 64-bit. Chọn bộ A-Tools nào để cài đặt không phụ thuộc vào Windows.
Nếu Windows của bạn là 32-bit thì Office bắt buộc là 32-bit.
Nếu Windows của bạn là 64-bit thì Office có thể là 32-bit hoặc 64-bit.
Trường hợp bị như trên là do bạn cài A-Tools sai phiên bản giữa 32 và 64-bit.
Office 32-bit thì cài A-Tools 32-bit, Office 64-bit thì cài A-Tools 64-bit. Chọn bộ A-Tools nào để cài đặt không phụ thuộc vào Windows.
Có hai vấn đề khó thực hiện anh a:
+ Thư viện dll của A-Tools là hơn 2 MB, mỗi nền tảng Office 32, 64-bit đều phải có dll riêng. Nên nếu làm bộ cài tổng hợp thì dung lượng sẽ tăng lên.
+ Bộ cài đặt là một file chạy, nó cũng bị phân biệt 32 hay 64 bit. Nếu tạo bộ cài dạng 32 bit thì có thể chạy trong Windows 64-bit. Một điều không thể thực hiện là ứng dụng 32-bit không thể truy cập vào ứng dụng hoặc thư viện 64-bit.
Anh cho hỏi, em có nhiều Sheet cấu trúc giống hệt nhau, mỗi Sheet là 1 vùng Data (em tập hợp theo từng địa phương vào 1 sheet)
Làm cách nào em có thể lọc được dữ liệu gộp của các Data này ạ. Em dùng BS_SQL("SELECT * FROM Data1, Data2... là nó dàn hàng ngang hết tiêu đề các Data ra chứ không nối dọc xuống được.
Anh cho hỏi, em có nhiều Sheet cấu trúc giống hệt nhau, mỗi Sheet là 1 vùng Data (em tập hợp theo từng địa phương vào 1 sheet)
Làm cách nào em có thể lọc được dữ liệu gộp của các Data này ạ. Em dùng BS_SQL("SELECT * FROM Data1, Data2... là nó dàn hàng ngang hết tiêu đề các Data ra chứ không nối dọc xuống được.
Nếu theo cấu trúc dữ liệu như vậy, gỉa xử bạn có 3 vùng dữ liệu DATA1,DATA2,DATA3 có cấu trúc giống nhau thì làm như sau:
=bs_sql("SELECT * FROM DATA1
UNION ALL
SELECT * FROM DATA2
UNION ALL
SELECT * FROM DATA3
")
Theo tôi bạn nên tổ chức lại CSDL, chỉ cần một DATA và thêm cột "MADIAPHUONG", đến dòng dữ liệu của địa phương nào thì mình điền mã địa phương tương ứng. Nếu đã tiết kế như vậy thì việc lọc dữ liệu sau này sẽ rất linh động.
Ví dụ: lấy dữ liệu của tất cả
=bs_sql("SELECT * FROM DATA")
Ví dụ: lấy dữ liệu của một địa phương nào đó nằm ở ô A1
=bs_sql("SELECT * FROM DATA WHERE MADIAPHUONG=RANGE(A1)")
hoặc
=bs_sql("SELECT * FROM DATA WHERE MADIAPHUONG=CELL(A1)")
Vì nó là dữ liệu theo dõi chung nên em không gộp được như mong muốn
Em đã giải quyết được bằng cấu trúc này
SELECT * FROM (
SELECT ... FROM ... WHERE ...
UNION ALL
SELECT ... FROM ... WHERE ...
) as
Anh Tuân ơi!
Em có 1 bảng dữ liệu để Tổng hợp quỹ lương của từng xí nghiệp. Nhưng em không biết sắp xếp dữ liệu như thế nào cho hợp lý và linh động hơn.
1 - Nay em nhờ các anh hướng dẫn giúp em sắp xếp lại cơ sở dữ liệu.
2 - Hướng dẫn Tổng hợp báo cáo số liệu từ tháng ** cho đến tháng *** bằng addin Atool.
Trân trọng cảm ơn!
Add-in A-Tools 2013 v6.5.0.4 - Truy vấn, Chia sẻ và quản trị Excel qua mạng
Xin gửi các thành viên phiên bản mới Add-in A-Tools 2014 v6.5.0.4: 11-01-2014
Các tính năng được nâng cấp và thêm mới:
v6.5.0.4: 11-01-2014
+ Sửa một số lỗi nhỏ
+ Thêm: Khi đang chạy A-Excel hàm BS_SQL chạy đầy đủ tính năng dù máy tính của người dùng có thể chưa đăng ký bản quyền.
bạn ơi cho mình hỏi, bạn nói bản free thì client kết nối tới server chỉ trong 30 phút, vậy sau 30 phút thì client ngắt kết nối rồi kết nối lại thì lại tính 30 phút từ đầu đúng ko bạn?