=IFERROR(INDEX($C$7:$Z$7,SMALL(IF($D8:$Z8=$C8:$Y8,"",$D$6:$Z$6),COLUMNS($A:A))),"")
Trong file bạn yêu cầu:Em chào anh, chị.
Em có 1 bài toán khó quá muốn nhờ anh chị giúp đỡ ạ.
Nếu ít thì em có thể làm thủ công, nhưng dữ liệu đến hàng nghìn dòng nên mong anh, chị giúp em với.
Chi tiết trong file ạ.
Em cám ơn.
Bạn chịu khó giải thích cho trường hợp dòng 39, theo tôi hiểu nếu yêu cầu trên thì dòng 39 sẽ có:Tại cột AA thể hiện dữ liệu của "x" đầu tiên
Tại cột AB thể hiện dữ liệu của "blank" (ô trống) đầu tiên
Tại cột AC thể hiện dữ liệu của "x" đầu tiên theo khoảng tiếp theo
Tại cột AD thể hiện dữ liệu của "blank" đầu tiên theo khoảng tiếp theo.
Em chào anh, chị.
Em có 1 bài toán khó quá muốn nhờ anh chị giúp đỡ ạ.
Nếu ít thì em có thể làm thủ công, nhưng dữ liệu đến hàng nghìn dòng nên mong anh, chị giúp em với.
Chi tiết trong file ạ.
Em cám ơn.
AA8 =IFERROR(SMALL(IF($C8:$Z8=$B8:$Y8,"",$C$7:$Z$7),COLUMNS($A:A)-($C8="")),"")
- Hằng ngàn dòng mà dùng công thức chắc "oải". Thử dùng VBA nhé.Nếu ít thì em có thể làm thủ công, nhưng dữ liệu đến hàng nghìn dòng nên mong anh, chị giúp em với.
Chi tiết trong file ạ.
Public Sub GPE()
Dim sArr(), dArr, C As Long, I As Long, J As Long, Rws As Long, Col As Long, Tem
Col = 25
sArr = Range("B7", Range("B7").End(xlDown)).Resize(, Col).Value
Rws = UBound(sArr)
ReDim dArr(1 To Rws, 1 To 10)
For I = 2 To Rws
Tem = sArr(I, 2)
If Tem = "x" Then
C = 1
Else
C = 2
End If
dArr(I - 1, C) = sArr(1, 2)
For J = 3 To Col
If sArr(I, J) <> Tem Then
C = C + 1
dArr(I - 1, C) = sArr(1, J)
Tem = sArr(I, J)
End If
Next J
Next I
Range("AA8").Resize(Rws, 10) = dArr
End Sub
Vâng chị.Trong file bạn yêu cầu:
Bạn chịu khó giải thích cho trường hợp dòng 39, theo tôi hiểu nếu yêu cầu trên thì dòng 39 sẽ có:
1/ Ô AA39 với "x" đầu tiên là Mục 1.9
2/ Ô AB39 với rỗng đầu tiên là Mục 1.1 (hay ý bạn muốn là ô rỗng đầu tiên sau Mục 1.9 có "x" đầu tiên!? tức là Mục 2.5)
3/ Tương tự bạn cho kết quả tay các cột AC, AD.....theo bạn nó sẽ là Mục số mấy nhen!
hihi ^o^
Em cám ơn.Ctrl+Shift+EnterMã:AA8 =IFERROR(SMALL(IF($C8:$Z8=$B8:$Y8,"",$C$7:$Z$7),COLUMNS($A:A)-($C8="")),"")
Copy cho các ô còn lại
Dạ, em add vào thì thấy kết có có 1 số chỗ là:- Hằng ngàn dòng mà dùng công thức chắc "oải". Thử dùng VBA nhé.
- Chưa rõ quy luật của kết quả, nếu không đúng ý bạn thì "la" lên nhé.
PHP:Public Sub GPE() Dim sArr(), dArr, C As Long, I As Long, J As Long, Rws As Long, Col As Long, Tem Col = 25 sArr = Range("B7", Range("B7").End(xlDown)).Resize(, Col).Value Rws = UBound(sArr) ReDim dArr(1 To Rws, 1 To 10) For I = 2 To Rws Tem = sArr(I, 2) If Tem = "x" Then C = 1 Else C = 2 End If dArr(I - 1, C) = sArr(1, 2) For J = 3 To Col If sArr(I, J) <> Tem Then C = C + 1 dArr(I - 1, C) = sArr(1, J) Tem = sArr(I, J) End If Next J Next I Range("AA8").Resize(Rws, 10) = dArr End Sub
Góp thêm một công thức:Vâng chị.
1/ Ô AA39 là 1.9
2/ Ô AB39 là 2.5
3/ Ô AC39 là 2.7
4/ Ô AD39 là 3.0
Các ô sẽ lấy tiếp dữ liệu về bên phải ạ.
AA8=IFERROR(AGGREGATE(15,6,$C$7:$Z$7/($B8:$Y8<>$C8:$Z8)/(COLUMN($A$1:$X$1)>=MATCH("x",$C8:$Z8,)),COLUMN(A$1)),"")
Chỉnh lại công thứcEm cám ơn.
Nhưng có 1 vấn đề ở công thức là AA không lấy được dữ liệu x đầu tiên nếu dữ liệu tại cột C tương ứng là blank ạ.
AA8 =IFERROR(SMALL(IF($C8:$Z8=$B8:$Y8,"",$C$7:$Z$7),COLUMNS($A:A)+($C8="")*(2*(AA$7="A")-1)),"")
Kết quả ví dụ chưa tổng quát làm cho khó hiểu quá.Dạ, em add vào thì thấy kết có có 1 số chỗ là:
1/ ví dụ tại dòng 39 nếu C39 là trống thì kết quả ra tại AA39 là trống, trong khi nếu đúng thì AA39 cần ra kết quả là 1.9 ạ.
2/ khi em thử điều chỉnh nhiều vùng khoảng trống hơn thì VBA báo lỗi anh ạ.
Công thức hay bữa nào ngồi ngâm cứuCtrl+Shift+EnterMã:AA8 =IFERROR(SMALL(IF($C8:$Z8=$B8:$Y8,"",$C$7:$Z$7),COLUMNS($A:A)-($C8="")),"")
Copy cho các ô còn lại