Nhờ giúp về lọc dự liệu trong excel

Liên hệ QC

hoangruazbin

Thành viên mới
Tham gia
27/6/19
Bài viết
32
Được thích
3
Chào các Anh Chị trong diễn đàn,
Em có bảng dữ liệu cần lọc từ sheet "data" sang sheet "baocao" theo file đính kèm,
Rất mong các Anh Chị giúp đỡ, em cảm ơn Anh Chị.
 

File đính kèm

  • GPE.xlsx
    14.5 KB · Đọc: 20
Giải pháp
Là do em xoá chưa hết thôi anh, khi làm thủ công em để dự phòng khi có phát sinh bổ sung các trường hợp khác trong Trình độ đào tạo.
Lần đầu tiên phân tích dữ liệu từ một mảng quá phê như vậy, đã thiệt đó!

1629295049360.png

Mã:
Sub PhanTichDuLieu()
    Dim blnExtra As Boolean
    Dim arrData, arrBaoCao, arrTemp(1 To 1, 2 To 34)
    Dim shData As Worksheet, shBaoCao  As Worksheet
    Dim c As Long, e As Long, h As Long, i As Long, j As Long, k As Long, n As Long, r As Long, t As Long, u As Long
    Set shData = Sheets("data")
    Set shBaoCao = Sheets("baocao")
    e = shData.Range("A" & shData.Rows.Count).End(xlUp).Row
    arrData = shData.Range("A6:I" & e).Value
    u = UBound(arrData)
    ReDim arrBaoCao(1 To u, 1 To 34)...
Chào các Anh Chị trong diễn đàn,
Em có bảng dữ liệu cần lọc từ sheet "data" sang sheet "baocao" theo file đính kèm,
Rất mong các Anh Chị giúp đỡ, em cảm ơn Anh Chị.
Cái gì để nhận biết "Gián tiếp" hay "Trực tiếp" hay "Khác" vậy bạn? Nếu như thợ cơ khí nhưng người ta cũng có bằng đại học thì sao?
 
Upvote 0
Cái gì để nhận biết "Gián tiếp" hay "Trực tiếp" hay "Khác" vậy bạn? Nếu như thợ cơ khí nhưng người ta cũng có bằng đại học thì sao?
Cảm ơn Anh!
Căn cứ cột "Bậc lương" để xác định, cụ thể bậc x/8 là "Gián tiếp", bậc x/7 là "Trực tiếp" và bậc x/4 là "Khác".
Thợ cơ khí có bằng đại học mà bậc lương là x/8 hoặc x/4 thì cũng không được tính là "Gián tiếp".
Rất mong Anh giúp!
 
Upvote 0
Cảm ơn Anh!
Căn cứ cột "Bậc lương" để xác định, cụ thể bậc x/8 là "Gián tiếp", bậc x/7 là "Trực tiếp" và bậc x/4 là "Khác".
Thợ cơ khí có bằng đại học mà bậc lương là x/8 hoặc x/4 thì cũng không được tính là "Gián tiếp".
Rất mong Anh giúp!
Chỉ có 4 phòng ban thôi phải không em?
 
Upvote 0
Cấu trúc giống như vậy hết? Dùng số La Mã để đánh số phòng ban?
Dạ Anh, cấu trúc vẫn vậy. Nếu code viết phụ thuộc vào việc đánh số các phòng ban bằng số La Mã thì em sẽ để số La Mã cũng không ảnh hưởng gì Anh ạ, em gửi lại file có thêm các Tổ trong các Bộ phận để Anh dễ hình dung hơn ạ.
 
Upvote 0
Dạ Anh, cấu trúc vẫn vậy. Nếu code viết phụ thuộc vào việc đánh số các phòng ban bằng số La Mã thì em sẽ để số La Mã cũng không ảnh hưởng gì Anh ạ, em gửi lại file có thêm các Tổ trong các Bộ phận để Anh dễ hình dung hơn ạ.
Nên chỉnh lại kiểu dữ liệu của cột 'Bật Lương' cho đồng nhất nha bạn.
 
Upvote 0
Dạ đúng Anh, trình độ đào tạo gần như cố định (trừ trường hợp có bằng cấp bổ sung), còn bậc thì thay đổi theo niên hạn Anh ạ.
Không, ý tôi nói là:
1. Trình độ đào tạo của bạn hiện tại trong báo biểu là 6 cái.

1629252370702.png

2. Bậc thợ là 9 bậc.

==> 1 & 2 có tăng thêm hay giảm bớt gì không?
 
Upvote 0
Upvote 0
Dạ, trình độ và bậc nhiều hơn Anh ạ, em ví dụ nên lược bớt đi.
Bạn tạo 1 Sheet danh mục như hình

