Gộp số liệu và so sánh

Liên hệ QC

Phương Phương mito

Thành viên thường trực
Tham gia
1/5/19
Bài viết
275
Được thích
65
Kính gửi Anh chị và các bạn;
Em có File như kèm theo. Lấy tháng 8 làm gốc: Mã nhân viên, tên nhân viên, Giá trị hàng. Sau đó từ danh sách đó, lọc số liệu của kỳ trước để so sánh. Như vùng kết quả màu xám em làm theo sheet SO_SANH. Code như thế nào để làm bài toán này ạ.
 

File đính kèm

  • GOP VA SO SANH SO LIEU.xlsm
    35.1 KB · Đọc: 18
Lần chỉnh sửa cuối:
Chắc ý bạn là vầy:
1632578308867.png
Data của bạn nó chuẩn cho nên bạn chỉ cần tạo một trường trung gian(chính là unique của mã nhân viên và mã kho),sau đó tạo mối liên hệ thông qua khóa này. Bạn nên tạo một trường Date để làm một liên hệ chung về thời gian. Khi đó tính toán bạn sẽ quản lý được thông tin, kỳ sau hay lần nạp sau chỉ cần Refresh là được.
 

File đính kèm

  • GOP VA SO SANH SO LIEU.xlsm
    403.3 KB · Đọc: 9
Upvote 0
Chắc ý bạn là vầy:
View attachment 266683
Data của bạn nó chuẩn cho nên bạn chỉ cần tạo một trường trung gian(chính là unique của mã nhân viên và mã kho),sau đó tạo mối liên hệ thông qua khóa này. Bạn nên tạo một trường Date để làm một liên hệ chung về thời gian. Khi đó tính toán bạn sẽ quản lý được thông tin, kỳ sau hay lần nạp sau chỉ cần Refresh là được.
Anh làm bằng gì vậy anh. Không phải là code đúng không ạ.
 
Upvote 0
Anh làm bằng gì vậy anh. Không phải là code đúng không ạ.
Mình viết bằng hàm Dax trong power pivot nhé bạn.
1632579472828.png
1632579505002.png
Thể loại liên quan đến thời gian dạng này thì bạn nên sử dụng Dax nhé! Dữ liệu liên quan đến mối liên hệ thời gian thì nên dùng cái này bạn sẽ dễ dàng tùy biến.
 
Upvote 0
Chắc ý bạn là vầy:
View attachment 266683
Data của bạn nó chuẩn cho nên bạn chỉ cần tạo một trường trung gian(chính là unique của mã nhân viên và mã kho),sau đó tạo mối liên hệ thông qua khóa này. Bạn nên tạo một trường Date để làm một liên hệ chung về thời gian. Khi đó tính toán bạn sẽ quản lý được thông tin, kỳ sau hay lần nạp sau chỉ cần Refresh là được.
Có vẻ như không phải là kết quả mong muốn của tác giả. Mục tìm kho chỉ là tìm kho của kỳ trước (đưa vào thành 1 dòng). Về dữ liệu thì chỉ tổng theo mã nhân viên, chứ không tách thành các kho.
Snag_259c4b62.png
 
Upvote 0
Mình viết bằng hàm Dax trong power pivot nhé bạn.
View attachment 266688
View attachment 266689
Thể loại liên quan đến thời gian dạng này thì bạn nên sử dụng Dax nhé! Dữ liệu liên quan đến mối liên hệ thời gian thì nên dùng cái này bạn sẽ dễ dàng tùy biến.
Chào anh,
Tôi có dùng Power Query để thực hiện các công đoạn về số liệu.
Mà đến cái đoạn dùng Dax để insert thêm cột kho (kho này là kho của kỳ trước), anh @tranhungdao12a3 có thể hướng dẫn tôi add vô được không.
 

File đính kèm

  • GOP VA SO SANH SO LIEU.xlsm
    372 KB · Đọc: 4
Upvote 0
Upvote 0
Upvote 0
Có vẻ như không phải là kết quả mong muốn của tác giả. Mục tìm kho chỉ là tìm kho của kỳ trước (đưa vào thành 1 dòng). Về dữ liệu thì chỉ tổng theo mã nhân viên, chứ không tách thành các kho.
View attachment 266691
Chắc tôi đọc vội nên hiểu nhầm, bạn ý chỉ cần đổi hàm timkho thành hàm dưới + filter lấy giá trị dương ở cột tháng 8 là được
Timkhokytruoc:=CONCATENATEX('Table2','Table2'[KHO]," ,")
 
