Sub Loc()
Dim i As Long, rW As Long, j As Long
Dim k As Long
Dim SortRange As Range, SortKey As Range
Dim sArr(), dArr()
rW = Sheet1.Range("A65536").End(xlUp).Row
sArr = Sheet1.Range("A1", Sheet1.Range("XFC1").End(xlToLeft).Offset(rW)).Value
ReDim dArr(1 To UBound(sArr, 2) * UBound(sArr, 1), 1 To 3)
For i = 2 To UBound(sArr, 1)
For j = 6 To UBound(sArr, 2)
If sArr(i, j) > 0 Then
k = k + 1
dArr(k, 1) = sArr(1, j)
dArr(k, 2) = sArr(i, 1)
dArr(k, 3) = sArr(i, j)
End If
Next
Next
With Sheet2
If k Then
.Range("K3:M10000").ClearContents
.Range("K3").Resize(k, 3) = dArr
End If
Set SortRange = .Range("K2", .Range("M65536").End(xlUp))
Set SortKey = .Range("K2")
SortRange.Sort Key1:=SortKey, Order1:=xlAscending, Header:=xlYes
End With
End Sub
Em chào các bác
Các bác giúp em để có kết quả mong muốn với ạ. Em không biết giải thích thế nào nên em xin phép gửi file ạ.
Em cảm ơn các bác nhiều
Tham khảo thêm:Em chào các bác
Các bác giúp em để có kết quả mong muốn với ạ. Em không biết giải thích thế nào nên em xin phép gửi file ạ.
Em cảm ơn các bác nhiều
=INDEX('Dữ liêu'!$A$1:$K$1,INT(AGGREGATE(15,6,(ROW('Dữ liêu'!$F$2:$F$7)+COLUMN('Dữ liêu'!$F$1:$K$1)*10^3)/('Dữ liêu'!$F$2:$K$7>0),ROWS($1:1))/10^3))
=INDEX('Dữ liêu'!$A$1:$A$7,MOD(AGGREGATE(15,6,(ROW('Dữ liêu'!$F$2:$F$7)+COLUMN('Dữ liêu'!$F$1:$K$1)*10^3)/('Dữ liêu'!$F$2:$K$7>0),ROWS($1:1)),10^3))
=SUMPRODUCT(('Dữ liêu'!$F$1:$K$1=A2)*('Dữ liêu'!$A$2:$A$7=B2)*'Dữ liêu'!$F$2:$K$7)
Tham khảo thêm:
A2:
B2:Mã:=INDEX('Dữ liêu'!$A$1:$K$1,INT(AGGREGATE(15,6,(ROW('Dữ liêu'!$F$2:$F$7)+COLUMN('Dữ liêu'!$F$1:$K$1)*10^3)/('Dữ liêu'!$F$2:$K$7>0),ROWS($1:1))/10^3))
C2:Mã:=INDEX('Dữ liêu'!$A$1:$A$7,MOD(AGGREGATE(15,6,(ROW('Dữ liêu'!$F$2:$F$7)+COLUMN('Dữ liêu'!$F$1:$K$1)*10^3)/('Dữ liêu'!$F$2:$K$7>0),ROWS($1:1)),10^3))
Mã:=SUMPRODUCT(('Dữ liêu'!$F$1:$K$1=A2)*('Dữ liêu'!$A$2:$A$7=B2)*'Dữ liêu'!$F$2:$K$7)
Thân
Em chào anhTham khảo thêm:
A2:
B2:Mã:=INDEX('Dữ liêu'!$A$1:$K$1,INT(AGGREGATE(15,6,(ROW('Dữ liêu'!$F$2:$F$7)+COLUMN('Dữ liêu'!$F$1:$K$1)*10^3)/('Dữ liêu'!$F$2:$K$7>0),ROWS($1:1))/10^3))
C2:Mã:=INDEX('Dữ liêu'!$A$1:$A$7,MOD(AGGREGATE(15,6,(ROW('Dữ liêu'!$F$2:$F$7)+COLUMN('Dữ liêu'!$F$1:$K$1)*10^3)/('Dữ liêu'!$F$2:$K$7>0),ROWS($1:1)),10^3))
Mã:=SUMPRODUCT(('Dữ liêu'!$F$1:$K$1=A2)*('Dữ liêu'!$A$2:$A$7=B2)*'Dữ liêu'!$F$2:$K$7)
Thân
Đâu có gì ghê gớm lắm đâu mà gọi là "siêu phẩm"! Chẳng qua là bạn chưa biết thì thấy nó lạ, biết rồi thì thấy nó cũng là "một ngày như mọi ngày" thôi.Nếu có thể bác Hiệp có tài liệu về vấn đề này có thể cho em xin để em tham khảo thêm vấn đề này được không ạ.
Với dữ liệu trên 1000 dòng mà bạn dùng công thức mảng để xử lý, chính nó sẽ làm cho máy bạn chạy ì ạch.Em chào anh
Cảm ơn anh đã chia sẻ công thức,đúng cái em cần
Em có vấn đề khác chủ topic là cột mã hàng của em có nhiều mã trùng lặp(không duy nhất như ví dụ của chủ đề)
Em áp dụng công thức của anh cũng ra kết quả đúng ,nhưng phải coppy giá trị sau xóa trùng lặp và giá trị 0 đi.
Mong anh xem file và giúp đỡ sửa công thức phần trùng lặp với ạ
Em cảm ơn anh!
Mình làm với unpivot Column.
Xem kết quả ở sheet "Kết quả trả về" vùng từ cột G nhé.
Muốn thêm dữ liệu thì kéo chuột mở rộng bảng rồi vào Data\Refresh All nha.
Nếu muốn dùng code thì thế này :
Mã:Sub Loc() Dim i As Long, rW As Long, j As Long Dim k As Long Dim SortRange As Range, SortKey As Range Dim sArr(), dArr() rW = Sheet1.Range("A65536").End(xlUp).Row sArr = Sheet1.Range("A1", Sheet1.Range("XFC1").End(xlToLeft).Offset(rW)).Value ReDim dArr(1 To UBound(sArr, 2) * UBound(sArr, 1), 1 To 3) For i = 2 To UBound(sArr, 1) For j = 6 To UBound(sArr, 2) If sArr(i, j) > 0 Then k = k + 1 dArr(k, 1) = sArr(1, j) dArr(k, 2) = sArr(i, 1) dArr(k, 3) = sArr(i, j) End If Next Next With Sheet2 If k Then .Range("K3:M10000").ClearContents .Range("K3").Resize(k, 3) = dArr End If Set SortRange = .Range("K2", .Range("M65536").End(xlUp)) Set SortKey = .Range("K2") SortRange.Sort Key1:=SortKey, Order1:=xlAscending, Header:=xlYes End With End Sub
Em cảm ơn bác nhiều ạNếu bạn muốn dùng công thức thì bạn thử
A2=INDEX('Dữ liêu'!$F$1:$J$1,,AGGREGATE(15,6,TRANSPOSE(ROW($1:$20))/(OFFSET('Dữ liêu'!$F$1:$J$1,MATCH('Kết quả trả về'!B2,'Dữ liêu'!$A$2:$A$7,0),,)>0),COUNTIF($B$2:B2,B2)))
B2=INDEX('Dữ liêu'!$A$2:$A$7,AGGREGATE(15,6,ROW($1:$20)/('Dữ liêu'!$F$2:$J$7>0),ROW(1:1)))
C2=INDEX(OFFSET('Dữ liêu'!$F$1:$J$1,MATCH('Kết quả trả về'!B2,'Dữ liêu'!$A$2:$A$7,0),,),,AGGREGATE(15,6,TRANSPOSE(ROW($1:$20))/(OFFSET('Dữ liêu'!$F$1:$J$1,MATCH('Kết quả trả về'!B2,'Dữ liêu'!$A$2:$A$7,0),,)>0),COUNTIF($B$2:B2,B2)))
Mình làm cho bạn cả 2 Sheet để bạn tham khảo nhé
Thân
Em cảm ơn bác nhiều ạTham khảo thêm:
A2:
B2:Mã:=INDEX('Dữ liêu'!$A$1:$K$1,INT(AGGREGATE(15,6,(ROW('Dữ liêu'!$F$2:$F$7)+COLUMN('Dữ liêu'!$F$1:$K$1)*10^3)/('Dữ liêu'!$F$2:$K$7>0),ROWS($1:1))/10^3))
C2:Mã:=INDEX('Dữ liêu'!$A$1:$A$7,MOD(AGGREGATE(15,6,(ROW('Dữ liêu'!$F$2:$F$7)+COLUMN('Dữ liêu'!$F$1:$K$1)*10^3)/('Dữ liêu'!$F$2:$K$7>0),ROWS($1:1)),10^3))
Mã:=SUMPRODUCT(('Dữ liêu'!$F$1:$K$1=A2)*('Dữ liêu'!$A$2:$A$7=B2)*'Dữ liêu'!$F$2:$K$7)
Thân
Data của bạn có nhiều dữ liệu, nên dùng VBA thì hợp lý hơn.Em có vấn đề khác chủ topic là cột mã hàng của em có nhiều mã trùng lặp(không duy nhất như ví dụ của chủ đề)
Option Explicit
Sub tonghop()
Dim i&, j&, k&, rng, res()
Dim dic As Object, key, st As String
Set dic = CreateObject("Scripting.Dictionary")
With Sheet3
rng = .[B2].CurrentRegion.Value
For i = 2 To UBound(rng)
For j = 11 To UBound(rng, 2)
st = rng(i, 2) & "|" & rng(1, j)
If Not dic.exists(st) Then
dic.Add st, rng(i, j)
Else
dic(st) = dic(st) + rng(i, j)
End If
Next
Next
End With
ReDim res(1 To dic.Count, 1 To 3)
For Each key In dic.keys
If dic(key) > 0 Then
k = k + 1
res(k, 1) = Split(key, "|")(1)
res(k, 2) = Split(key, "|")(0)
res(k, 3) = dic(key)
End If
Next
Set dic = Nothing
Sheet4.Activate
Range("A3:C10000").ClearContents
If k > 0 Then Range("A3").Resize(k, 3).Value = res
End Sub
Em xin cảm ơn bác nhé.Đúng rồi ạData của bạn có nhiều dữ liệu, nên dùng VBA thì hợp lý hơn.
PHP:Option Explicit Sub tonghop() Dim i&, j&, k&, rng, res() Dim dic As Object, key, st As String Set dic = CreateObject("Scripting.Dictionary") With Sheet3 rng = .[B2].CurrentRegion.Value For i = 2 To UBound(rng) For j = 11 To UBound(rng, 2) st = rng(i, 2) & "|" & rng(1, j) If Not dic.exists(st) Then dic.Add st, rng(i, j) Else dic(st) = dic(st) + rng(i, j) End If Next Next End With ReDim res(1 To dic.Count, 1 To 3) For Each key In dic.keys If dic(key) > 0 Then k = k + 1 res(k, 1) = Split(key, "|")(1) res(k, 2) = Split(key, "|")(0) res(k, 3) = dic(key) End If Next Set dic = Nothing Sheet4.Activate Range("A3:C10000").ClearContents If k > 0 Then Range("A3").Resize(k, 3).Value = res End Sub