Giúp hàm tổng hợp dữ liệu trong bảng tính (1 người xem)

Người dùng đang xem chủ đề này

tueyennhi

Thành viên tích cực
Tham gia
18/10/10
Bài viết
1,192
Được thích
105
Chào anh chị, em có file đính kèm, anh chị xem giúp em làm thế nào để tổng hợp dữ liệu từ dạng cột sang dạng bảng không nhé.

Em cảm ơn!
 

File đính kèm

Chào anh chị, em có file đính kèm, anh chị xem giúp em làm thế nào để tổng hợp dữ liệu từ dạng cột sang dạng bảng không nhé.

Em cảm ơn!
Đây là một trong nhiều cách. Công thức tại B10 rồi fill xuống và qua phải:
Mã:
=IFERROR(LOOKUP(2,1/($A$2:$A$7=$A10)/($B$2:$B$7=B$9),$C$2:$C$7),"")
 
Chào anh chị, em có file đính kèm, anh chị xem giúp em làm thế nào để tổng hợp dữ liệu từ dạng cột sang dạng bảng không nhé.

Em cảm ơn!
Mã:
B10=IFERROR(INDEX($C$2:$C$7,MATCH($A10&B$9,$A$2:$A$7&$B$2:$B$7,0)),"")
Ctrl + Shift + Enter!
 
Em thấy chạy không có vẫn đề gì mà anh???
Thế phần B9:F9 và A10:A13 bạn sẽ tự làm, hổng cần nghĩ tới phần đó hử?
Xin hỏi A2:A7 ở file thật của bạn cũng là giá trị số như file bạn đã gửi?
và khi đó vùng A10:A13 phải sắp xếp theo thứ tự từ nhỏ -> lớn?
Bạn phản hồi nhé.
 
Thế phần B9:F9 và A10:A13 bạn sẽ tự làm, hổng cần nghĩ tới phần đó hử?
Xin hỏi A2:A7 ở file thật của bạn cũng là giá trị số như file bạn đã gửi?
và khi đó vùng A10:A13 phải sắp xếp theo thứ tự từ nhỏ -> lớn?
Bạn phản hồi nhé.

Vùng B9:F9 chỉ là các ngày trong tháng từ nhỏ đến lớn
Vùng A10 đến A13 cũng là giá trị số (duy nhất) sắp xếp lẫn lộn không theo thứ tự nào cả
Vùng A2 A7 chỉ có giá trị số và cũng không sắp xếp theo thứ tự lớn bé mà lẫn lộn
Như anh nói thì bắt buộc vùng A10 đến A13 phải sắp xếp theo thứ tự từ bé đến lớn???

Nếu dữ liệu đầu vào như trên không có ảnh hưởng đến kết quả thì nhược điểm duy nhất là đối với dữ liệu lớn (của em 5000 ID, mỗi ngày nghỉ khoảng 100 đến 200 ID) thì công thức chạy chậm.

Chờ tin anh.
 
Vùng B9:F9 chỉ là các ngày trong tháng từ nhỏ đến lớn
Vùng A10 đến A13 cũng là giá trị số (duy nhất) sắp xếp lẫn lộn không theo thứ tự nào cả
Vùng A2 A7 chỉ có giá trị số và cũng không sắp xếp theo thứ tự lớn bé mà lẫn lộn
Như anh nói thì bắt buộc vùng A10 đến A13 phải sắp xếp theo thứ tự từ bé đến lớn???

Nếu dữ liệu đầu vào như trên không có ảnh hưởng đến kết quả thì nhược điểm duy nhất là đối với dữ liệu lớn (của em 5000 ID, mỗi ngày nghỉ khoảng 100 đến 200 ID) thì công thức chạy chậm.

Chờ tin anh.
Vấn đề là trong file bạn gửi, vùng A10:A13 sau khi loại trùng còn sắp xếp từ nhỏ tới lớn nên tôi phải hỏi lại.
Nếu không cần sắp xếp lại thì bớt một bước.
Ngoài ra, bạn cần xuất ra sheet khác hay để ngay ở sheet đó?
 
Vấn đề là trong file bạn gửi, vùng A10:A13 sau khi loại trùng còn sắp xếp từ nhỏ tới lớn nên tôi phải hỏi lại.
Nếu không cần sắp xếp lại thì bớt một bước.
Ngoài ra, bạn cần xuất ra sheet khác hay để ngay ở sheet đó?