Upvote 0
Chào anh,
Tôi có dùng Power Query để thực hiện các công đoạn về số liệu.
Mà đến cái đoạn dùng Dax để insert thêm cột kho (kho này là kho của kỳ trước), anh @tranhungdao12a3 có thể hướng dẫn tôi add vô được không.
Anh viết cái hàm nối kho kỳ trước:
khokytruoc:=CONCATENATEX('KyTruoc','KyTruoc'[KHO]," ,")
Anh nối liên kết trong Diagram với khóa mã nv là được
1632584636732.png
1632584699428.png
Thú thực là tôi chưa từng làm 1/2=Power Quey + 1/2=Dax.
Anh cho tôi một ý tưởng rất thú vị
 

File đính kèm

  • GOP VA SO SANH SO LIEU (2).xlsm
    391.8 KB · Đọc: 8
Upvote 0
Chào anh,
Tôi có dùng Power Query để thực hiện các công đoạn về số liệu.
Mà đến cái đoạn dùng Dax để insert thêm cột kho (kho này là kho của kỳ trước), anh @tranhungdao12a3 có thể hướng dẫn tôi add vô được không.
Em không dùng Dax mà dùng Text.Combine để nối các kho ở kỳ trước với nhau.
Anh xem được không?
 

File đính kèm

  • GOP VA SO SANH SO LIEU.xlsm
    44.4 KB · Đọc: 12
Upvote 0
Anh viết cái hàm nối kho kỳ trước:
khokytruoc:=CONCATENATEX('KyTruoc','KyTruoc'[KHO]," ,")
Anh nối liên kết trong Diagram với khóa mã nv là được
View attachment 266694
View attachment 266695
Thú thực là tôi chưa từng làm 1/2=Power Quey + 1/2=Dax.
Anh cho tôi một ý tưởng rất thú vị
Cảm ơn anh @tranhungdao12a3
Tôi thấy việc dùng PQ đỡ nhiều công đoạn trung gian. Kể cả phần lấy mã nhân viên duy nhất từ 2 bảng cũng có thể làm được bằng merge query.
@Phương Phương mito: O2010 có addin Power pivot đó, nếu chưa upgade thì add vào. Nếu không thì đợi các chuyên gia VBA, ADO… xem sao nhé.
 
Upvote 0
Upvote 0
Cảm ơn anh @tranhungdao12a3
Tôi thấy việc dùng PQ đỡ nhiều công đoạn trung gian. Kể cả phần lấy mã nhân viên duy nhất từ 2 bảng cũng có thể làm được bằng merge query.
@Phương Phương mito: O2010 có addin Power pivot đó, nếu chưa upgade thì add vào. Nếu không thì đợi các chuyên gia VBA, ADO… xem sao nhé.
ADO thì ngại nhất là không sử dụng được CONCAT trong SQL anh ạ.
Cái đoạn nối chuỗi các kho với nhau ở kỳ trước sẽ rất nhọc công.
 
