


Đâ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: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!
=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!
B10=IFERROR(INDEX($C$2:$C$7,MATCH($A10&B$9,$A$2:$A$7&$B$2:$B$7,0)),"")
Đâ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),"")
Mới được phần giá trị thôi anh. Còn cột A và dòng 9 nữa (loại trùng).
Thế phần B9:F9 và A10:A13 bạn sẽ tự làm, hổng cần nghĩ tới phần đó hử?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é.
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.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 đó?
Chào befaint và tueyennhi,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
Thế phần B9:F9 và A10:A13 bạn sẽ tự làm, hổng cần nghĩ tới phần đó hử?
Có chứ!Vâng, nhưng có cách đẩy tốc độ công thức lên không các anh chị?






Chào em trai,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.
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

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 =))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
@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!
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
Ở sheet Data à bạn?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.
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
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.
Sang chảnh làm gì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

=IF(WEEKDAY(O$1+1,13)=1,O$1+2,O$1+1)
=IF(O$1<=TODAY(),O$1,"")
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![]()
Nếu dữ liệu nhiều, sợ "đơ" thì dùng VBA xử nó.

Bạn xem file đính kèm.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!
Bạn xem file đính kèm.
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
Vì bạn trích dẫn bài của tôi nên tôi trả lời như vầy.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!
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é![]()
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