Thực tế thì có sheet dữ liệu nghỉ và sheet tổng hợp anh ạ. Sheet tổng hợp là ID của toàn bộ bộ phận còn sheet dữ liệu nghỉ liệt kê những người nghỉ lý do và ngày nghỉ. Cái đó ảnh hưởng đến tốc độ à anh?
 
Vùng B9:F9 chỉ là các ngày trong tháng từ nhỏ đến lớn
Vùng A10 đến A13 cũng là giá trị số (duy nhất) sắp xếp lẫn lộn không theo thứ tự nào cả
Vùng A2 A7 chỉ có giá trị số và cũng không sắp xếp theo thứ tự lớn bé mà lẫn lộn
Như anh nói thì bắt buộc vùng A10 đến A13 phải sắp xếp theo thứ tự từ bé đến lớn???

Nếu dữ liệu đầu vào như trên không có ảnh hưởng đến kết quả thì nhược điểm duy nhất là đối với dữ liệu lớn (của em 5000 ID, mỗi ngày nghỉ khoảng 100 đến 200 ID) thì công thức chạy chậm.

Chờ tin anh.
Chào befaint và tueyennhi,

Hai bên lo lắng cho nhau, nhưng do chưa có "mẫu số chung" nên hơi dò nhầm ý nhau rồi!

Ý befaint là tạo luôn công thức cho cột A10:A13 sao cho ra kết quả là: 100, 101, 102, 103 (đã loại trùng) và dòng 9: ngày 01...đến ngày... chứ không phải để em tueyennhi tự gõ tay vào, sẽ đỡ nhọc hơn.

Anh em nhiều khi "thương nhau lắm thì cắn nhau đau" mà, nhưng hiểu rõ mọi chuyện rồi sẽ thắm thiết hơn. }}}}}

Chúc hai anh em ngày thiệt vui
 
Vâng, nhưng có cách đẩy tốc độ công thức lên không các anh chị?
 
Chào befaint và tueyennhi,

Hai bên lo lắng cho nhau, nhưng do chưa có "mẫu số chung" nên hơi dò nhầm ý nhau rồi!

Ý befaint là tạo luôn công thức cho cột A10:A13 sao cho ra kết quả là: 100, 101, 102, 103 (đã loại trùng) và dòng 9: ngày 01...đến ngày... chứ không phải để em tueyennhi tự gõ tay vào, sẽ đỡ nhọc hơn.

Anh em nhiều khi "thương nhau lắm thì cắn nhau đau" mà, nhưng hiểu rõ mọi chuyện rồi sẽ thắm thiết hơn. }}}}}

Chúc hai anh em ngày thiệt vui

Em có viết ở bài #6 rồi mà anh.
Thế phần B9:F9 và A10:A13 bạn sẽ tự làm, hổng cần nghĩ tới phần đó hử?

@tueyennhi
Lần trước là tôi có nói với bạn là nên gửi file thật giống với file thật của bạn đang làm.
Nếu bạn tự điều chỉnh được với file mẫu đã đưa lên để áp dụng vào file thật thì mới làm vậy.
 
Vâng, nhưng có cách đẩy tốc độ công thức lên không các anh chị?
Có chứ!

Ví dụ, cột A loại trùng thì mình dùng Pivot, Dòng 9 thì cứ cộng ngày trước với 1 thành ngày sau, từ cột B thì làm công thức như anh giangleloi đưa! xong khỏe re hà --=0--=0--=0

Chúc anh em gắn bó và thương yêu nhau. }}}}}}}}}}}}}}}
 
Em có viết ở bài #6 rồi mà anh.
Chào em trai,

Do là em của anh, anh đọc anh hiểu ý em, tuy nó ngắn gọn nhưng thể hiện tính của em từ trước đến nay là vậy. --=0
Nhưng, anh em khác đọc thì có thể tưởng em nói là công thức đưa ra sai rồi! khà khà khà, chỉ có vậy thôi em trai! /-*+//-*+//-*+/

Chúc em ngày vui
 
Chào em trai,

Do là em của anh, anh đọc anh hiểu ý em, tuy nó ngắn gọn nhưng thể hiện tính của em từ trước đến nay là vậy. --=0
Nhưng, anh em khác đọc thì có thể tưởng em nói là công thức đưa ra sai rồi! khà khà khà, chỉ có vậy thôi em trai! /-*+//-*+//-*+/

Chúc em ngày vui