Upvote 0
Upvote 0
Góp vui thêm code VBA
PHP:
Sub Compare2Terms()
    Dim Dic1 As Object, Dic2 As Object
    Dim Thang8(), Kytruoc(), Res()
    Dim R As Long, K1 As Long, K2 As Long, I As Long
    
    Application.ScreenUpdating = False
    
    'Mo thu vien Scripting.Dictionary
    Set Dic1 = CreateObject("Scripting.Dictionary")
    Set Dic2 = CreateObject("Scripting.Dictionary")
    
    'Mang chua du lieu goc Thang 8
    Thang8 = Sheet2.Range("B2:G" & Sheet2.Range("B" & Rows.Count).End(xlUp).Row)
    'Quy dinh kich thuoc mang ket qua
    ReDim Res(1 To UBound(Thang8, 1), 1 To 6)
    'Mang chua du lieu goc Ky truoc
    Kytruoc = Sheet3.Range("B2:E" & Sheet3.Range("B" & Rows.Count).End(xlUp).Row)
    
    'Chay vong lap theo chieu thu nhat cua mang Thang 8
    For R = 1 To UBound(Thang8, 1)
        'Kiem tra MA_NV da ton tai trong Dic1 chua?
        If Not Dic1.exists(Thang8(R, 1)) Then
            K1 = K1 + 1
            Dic1.Add Thang8(R, 1), K1
            Res(K1, 1) = Thang8(R, 1)   'MA_NV
            Res(K1, 2) = Thang8(R, 2)   'TEN_NV
            Res(K1, 3) = Thang8(R, 6)   'Total
        Else
            Res(Dic1.Item(Thang8(R, 1)), 3) = Res(Dic1.Item(Thang8(R, 1)), 3) + Thang8(R, 6)    'Total
        End If
    Next R
    
    'Chay vong lap theo chieu thu nhat cua mang Ky truoc
    For R = 1 To UBound(Kytruoc, 1)
        'Kiem tra MA_NV da ton tai trong Dic2 chua?
        If Not Dic2.exists(Kytruoc(R, 1)) Then
            K2 = K2 + 1
            Dic2.Add Kytruoc(R, 1), K2
            Kytruoc(K2, 1) = Kytruoc(R, 1)  'MA_NV
            Kytruoc(K2, 2) = Kytruoc(R, 2)  'TEN_NV
            Kytruoc(K2, 3) = Kytruoc(R, 3)  'KHO_KYTRUOC
            Kytruoc(K2, 4) = Kytruoc(R, 4)  'KY_TRUOC
        Else
            Kytruoc(Dic2.Item(Kytruoc(R, 1)), 3) = Kytruoc(Dic2.Item(Kytruoc(R, 1)), 3) & ", " & Kytruoc(R, 3)  'KHO_KYTRUOC
            Kytruoc(Dic2.Item(Kytruoc(R, 1)), 4) = Kytruoc(Dic2.Item(Kytruoc(R, 1)), 4) + Kytruoc(R, 4)         'KY_TRUOC
        End If
    Next R
    
    'Chay vong lap de kiem tra phan tu mang Ky truoc co nam trong mang Res hay khong?
    For R = 1 To K2
        I = Dic1.Item(Kytruoc(R, 1))
        '--> I > 0 --> MA_NV o mang Ky truoc co nam trong mang Res
        If I Then
            Res(I, 4) = Kytruoc(R, 4)   'KY_TRUOC
            Res(I, 5) = Kytruoc(R, 3)   'KHO_KYTRUOC
            Res(I, 6) = Kytruoc(R, 4) / Res(I, 3)   'SO_SANH
        End If
    Next R
    
    With Sheet1
        'Them dong tieu de
        .Range("A20") = "MA_NV"
        .Range("B20") = "TEN_NV"
        .Range("C20") = "Total"
        .Range("D20") = "KY_TRUOC"
        .Range("E20") = "KHO_KYTRUOC"
        .Range("F20") = "SO_SANH"
        'Format du lieu cac cot ket qua
        .Range("A21").Resize(K1).NumberFormat = "@"
        .Range("B21").Resize(K1, 2).NumberFormat = "0,000"
        .Range("F21").Resize(K1).NumberFormat = "0%"
        'Dien ket qua ra bang tinh
        .Range("A21").Resize(K1, 6) = Res
        'Sort lai ket qua theo MA_NV
        .Range("A20").Resize(K1 + 1, 6).Sort key1:=.Range("A20"), order1:=xlAscending, Header:=xlYes
    End With
    
    'Giai phong bo nho
    Set Dic1 = Nothing: Set Dic2 = Nothing
    
    Application.ScreenUpdating = True
    
    MsgBox "Done", vbInformation, "GPE"
End Sub
 