1629267582341.png

Rồi chạy code sau nhé:
Mã:
Sub TongHop_HLMT()
    Dim strTuoi As String, strDKTinhTuoi As String, strSQL As String
    Dim i As Integer
    strTuoi = "Int(Format(Date(),'yyyy.MMdd')-Format(F5,'yyyy.MMdd'))"
    strDKTinhTuoi = "IIf(" & strTuoi & "<25,1,0)+IIf(" & strTuoi & ">=25 and " & strTuoi & "<=30,1,0)+IIf(" & strTuoi & ">30,1,0) as TongPhanLoaiTuoi,IIf(" & strTuoi & "<25,1,0) as [<25],IIf(" & strTuoi & ">=25 and " & strTuoi & "<=30,1,0) as [>=25 <=30],IIf(" & strTuoi & ">30,1,0) as [>30] "
    strSQL = "TRANSFORM Count([tbl].[TongGioiTinh]) " & _
                "SELECT [tbl].[BoPhan], Sum([tbl].TongGioiTinh) AS GioiTinh_Total, Sum([tbl].Nam) AS Nam, Sum([tbl].Nu) AS Nu, Sum([tbl].TongPhanLoaiTuoi) AS PhanLoaiTuoi_Total, Sum([tbl].[<25]) AS [<25_Total], Sum([tbl].[>=25 <=30]) AS [>=25 <=30_Total], Sum([tbl].[>30]) AS [>30_Total], Sum([tbl].TongGioiTinh) AS Tong " & _
                "FROM (Select a.F6 as BoPhan,1 as TongGioiTinh,IIF(a.F4='Nam',1,0) as Nam,IIF(a.F4='Nam',0,1) as Nu," & strDKTinhTuoi & ",b.F3 & chr(10) & chr(13) & b.F1 & chr(10) & chr(13) & b.F2 & chr(10) & chr(13)  & a.F7 & a.F8 as Nhom from [Data$] a Inner Join [DanhMuc$] b on a.F9=b.F1) [tbl] " & _
                "GROUP BY [tbl].[BoPhan] " & _
                "PIVOT [tbl].[Nhom];"

    With CreateObject("ADODB.Recordset")
        .Open (strSQL), "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=No;Imex=1"""
        Sheet4.Range("A2").CopyFromRecordset .DataSource
        For i = 0 To .Fields.Count - 1
            Sheet4.Cells(1, i + 1) = .Fields(i).Name
        Next
    End With
End Sub

Tôi chỉ có thể giúp bạn ra Kết Quả như sau:

1629267651791.png
 
Upvote 0
Cảm ơn Anh đã giúp đỡ!
Cơ bản là code đã lấy được các thông tin theo nhu cầu của em, tuy nhiên mong Anh giúp thêm như sau:
+ Phân tách rõ trình độ đào tạo và bậc lương (vì 2 nội dung này không phụ thuộc vào nhau)
+ Thêm dòng tổng cộng ở cuối
+Sắp xếp Cột A (cột bộ phận) theo thứ tự như bên data (tức là Bộ phận nào bên data xếp trước thì hiển thị trước)
Em gửi lại file có bổ sung cột Tuổi trong data để Anh dễ viết code hơn.
 

File đính kèm

  • GPE_bosung to111.xlsm
    30.3 KB · Đọc: 4
Upvote 0
Là do em xoá chưa hết thôi anh, khi làm thủ công em để dự phòng khi có phát sinh bổ sung các trường hợp khác trong Trình độ đào tạo.
Lần đầu tiên phân tích dữ liệu từ một mảng quá phê như vậy, đã thiệt đó!

1629295049360.png