Thường thì em hỏi một hồi (căng lắm là dài 2-3 page) thì mới dám làm. Nếu sau đó còn ý kiến nữa là hay chạy lắm --=0

@tueyennhi
Bạn xem file đính kèm. Với file bạn đưa thì chỉ được như vầy. Còn nữa thì bạn tự ráng sửa nha.
Chúc bạn thành công!
 

File đính kèm

Thường thì em hỏi một hồi (căng lắm là dài 2-3 page) thì mới dám làm. Nếu sau đó còn ý kiến nữa là hay chạy lắm --=0

@tueyennhi
Bạn xem file đính kèm. Với file bạn đưa thì chỉ được như vầy. Còn nữa thì bạn tự ráng sửa nha.
Chúc bạn thành công!
Code này chưa sắp xếp dữ liệu ngày tháng. Làm luôn đi bạn, cho mình học =))
Một code khác (Sắp xếp hơi củ chuối) @@
PHP:
Sub Nghichchovui()
Dim i As Long, k As Long, l As Long, a As Long, b As Long, z As Long
lrw = Range("A" & Rows.Count).End(3).Row
DL = Range("A2:C" & lrw).Value2
ReDim DL2(1 To UBound(DL), 1 To UBound(DL))
Set Dic = CreateObject("Scripting.Dictionary")
k = 1
l = 1
    With Dic
        For i = 1 To UBound(DL)
        Tmp = DL(i, 1)
            If Not .exists(Tmp) Then
                k = k + 1
                .Add Tmp, k
                DL2(k, 1) = DL(i, 1)
            End If
        Tmp2 = DL(i, 2)
            If Not .exists(Tmp2) Then
                l = l + 1
                .Add Tmp2, l
                DL2(1, l) = DL(i, 2)
            End If
        Next
    For a = 2 To k
        For b = 2 To l
            For z = 1 To UBound(DL)
                If DL2(1, b) = DL(z, 2) And DL2(a, 1) = DL(z, 1) Then DL2(a, b) = DL(z, 3)
            Next
        Next
    Next
    DL2(1, 1) = "Conten"
    End With
Range(Columns("D:D"), Columns("D:D").End(xlToRight)).Clear
Range("D2").Resize(, l).NumberFormat = "DD/MM/YYYY"
Range("D1") = "T" & ChrW(7893) & "ng h" & ChrW(7907) & "p"
With Range("D2").Resize(k, l)
.Value = DL2
.Borders.LineStyle = xlContinuous
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
End With
With Worksheets("Sheet1").Sort
    .SortFields.Add Key:=Range("E2").Resize(, l - 1), Order:=xlAscending
    .SetRange Range("E2").Resize(k, l - 1)
    .Orientation = xlLeftToRight
    .SortMethod = xlPinYin
    .Apply
End With
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Vâng, vậy em up file thực tế lên, phiền mọi người xem qua cho em ạ. Cách lấy dữ liệu này qua VBA em đã từng được anh ChanhTQ và anh Bate chỉ cho nhưng vẫn chưa hiểu để áp dụng được vào các thứ khác.
 

File đính kèm

Vâng, vậy em up file thực tế lên, phiền mọi người xem qua cho em ạ. Cách lấy dữ liệu này qua VBA em đã từng được anh ChanhTQ và anh Bate chỉ cho nhưng vẫn chưa hiểu để áp dụng được vào các thứ khác.
Ở sheet Data à bạn?
PHP:
Sub Nghichchovui()
Application.ScreenUpdating = False
Dim i As Long, k As Long, l As Long, a As Long, b As Long, z As Long
lrw = Range("A" & Rows.Count).End(3).Row
DL = Range("A3:C" & lrw).Value2
ReDim DL2(1 To UBound(DL), 1 To UBound(DL))
Set Dic = CreateObject("Scripting.Dictionary")
k = 1
l = 1
    With Dic
        For i = 1 To UBound(DL)
        Tmp = DL(i, 1)
            If Not .exists(Tmp) Then
                k = k + 1
                .Add Tmp, k
                DL2(k, 1) = DL(i, 1)
            End If
        Tmp2 = DL(i, 3)
            If Not .exists(Tmp2) Then
                l = l + 1
                .Add Tmp2, l
                DL2(1, l) = DL(i, 3)
            End If
        Next
    For a = 2 To k
        For b = 2 To l
            For z = 1 To UBound(DL)
                If DL2(1, b) = DL(z, 3) And DL2(a, 1) = DL(z, 1) Then DL2(a, b) = DL(z, 2)
            Next
        Next
    Next
    DL2(1, 1) = "Conten"
    End With