Upvote 0
VBA đây. (Bạn sửa chữ "Dear" trên bài #1 thành tiếng Việt đi, nhìn khó chịu quá)
Em sửa rồi ạ. Tại bọn em hay chát chít nên quen tay ạ. Em cảm ơn anh đã giúp đỡ code ạ!
Bài đã được tự động gộp:

Góp vui thêm code VBA
PHP:
Sub Compare2Terms()
    Dim Dic1 As Object, Dic2 As Object
    Dim Thang8(), Kytruoc(), Res()
    Dim R As Long, K1 As Long, K2 As Long, I As Long
   
    Application.ScreenUpdating = False
   
    'Mo thu vien Scripting.Dictionary
    Set Dic1 = CreateObject("Scripting.Dictionary")
    Set Dic2 = CreateObject("Scripting.Dictionary")
   
    'Mang chua du lieu goc Thang 8
    Thang8 = Sheet2.Range("B2:G" & Sheet2.Range("B" & Rows.Count).End(xlUp).Row)
    'Quy dinh kich thuoc mang ket qua
    ReDim Res(1 To UBound(Thang8, 1), 1 To 6)
    'Mang chua du lieu goc Ky truoc
    Kytruoc = Sheet3.Range("B2:E" & Sheet3.Range("B" & Rows.Count).End(xlUp).Row)
   
    'Chay vong lap theo chieu thu nhat cua mang Thang 8
    For R = 1 To UBound(Thang8, 1)
        'Kiem tra MA_NV da ton tai trong Dic1 chua?
        If Not Dic1.exists(Thang8(R, 1)) Then
            K1 = K1 + 1
            Dic1.Add Thang8(R, 1), K1
            Res(K1, 1) = Thang8(R, 1)   'MA_NV
            Res(K1, 2) = Thang8(R, 2)   'TEN_NV
            Res(K1, 3) = Thang8(R, 6)   'Total
        Else
            Res(Dic1.Item(Thang8(R, 1)), 3) = Res(Dic1.Item(Thang8(R, 1)), 3) + Thang8(R, 6)    'Total
        End If
    Next R
   
    'Chay vong lap theo chieu thu nhat cua mang Ky truoc
    For R = 1 To UBound(Kytruoc, 1)
        'Kiem tra MA_NV da ton tai trong Dic2 chua?
        If Not Dic2.exists(Kytruoc(R, 1)) Then
            K2 = K2 + 1
            Dic2.Add Kytruoc(R, 1), K2
            Kytruoc(K2, 1) = Kytruoc(R, 1)  'MA_NV
            Kytruoc(K2, 2) = Kytruoc(R, 2)  'TEN_NV
            Kytruoc(K2, 3) = Kytruoc(R, 3)  'KHO_KYTRUOC
            Kytruoc(K2, 4) = Kytruoc(R, 4)  'KY_TRUOC
        Else
            Kytruoc(Dic2.Item(Kytruoc(R, 1)), 3) = Kytruoc(Dic2.Item(Kytruoc(R, 1)), 3) & ", " & Kytruoc(R, 3)  'KHO_KYTRUOC
            Kytruoc(Dic2.Item(Kytruoc(R, 1)), 4) = Kytruoc(Dic2.Item(Kytruoc(R, 1)), 4) + Kytruoc(R, 4)         'KY_TRUOC
        End If
    Next R
   
    'Chay vong lap de kiem tra phan tu mang Ky truoc co nam trong mang Res hay khong?
    For R = 1 To K2
        I = Dic1.Item(Kytruoc(R, 1))
        '--> I > 0 --> MA_NV o mang Ky truoc co nam trong mang Res
        If I Then
            Res(I, 4) = Kytruoc(R, 4)   'KY_TRUOC
            Res(I, 5) = Kytruoc(R, 3)   'KHO_KYTRUOC
            Res(I, 6) = Kytruoc(R, 4) / Res(I, 3)   'SO_SANH
        End If
    Next R
   
    With Sheet1
        'Them dong tieu de
        .Range("A20") = "MA_NV"
        .Range("B20") = "TEN_NV"
        .Range("C20") = "Total"
        .Range("D20") = "KY_TRUOC"
        .Range("E20") = "KHO_KYTRUOC"
        .Range("F20") = "SO_SANH"
        'Format du lieu cac cot ket qua
        .Range("A21").Resize(K1).NumberFormat = "@"
        .Range("B21").Resize(K1, 2).NumberFormat = "0,000"
        .Range("F21").Resize(K1).NumberFormat = "0%"
        'Dien ket qua ra bang tinh
        .Range("A21").Resize(K1, 6) = Res
        'Sort lai ket qua theo MA_NV
        .Range("A20").Resize(K1 + 1, 6).Sort key1:=.Range("A20"), order1:=xlAscending, Header:=xlYes
    End With
   
    'Giai phong bo nho
    Set Dic1 = Nothing: Set Dic2 = Nothing
   
    Application.ScreenUpdating = True
   
    MsgBox "Done", vbInformation, "GPE"
End Sub
Cảm ơn anh đã nhiệt tình giúp đỡ 2 cách hay ạ !
 
Upvote 0
Web KT

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

Back
Top Bottom