Mã:
Sub PhanTichDuLieu()
    Dim blnExtra As Boolean
    Dim arrData, arrBaoCao, arrTemp(1 To 1, 2 To 34)
    Dim shData As Worksheet, shBaoCao  As Worksheet
    Dim c As Long, e As Long, h As Long, i As Long, j As Long, k As Long, n As Long, r As Long, t As Long, u As Long
    Set shData = Sheets("data")
    Set shBaoCao = Sheets("baocao")
    e = shData.Range("A" & shData.Rows.Count).End(xlUp).Row
    arrData = shData.Range("A6:I" & e).Value
    u = UBound(arrData)
    ReDim arrBaoCao(1 To u, 1 To 34)
    arrTemp(1, 2) = "C" & ChrW(7897) & "ng:"
    For r = 1 To u
        If arrData(r, 2) = "" Then
            c = c + 1
            If IsNumeric(Right(arrData(r, 1), 1)) Then
                arrBaoCao(c, 1) = "'+"
                If Not blnExtra Then
                    blnExtra = True
                    h = c - 1
                End If
            Else
                n = n + 1
                arrBaoCao(c, 1) = n
                blnExtra = False
            End If
            arrBaoCao(c, 2) = arrData(r, 3)
            GoTo NextStep
        End If
        arrBaoCao(c, 3) = arrBaoCao(c, 3) + 1
        arrTemp(1, 3) = arrTemp(1, 3) + 1
        If blnExtra Then arrBaoCao(h, 3) = arrBaoCao(h, 3) + 1
        If UCase(arrData(r, 4)) = "NAM" Then
            arrBaoCao(c, 4) = arrBaoCao(c, 4) + 1
            arrTemp(1, 4) = arrTemp(1, 4) + 1
            If blnExtra Then arrBaoCao(h, 4) = arrBaoCao(h, 4) + 1
        Else
            arrBaoCao(c, 5) = arrBaoCao(c, 5) + 1
            arrTemp(1, 5) = arrTemp(1, 5) + 1
            If blnExtra Then arrBaoCao(h, 5) = arrBaoCao(h, 5) + 1
        End If
        arrBaoCao(c, 6) = arrBaoCao(c, 3)
        arrBaoCao(c, 10) = arrBaoCao(c, 3)
        arrBaoCao(c, 21) = arrBaoCao(c, 3)
        arrTemp(1, 6) = arrTemp(1, 3)
        arrTemp(1, 10) = arrTemp(1, 3)
        arrTemp(1, 21) = arrTemp(1, 3)
        If blnExtra Then
            arrBaoCao(h, 6) = arrBaoCao(h, 3)
            arrBaoCao(h, 10) = arrBaoCao(h, 3)
            arrBaoCao(h, 21) = arrBaoCao(h, 3)
        End If
        t = Format(Date - arrData(r, 5), "y")
        If t < 25 Then
            arrBaoCao(c, 7) = arrBaoCao(c, 7) + 1
            arrTemp(1, 7) = arrTemp(1, 7) + 1
            If blnExtra Then arrBaoCao(h, 7) = arrBaoCao(h, 7) + 1
        ElseIf t > 30 Then
            arrBaoCao(c, 9) = arrBaoCao(c, 9) + 1
            arrTemp(1, 9) = arrTemp(1, 9) + 1
            If blnExtra Then arrBaoCao(h, 9) = arrBaoCao(h, 9) + 1
        Else
            arrBaoCao(c, 8) = arrBaoCao(c, 8) + 1
            arrTemp(1, 8) = arrTemp(1, 8) + 1
            If blnExtra Then arrBaoCao(h, 8) = arrBaoCao(h, 8) + 1
        End If
        Select Case Right(arrData(r, 9), 1)
        Case "8"
            arrBaoCao(c, 11) = arrBaoCao(c, 11) + 1
            arrTemp(1, 11) = arrTemp(1, 11) + 1
            If blnExtra Then arrBaoCao(h, 11) = arrBaoCao(h, 11) + 1
            If UCase(Left(arrData(r, 7), 3)) = "CAO" Then
                arrBaoCao(c, 13) = arrBaoCao(c, 13) + 1
                arrTemp(1, 13) = arrTemp(1, 13) + 1
                If blnExtra Then arrBaoCao(h, 13) = arrBaoCao(h, 13) + 1
            Else
                arrBaoCao(c, 12) = arrBaoCao(c, 12) + 1
                arrTemp(1, 12) = arrTemp(1, 12) + 1
                If blnExtra Then arrBaoCao(h, 12) = arrBaoCao(h, 12) + 1
            End If
            arrBaoCao(c, 22) = arrBaoCao(c, 22) + 1
            arrTemp(1, 22) = arrTemp(1, 22) + 1
            If blnExtra Then arrBaoCao(h, 22) = arrBaoCao(h, 22) + 1
            If Left(arrData(r, 9), 1) = "1" Then
                arrBaoCao(c, 23) = arrBaoCao(c, 23) + 1
                arrTemp(1, 23) = arrTemp(1, 23) + 1
                If blnExtra Then arrBaoCao(h, 23) = arrBaoCao(h, 23) + 1
            Else
                arrBaoCao(c, 24) = arrBaoCao(c, 24) + 1
                arrTemp(1, 24) = arrTemp(1, 24) + 1
                If blnExtra Then arrBaoCao(h, 24) = arrBaoCao(h, 24) + 1
            End If
        Case "7"
            arrBaoCao(c, 14) = arrBaoCao(c, 14) + 1
            arrTemp(1, 14) = arrTemp(1, 14) + 1
            If blnExtra Then arrBaoCao(h, 14) = arrBaoCao(h, 14) + 1
            Select Case UCase(Right(arrData(r, 8), 2))
            Case "CK"
                arrBaoCao(c, 15) = arrBaoCao(c, 15) + 1
                arrTemp(1, 15) = arrTemp(1, 15) + 1
                If blnExtra Then arrBaoCao(h, 15) = arrBaoCao(h, 15) + 1
            Case "ÀN"
                arrBaoCao(c, 16) = arrBaoCao(c, 16) + 1
                arrTemp(1, 16) = arrTemp(1, 16) + 1
                If blnExtra Then arrBaoCao(h, 16) = arrBaoCao(h, 16) + 1
            Case "PT"
                arrBaoCao(c, 17) = arrBaoCao(c, 17) + 1
                arrTemp(1, 17) = arrTemp(1, 17) + 1
                If blnExtra Then arrBaoCao(h, 17) = arrBaoCao(h, 17) + 1
            End Select
            arrBaoCao(c, 28) = arrBaoCao(c, 28) + 1
            arrTemp(1, 28) = arrTemp(1, 28) + 1
            If blnExtra Then arrBaoCao(h, 28) = arrBaoCao(h, 28) + 1
            Select Case Left(arrData(r, 9), 1)
            Case "1"
                arrBaoCao(c, 29) = arrBaoCao(c, 29) + 1
                arrTemp(1, 29) = arrTemp(1, 29) + 1
                If blnExtra Then arrBaoCao(h, 29) = arrBaoCao(h, 29) + 1
            Case "2"
                arrBaoCao(c, 30) = arrBaoCao(c, 30) + 1
                arrTemp(1, 30) = arrTemp(1, 30) + 1
                If blnExtra Then arrBaoCao(h, 30) = arrBaoCao(h, 30) + 1
            Case "3"
                arrBaoCao(c, 31) = arrBaoCao(c, 31) + 1
                arrTemp(1, 31) = arrTemp(1, 31) + 1
                If blnExtra Then arrBaoCao(h, 31) = arrBaoCao(h, 31) + 1
            Case "4"
                arrBaoCao(c, 32) = arrBaoCao(c, 32) + 1
                arrTemp(1, 32) = arrTemp(1, 32) + 1
                If blnExtra Then arrBaoCao(h, 32) = arrBaoCao(h, 32) + 1
            Case "5"
                arrBaoCao(c, 33) = arrBaoCao(c, 33) + 1
                arrTemp(1, 33) = arrTemp(1, 33) + 1
                If blnExtra Then arrBaoCao(h, 33) = arrBaoCao(h, 33) + 1
            Case Else
                arrBaoCao(c, 34) = arrBaoCao(c, 34) + 1
                arrTemp(1, 34) = arrTemp(1, 34) + 1
                If blnExtra Then arrBaoCao(h, 34) = arrBaoCao(h, 34) + 1
            End Select
        Case Else
            If UCase(Right(arrData(r, 8), 2)) = "XE" Then
                arrBaoCao(c, 18) = arrBaoCao(c, 18) + 1
                arrBaoCao(c, 19) = arrBaoCao(c, 18)
                arrTemp(1, 18) = arrTemp(1, 18) + 1
                arrTemp(1, 19) = arrTemp(1, 18)
                If blnExtra Then
                    arrBaoCao(h, 18) = arrBaoCao(h, 18) + 1
                    arrBaoCao(h, 19) = arrBaoCao(h, 18)
                End If
            End If
            arrBaoCao(c, 25) = arrBaoCao(c, 25) + 1
            arrTemp(1, 25) = arrTemp(1, 25) + 1
            If blnExtra Then arrBaoCao(h, 25) = arrBaoCao(h, 25) + 1
            If Left(arrData(r, 9), 1) = "1" Then
                arrBaoCao(c, 26) = arrBaoCao(c, 26) + 1
                arrTemp(1, 26) = arrTemp(1, 26) + 1
                If blnExtra Then arrBaoCao(h, 26) = arrBaoCao(h, 26) + 1
            Else
                arrBaoCao(c, 27) = arrBaoCao(c, 27) + 1
                arrTemp(1, 27) = arrTemp(1, 27) + 1
                If blnExtra Then arrBaoCao(h, 27) = arrBaoCao(h, 27) + 1
            End If
        End Select
NextStep:
    Next
    c = c + 1
    For r = 2 To 34
        arrBaoCao(c, r) = arrTemp(1, r)
    Next
    shBaoCao.Range("A8").Resize(c, 34).Value = arrBaoCao
End Sub
 

File đính kèm

  • GPE_bosung to.xlsm
    27.9 KB · Đọc: 6
Upvote 0
Giải pháp
Web KT

Bài viết mới nhất

Back
Top Bottom