Range(Columns("D:D"), Columns("D:D").End(xlToRight)).Clear
Range("D2").Resize(, l).NumberFormat = "DD/MM/YYYY"
Range("D1") = "T" & ChrW(7893) & "ng h" & ChrW(7907) & "p"
With Range("D2").Resize(k, l)
.Value = DL2
.Borders.LineStyle = xlContinuous
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
End With
With Worksheets("Data").Sort
    .SortFields.Add Key:=Range("E2").Resize(, l - 1), Order:=xlAscending
    .SetRange Range("E2").Resize(k, l - 1)
    .Orientation = xlLeftToRight
    .SortMethod = xlPinYin
    .Apply
End With
Application.ScreenUpdating = True
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Vâng, vậy em up file thực tế lên, phiền mọi người xem qua cho em ạ. Cách lấy dữ liệu này qua VBA em đã từng được anh ChanhTQ và anh Bate chỉ cho nhưng vẫn chưa hiểu để áp dụng được vào các thứ khác.

Dữ liệu của bạn không thực tế. Không chơi.
Hôm nay là ngày 04/11/2016. Dữ liệu bạn đưa tới ngày 29/11/2016 => Những người đó đã có kế hoạch và chắc chắn nghỉ vào ngày đó?

Với dữ liệu bạn đưa (hợp lý là thời điểm ngày hiện tại) thì chỉ cần dò tìm ở sheet Data rồi cho vào bảng report, danh sách nhân viên là có sẵn rồi.
 
Vâng. Với công thức anh cho thì chạy tốt rồi. Chỉ là muốn vba cho sang :d
 
Vâng. Với công thức anh cho thì chạy tốt rồi. Chỉ là muốn vba cho sang :d
Sang chảnh làm gì --=0
Công thức đã có mà chỉnh sửa lại là sang chảnh lắm rồi.
...
Công ty bạn nghỉ làm việc ngày thứ Tư.
Cell O1= ngày đầu tiên của tháng mà khác thứ Tư (phải nhập từ bàn phím vì cần thông số cố định)
Cell P1:
Mã:
=IF(WEEKDAY(O$1+1,13)=1,O$1+2,O$1+1)
Kéo sang phải.
Cell O2:
Mã:
=IF(O$1<=TODAY(),O$1,"")
Kéo sang phải.
 
Quan trọng là dữ liệu nhiều thì hơi đơ máy anh ạ. Tính ra hết tháng có gần 10.000 lượt nghỉ. Lúc đó sợ còn đơ nữa !$@!!
 
Em đang thử biến tấu code của anh Bate, mọi người xem giúp em là sai ở đâu nhé. Em cảm ơn!
 

File đính kèm


File thì đã có tuy nhiên em muốn qua đây hiểu bản chất của code đính kèm trong bài #23

