Nhờ các anh / chị giúp em viết code tổng hợp số liệu dựa theo mã số. Thank!
Làm thô cho bạn 4 tháng theo mẫu, các tháng còn lại bạn tự thêm vào nhé.Tất cả là 12 tháng luôn đó anh. Mỗi tháng em thêm 1 sheet vào đúng với tên sheets theo mấu thì nó sẽ tổng hợp sang sheets Tổng hợp.
Sub TongHop_HLMT()
Set adoConn = CreateObject("ADODB.Connection")
Set adoRS = CreateObject("ADODB.Recordset")
With adoConn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=No;"";"
.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "select F1, F3, sum(f7),sum(F8),sum(f9) from " & _
"(SELECT * FROM [T01-2012$A4:I300] " & _
"Union ALL " & _
"SELECT * FROM [T02-2012$A4:I300] " & _
"Union ALL " & _
"SELECT * FROM [T03-2012$A4:I300] " & _
"Union ALL " & _
"SELECT * FROM [T04-2012$A4:I300]) " & _
"group by F1, F3 " & _
"having sum(F7)>0"
End With
With Sheets("TONG HOP")
.[A7:E65000].ClearContents
.[A7].CopyFromRecordset adoRS
End With
adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing
End Sub
Em cảm ơn anh rất nhiều nhưng có lẽ anh đã hiểu nhầm ý của em rôi,
Ý của em là muốn dựa vào mã số sẽ tổng hợp sang sheet Tổng hợp theo mẩu của em. như file anh đã làm rất khó so sánh và kiểm tra từng tháng khi cần,
Sub UnionAndGroup_HLMT()
Set adoConn = CreateObject("ADODB.Connection")
Set adoRS = CreateObject("ADODB.Recordset")
With adoConn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=No;"";"
.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "select f1,'',f3,f4,f5,f6,sum(f7),sum(F8),sum(f9),sum(f10),sum(f11),sum(f12),sum(f13),sum(f14)," & _
"sum(f15),sum(f16),sum(f17),sum(f18) from " & _
"(SELECT f1,f2,f3,f4,f5,f6,f7,0 as f8, 0 as f9,0 as f10,f8 as f11,0 as f12,0 as f13,0 as f14," & _
"f9 as f15,0 as f16,0 as f17,0 as f18 FROM [T01-2012$A4:I300] " & _
"Union ALL " & _
"SELECT f1,f2,f3,f4,f5,f6,0,f7,0,0,0,f8,0,0,0,f9,0,0 FROM [T02-2012$A4:I300] " & _
"Union ALL " & _
"SELECT f1,f2,f3,f4,f5,f6,0,0,f7,0,0,0,f8,0,0,0,f9,0 FROM [T03-2012$A4:I300] " & _
"Union ALL " & _
"SELECT f1,f2,f3,f4,f5,f6,0,0,0,f7,0,0,0,f8,0,0,0,f9 FROM [T04-2012$A4:I300])" & _
"group by f1,f3,f4,f5,f6 " & _
"having f1 is not null"
End With
With Sheets("TONG HOP")
.[A7:R65000].ClearContents
.[A7].CopyFromRecordset adoRS
End With
adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing
End Sub
Cho em hỏi nếu làm cho 12 tháng thì làm sao xác định được các f1, f3, f4 , ..... cho nhanh nhất. Thú thiệt là em mới tập hoc VBA thôi.
Sub UnionAndGroup12_HLMT()
Set adoConn = CreateObject("ADODB.Connection")
Set adoRS = CreateObject("ADODB.Recordset")
With adoConn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=No;"";"
.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "select f1,'',f3,f4,f5,f6,sum(t1),sum(t2),sum(t3),sum(t4),sum(t5),sum(t6),sum(t7),sum(t8),sum(t9),sum(t10),sum(t11),sum(t12), " & _
"sum(tn1),sum(tn2),sum(tn3),sum(tn4),sum(tn5),sum(tn6),sum(tn7),sum(tn8),sum(tn9),sum(tn10),sum(tn11),sum(tn12)," & _
"sum(pc1),sum(pc2),sum(pc3),sum(pc4),sum(pc5),sum(pc6),sum(pc7),sum(pc8),sum(pc9),sum(pc10),sum(pc11),sum(pc12) from " & _
"(SELECT f1,f2,f3,f4,f5,f6,f7 as t1, 0 as t2,0 as t3,0 as t4,0 as t5,0 as t6,0 as t7,0 as t8,0 as t9,0 as t10,0 as t11,0 as t12, f8 as tn1, " & _
"0 as tn2,0 as tn3,0 as tn4,0 as tn5,0 as tn6,0 as tn7,0 as tn8,0 as tn9,0 as tn10,0 as tn11,0 as tn12, " & _
"f9 as pc1, 0 as pc2,0 as pc3,0 as pc4,0 as pc5,0 as pc6,0 as pc7,0 as pc8,0 as pc9,0 as pc10,0 as pc11,0 as pc12 FROM [T01-2012$A4:I300] Union ALL " & _
"SELECT f1,f2,f3,f4,f5,f6,0,f7 as t2,0,0,0,0,0,0,0,0,0,0, 0,f8 as tn2,0,0,0,0,0,0,0,0,0,0, 0,f8 as pc2,0,0,0,0,0,0,0,0,0,0 FROM [T02-2012$A4:I300] Union ALL " & _
"SELECT f1,f2,f3,f4,f5,f6,0,0,f7 as t3,0,0,0,0,0,0,0,0,0, 0,0,f8 as tn3,0,0,0,0,0,0,0,0,0, 0,0,f8 as pc3,0,0,0,0,0,0,0,0,0 FROM [T03-2012$A4:I300] Union ALL " & _
"SELECT f1,f2,f3,f4,f5,f6,0,0,0,f7 as t4,0,0,0,0,0,0,0,0, 0,0,0,f8 as tn4,0,0,0,0,0,0,0,0, 0,0,0,f8 as pc4,0,0,0,0,0,0,0,0 FROM [T04-2012$A4:I300] Union ALL " & _
"SELECT f1,f2,f3,f4,f5,f6,0,0,0,0,f7 as t5,0,0,0,0,0,0,0, 0,0,0,0,f8 as tn5,0,0,0,0,0,0,0, 0,0,0,0,f8 as pc5,0,0,0,0,0,0,0 FROM [T05-2012$A4:I300] Union ALL " & _
"SELECT f1,f2,f3,f4,f5,f6,0,0,0,0,0,f7 as t6,0,0,0,0,0,0, 0,0,0,0,0,f8 as tn6,0,0,0,0,0,0, 0,0,0,0,0,f8 as pc6,0,0,0,0,0,0 FROM [T06-2012$A4:I300] Union ALL " & _
"SELECT f1,f2,f3,f4,f5,f6,0,0,0,0,0,0,f7 as t7,0,0,0,0,0, 0,0,0,0,0,0,f8 as tn7,0,0,0,0,0, 0,0,0,0,0,0,f8 as pc7,0,0,0,0,0 FROM [T07-2012$A4:I300] Union ALL " & _
"SELECT f1,f2,f3,f4,f5,f6,0,0,0,0,0,0,0,f7 as t8,0,0,0,0, 0,0,0,0,0,0,0,f8 as tn8,0,0,0,0, 0,0,0,0,0,0,0,f8 as pc8,0,0,0,0 FROM [T08-2012$A4:I300] Union ALL " & _
"SELECT f1,f2,f3,f4,f5,f6,0,0,0,0,0,0,0,0,f7 as t9,0,0,0, 0,0,0,0,0,0,0,0,f8 as tn9,0,0,0, 0,0,0,0,0,0,0,0,f8 as pc9,0,0,0 FROM [T09-2012$A4:I300] Union ALL " & _
"SELECT f1,f2,f3,f4,f5,f6,0,0,0,0,0,0,0,0,0,f7 as t10,0,0, 0,0,0,0,0,0,0,0,0,f8 as tn10,0,0, 0,0,0,0,0,0,0,0,0,f8 as pc10,0,0 FROM [T10-2012$A4:I300] Union ALL " & _
"SELECT f1,f2,f3,f4,f5,f6,0,0,0,0,0,0,0,0,0,0,f7 as t11,0, 0,0,0,0,0,0,0,0,0,0,f8 as tn11,0, 0,0,0,0,0,0,0,0,0,0,f8 as pc11,0 FROM [T11-2012$A4:I300] Union ALL " & _
"SELECT f1,f2,f3,f4,f5,f6,0,0,0,0,0,0,0,0,0,0,0,f7 as t12, 0,0,0,0,0,0,0,0,0,0,0,f8 as tn12, 0,0,0,0,0,0,0,0,0,0,0,f8 as pc12 FROM [T12-2012$A4:I300])" & _
"group by f1,f3,f4,f5,f6 " & _
"having f1 is not null"
End With
With Sheets("TONG HOP")
.[A7:AP65000].ClearContents
.[A7].CopyFromRecordset adoRS
End With
adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing
End Sub
Do dữ liệu mẫu của bạn không chính xác nên tôi làm như thế, thực ra code trên nó thêm điều kiện cộng gộp là cột ghi chú và diễn giải. Còn thể hiện cột phòng ban thì mình có thể hiện luôn cho bạn rồi. Còn muốn sắp xếp theo cột phòng ban thì thêm câu 'order by f6' nữa là xong.Em đã đưa dữ liệu vào nhưng khi Tông hợp thì 1 mã số nó lại ra tới 2. 3 dòng. Anh có thể giúp em chỉnh lại được ko. Với lại khi tổng hợp thì tổng hợp theo từng phòng ban (đừng có sắp xếp theo cột mã số). Bên bảng tổng hợp vẫn thể hiện phòng ban. Mong anh giúp.
Sub UnionAndGroup12_HLMT()
Set adoConn = CreateObject("ADODB.Connection")
Set adoRS = CreateObject("ADODB.Recordset")
With adoConn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=No;"";"
.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "select f1,'',f3,'','',f6,sum(t1),sum(t2),sum(t3),sum(t4),sum(t5),sum(t6),sum(t7),sum(t8),sum(t9),sum(t10),sum(t11),sum(t12), " & _
"sum(tn1),sum(tn2),sum(tn3),sum(tn4),sum(tn5),sum(tn6),sum(tn7),sum(tn8),sum(tn9),sum(tn10),sum(tn11),sum(tn12)," & _
"sum(pc1),sum(pc2),sum(pc3),sum(pc4),sum(pc5),sum(pc6),sum(pc7),sum(pc8),sum(pc9),sum(pc10),sum(pc11),sum(pc12) from " & _
"(SELECT f1,'',f3,'','',f6,f7 as t1, 0 as t2,0 as t3,0 as t4,0 as t5,0 as t6,0 as t7,0 as t8,0 as t9,0 as t10,0 as t11,0 as t12, f8 as tn1, " & _
"0 as tn2,0 as tn3,0 as tn4,0 as tn5,0 as tn6,0 as tn7,0 as tn8,0 as tn9,0 as tn10,0 as tn11,0 as tn12, " & _
"f9 as pc1, 0 as pc2,0 as pc3,0 as pc4,0 as pc5,0 as pc6,0 as pc7,0 as pc8,0 as pc9,0 as pc10,0 as pc11,0 as pc12 FROM [T01-2012$A4:I300] Union ALL " & _
"SELECT f1,'',f3,'','',f6,0,f7 as t2,0,0,0,0,0,0,0,0,0,0, 0,f8 as tn2,0,0,0,0,0,0,0,0,0,0, 0,f8 as pc2,0,0,0,0,0,0,0,0,0,0 FROM [T02-2012$A4:I300] Union ALL " & _
"SELECT f1,'',f3,'','',f6,0,0,f7 as t3,0,0,0,0,0,0,0,0,0, 0,0,f8 as tn3,0,0,0,0,0,0,0,0,0, 0,0,f8 as pc3,0,0,0,0,0,0,0,0,0 FROM [T03-2012$A4:I300] Union ALL " & _
"SELECT f1,'',f3,'','',f6,0,0,0,f7 as t4,0,0,0,0,0,0,0,0, 0,0,0,f8 as tn4,0,0,0,0,0,0,0,0, 0,0,0,f8 as pc4,0,0,0,0,0,0,0,0 FROM [T04-2012$A4:I300] Union ALL " & _
"SELECT f1,'',f3,'','',f6,0,0,0,0,f7 as t5,0,0,0,0,0,0,0, 0,0,0,0,f8 as tn5,0,0,0,0,0,0,0, 0,0,0,0,f8 as pc5,0,0,0,0,0,0,0 FROM [T05-2012$A4:I300] Union ALL " & _
"SELECT f1,'',f3,'','',f6,0,0,0,0,0,f7 as t6,0,0,0,0,0,0, 0,0,0,0,0,f8 as tn6,0,0,0,0,0,0, 0,0,0,0,0,f8 as pc6,0,0,0,0,0,0 FROM [T06-2012$A4:I300] Union ALL " & _
"SELECT f1,'',f3,'','',f6,0,0,0,0,0,0,f7 as t7,0,0,0,0,0, 0,0,0,0,0,0,f8 as tn7,0,0,0,0,0, 0,0,0,0,0,0,f8 as pc7,0,0,0,0,0 FROM [T07-2012$A4:I300] Union ALL " & _
"SELECT f1,'',f3,'','',f6,0,0,0,0,0,0,0,f7 as t8,0,0,0,0, 0,0,0,0,0,0,0,f8 as tn8,0,0,0,0, 0,0,0,0,0,0,0,f8 as pc8,0,0,0,0 FROM [T08-2012$A4:I300] Union ALL " & _
"SELECT f1,'',f3,'','',f6,0,0,0,0,0,0,0,0,f7 as t9,0,0,0, 0,0,0,0,0,0,0,0,f8 as tn9,0,0,0, 0,0,0,0,0,0,0,0,f8 as pc9,0,0,0 FROM [T09-2012$A4:I300] Union ALL " & _
"SELECT f1,'',f3,'','',f6,0,0,0,0,0,0,0,0,0,f7 as t10,0,0, 0,0,0,0,0,0,0,0,0,f8 as tn10,0,0, 0,0,0,0,0,0,0,0,0,f8 as pc10,0,0 FROM [T10-2012$A4:I300] Union ALL " & _
"SELECT f1,'',f3,'','',f6,0,0,0,0,0,0,0,0,0,0,f7 as t11,0, 0,0,0,0,0,0,0,0,0,0,f8 as tn11,0, 0,0,0,0,0,0,0,0,0,0,f8 as pc11,0 FROM [T11-2012$A4:I300] Union ALL " & _
"SELECT f1,'',f3,'','',f6,0,0,0,0,0,0,0,0,0,0,0,f7 as t12, 0,0,0,0,0,0,0,0,0,0,0,f8 as tn12, 0,0,0,0,0,0,0,0,0,0,0,f8 as pc12 FROM [T12-2012$A4:I300])" & _
"group by f1,f3,f6 " & _
"having f1 is not null " & _
"order by f6"
End With
With Sheets("TONG HOP")
.[A7:AP65000].ClearContents
.[A7].CopyFromRecordset adoRS
End With
adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing
End Sub
Em có làm phiên anh ko. Nếu không thì cho em hỏi thêm, Nếu muốn tổng hợp theo cột F1 (Mã số ) thì sao vậy anh. Cám ơn anh
Thất nghiệp nên làm đại cho vui:Vì mỗi người sẽ có 1 mã số riêng, nên không thể trung nhau được. CHỉ cần cộng gộp lại cho 1 mã số là Ok. VD trường hợp của Tạ Thanh Thúy làm 3 bộ phận thì mình sẽ gộp về 1 dòng. Nhưng khi mình bấm nút Tổng hợp, bên Bảng tổng hợp nó sẽ định dạng giống như bảng chi tiêt từng tháng. Vẫn thể hiện tiêu đề từng phòng ban (PHÒNG TỔ CHỨC, TỔ THỐNG KÊ, ...) bên bảng chi tiết từng tháng người nào thuộc Tổ, BP nào thì bên bảng Tổng hợp vẫn như vậy. Trường hợp làm 2, 3 bộ phận thì gộp lại ở Bộ phận nào cũng được
Thất nghiệp nên làm đại cho vui:
1/ Do không có danh sách chung đầy đủ tất cả nhân viên trong các phòng ban bộ phận nên đề nghị thêm sheet DS_CHUNG.
Yêu cầu: Sheet DS_CHUNG này phải có đầy đủ mã số + Tên NV trong các sheet tháng, Thêm bớt gì trong sheet này cũng được.
2/ Từng tháng tìm mã + Tên NV từ ds chung này mà lấy số liệu vào các cột.
Các sheet Tháng không có Mã+tên trong DS chung cũng được (nghỉ làm), nhưng nếu thêm người mới thì phải thêm vào DS_CHUNG ở bộ phận nào đó.
+ 1-2-3-4 không có 1 "miếng" dữ liệu nào để kiểm tra kết quả. Bạn tự kiểm tra đi.Cám ơn các anh / chị đã giúp em viết code tổng hợp theo mã số. Sau 1 thời gian sử dụng thấy rất là tiện lợi. Nay em muốn bổ sung thêm 1 số yêu cầu như sau nhờ các anh chị giúp em với.
Hiện tại chỉ tổng hợp 3 thông tin như: Ngày công, Thu nhập, PC Thâm niên của 12 tháng trong năm.
1-Nay em muốn tổng hợp thêm Thuế TNCN khấu trừ từng tháng
(Tổng hợp theo từng tháng giống với Ngày công hay Thu nhập,..)
2-Mã số thuế
3-Số CMND
Riêng muc Mã số thuế và số CMND luôn lấy thông tin ở tháng mới nhất
4-Em muốn sau này khi em cần tổng hợp 1 khoản nào cần luỹ kết thì em chỉ cần điền tên cột bên sheet chi tiết tùng tháng và bên sheet tổng hợp em cũng đạt tên đúng như vậy thì em bấm Tổng hợp thì nó cũng sẽ tổng hợp luôn.
5- Với lại giúp em tạo listview cho sheet tổng hợp để lọc theo điều kiên như: MSCN, họ tên, Chức danh, ngày công, thu nhập, thâm niên, số CMND, Mã số thuế, ...
Trân trọng cảm ơn các anh / chi !
Cám ơn anh !+ 1-2-3-4 không có 1 "miếng" dữ liệu nào để kiểm tra kết quả. Bạn tự kiểm tra đi.
+ 5: Muốn lọc gì nhiều quá vậy? Auto Filter cho rồi.
+ Chỉ lấy DS nhân viên có trong sheet DS Chung thôi.
+ Code nhập chung vào nút Gộp cũ thành nút GPE
Với lại anh cho em hỏi có soft nào để mình so sánh giữa code cũ và mới để biết chỗ thay đổi trong code mới