[Nhờ giúp] Về hàm tách dữ liệu

Liên hệ QC

bao_nhu

Thành viên mới
Tham gia
16/12/13
Bài viết
16
Được thích
4
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.
 

File đính kèm

  • DS Thông tin.xlsx
    457.7 KB · Đọc: 35
Tại AA8:
=$C$7
AB8:
Mã:
=IFERROR(INDEX($C$7:$Z$7,SMALL(IF($D8:$Z8=$C8:$Y8,"",$D$6:$Z$6),COLUMNS($A:A))),"")
Kết thúc bằng Ctrl-Shift-Enter
Copy sang phải
Copy cả dòng xuống
 
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.
Trong file bạn yêu cầu:
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.
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 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.
Mã:
 AA8 =IFERROR(SMALL(IF($C8:$Z8=$B8:$Y8,"",$C$7:$Z$7),COLUMNS($A:A)-($C8="")),"")
Ctrl+Shift+Enter
Copy cho các ô còn lại
 

File đính kèm

  • DS Thông tin (1).xlsx
    853.7 KB · Đọc: 14
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 ạ.
- 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
 
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^
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 ạ.
 
Mã:
 AA8 =IFERROR(SMALL(IF($C8:$Z8=$B8:$Y8,"",$C$7:$Z$7),COLUMNS($A:A)-($C8="")),"")
Ctrl+Shift+Enter
Copy cho các ô còn lại
Em 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 ạ.
 
- 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
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 ạ.
 
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 ạ.
Góp thêm một công thức:
Mã:
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ỉ Enter. Copy qua phải, rồi fill cả hàng xuống.
Bạn cũng có thể sử dụng công thức của anh @HieuCD bằng cách thay đổi dấu trừ thành dấu cộng.
Xem file kèm.
hihi ^o^
 

File đính kèm

  • GPE_DSThông tin.xlsb
    227 KB · Đọc: 5
Lần chỉnh sửa cuối:
Em 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 ạ.
Chỉnh lại công thức
Mã:
AA8 =IFERROR(SMALL(IF($C8:$Z8=$B8:$Y8,"",$C$7:$Z$7),COLUMNS($A:A)+($C8="")*(2*(AA$7="A")-1)),"")
Ctrl+Shift+Enter
 

File đính kèm

  • DS Thông tin (1).xlsx
    882.5 KB · Đọc: 7
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 ạ.
Kết quả ví dụ chưa tổng quát làm cho khó hiểu quá.
Xem lại file này, nếu chưa đúng thì "la lên" nữa nhé.
 

File đính kèm

  • DS Thông tin.rar
    116.8 KB · Đọc: 8
Web KT

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

Back
Top Bottom