PHP:
Public Sub Updatenghi()
Dim Dic As Object, Col As Object, Ws As Worksheet, Tem As String, Rws As Long
Dim sArr(), dArr(), I As Long, J As Long, K As Long, C As Long, R As Long
Set Dic = CreateObject("Scripting.Dictionary")
Set Col = CreateObject("Scripting.Dictionary")
With Sheets(""Detail report")
    sArr = .Range("B29").Resize(, 40).Value
    For J = 1 To 40
        If sArr(1, J) <> Empty Then
            If IsDate(sArr(1, J)) Then Col.Item(Day(sArr(1, J))) = J
        End If
    Next J
    dArr = .Range("B30", .Range("B30").End(xlDown)).Resize(, 40).Value
    For I = 1 To UBound(dArr)
        Tem = dArr(I, 1)
        Dic.Item(Tem) = I
    Next I
End With
    With Sheets("Data")
        R = .Range("A65536").End(xlUp).Row
            If R > 2 Then
                sArr = .Range("A2:C" & R).Value
                For I = 1 To UBound(sArr)
                    Tem = sArr(I, 1)
                    Rws = Dic.Item(Tem)
                    C = Col.Item(Day(sArr(I, 3)))
                    dArr(Rws, C) = sArr(I, 1)
                Next I
            End If
    End With
Sheets("Detail report").Range("B30").Resize(I - 1, 40) = dArr
Set Dic = Nothing
Set Col = Nothing
End Sub

Mong mọi người giải đáp.
 
File thì đã có tuy nhiên em muốn qua đây hiểu bản chất của code đính kèm trong bài #23
...
Mong mọi người giải đáp.
Vì bạn trích dẫn bài của tôi nên tôi trả lời như vầy.

1/ Tôi thấy cái khó nhất của bạn là việc trình bày vấn đề của mình rõ ràng cho người khác hiểu. Lòng vòng hoài cuối cùng bạn muốn giải thích code...

2/ (Theo tôi) Ai đã giúp bạn viết code trên thì bạn hỏi đích danh người đó diễn giải cho bạn. Như thế sẽ thuận tiện nhất.

Vậy ha. Chúc bạn thành công!
 
Vì bạn trích dẫn bài của tôi nên tôi trả lời như vầy.

1/ Tôi thấy cái khó nhất của bạn là việc trình bày vấn đề của mình rõ ràng cho người khác hiểu. Lòng vòng hoài cuối cùng bạn muốn giải thích code...

2/ (Theo tôi) Ai đã giúp bạn viết code trên thì bạn hỏi đích danh người đó diễn giải cho bạn. Như thế sẽ thuận tiện nhất.

Vậy ha. Chúc bạn thành công!

Cảm ơn bạn đã quan tâm đến chủ đề của mình. File của bạn rất hay rồi, làm công việc của mình nhàn hạ đi nhiều, nhưng vì đã chót gửi file thắc mắc lên từ trước và cũng tò mò tìm trên mạng nhưng chưa hiểu thông được.



Những dòng lệnh trên nghĩa là gì. Mình nghĩ với trình độ của nhiều người trên diễn đàn đều có thể hiểu được những dòng code này. Mình không có ý gì cả. Chỉ là chót mang cái tính tò mò. Không phải mình lòng vòng và cuối cùng cái chính là giải thích code đâu. Ban đầu là viết hàm mà. Sau thấy mọi người lật vba, nên viết thử nhờ mọi người xem cho thôi bạn ạ.
Cảm ơn bạn befaint một lần nữa!

Theo cách hiểu của em thì có phải là như vầy:

With Sheets("Data")
R = .Range("
A65536").End(xlUp).Row
Chọn sheet Data, đếm dữ liệu R ở cột A theo chiều từ dưới lên
If R > 2 Then
sArr = .Range("
A2:C" & R).Value
For I = 1 To UBound(sArr)
Tem = sArr(I, 1)
Rws = Dic.Item(Tem)
C = Col.Item(Day(sArr(I, 3)))
C_ Cột 3
dArr(Rws, C) = sArr(I, 1)
Next I
End If
End With
Sheets("
Detail report").Range("B30").Resize(I - 1, 40) = dArr
Set Dic = Nothing
Set Col = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Anh Bate ơi em đang biến tấu code của anh cho bài này mà đang không biết bị lỗi gì, anh xem giúp em ở #23 nhé }}}}}

Bạn muốn "biến" thì sheet Detail Report phải có đủ 31 cột tương ứng 31 ngày.
Từ B30 cho đến N "mút chỉ", bạn phải nhập thủ công các chi tiết.
PHP:
Public Sub GPE()
Dim Dic As Object, Col As Long, Rws As Long
Dim sArr(), dArr(), I As Long, J As Long, K As Long, R As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Detail report")
    sArr = .Range("B30", .Range("B30").End(xlDown)).Value
    R = UBound(sArr)
End With
    ReDim dArr(1 To R, 1 To 31)
    For I = 1 To UBound(sArr)
        Dic.Item(sArr(I, 1)) = I
    Next I
With Sheets("Data")
    If .Range("A65536").End(xlUp).Row > 2 Then
        sArr = .Range("A2", .Range("A2").End(xlDown)).Resize(, 3).Value
        For I = 2 To UBound(sArr)
            Rws = Dic.Item(sArr(I, 1))
            Col = Day(sArr(I, 3))
            dArr(Rws, Col) = sArr(I, 2)
        Next I
    End If
End With
Sheets("Detail report").Range("O30").Resize(R, 31) = dArr
Set Dic = Nothing
End Sub
Chạy code trên với cấu trúc như file dưới. Các công thức của bạn phải chỉnh lại cho phù hợp.
 

File đính kèm

Cảm ơn gia đình Giaiphapexcel, cảm ơn anh Bate, cảm ơn bạn befaint rất nhiều!
 

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

Back
Top Bottom