Đếm dữ liệu xuất hiện liên tiếp

Liên hệ QC

ducthienluong

Thành viên mới
Tham gia
6/4/11
Bài viết
11
Được thích
2
Các bạn ơi, giúp mình với!

Mình đang cần lập một cái mô hình theo kiểu đếm có điều kiện, mà điều kiện ở đây là dữ liệu xuất hiện liên tiếp và số lần xuất hiện tối đa là 5. Ví dụ, mình cần công thức cho cột H, sao cho nếu dấu "x" xuất hiện đủ 5 lần nhưng liên tiếp nhau ở những cột trước thì kết quả hiện chữ "OK", với những trường hợp còn lại thì để trống:

Untitled.png

Có bạn nào biết nên dùng hàm gì không? Làm ơn giúp mình với! Cám ơn các bạn nhiều lắm!!
 
Lần chỉnh sửa cuối:
Bạn có đọc được cái bảng mà bạn vừa gõ vào không vậy? Tôi thì chịu thua.
Xin hỏi bạn: Thực tế thì bạn có phải đếm các chữ x liên tiếp chỉ ở trên các cột A:G thôi hay còn mở rộng vùng này ra nhiều cột hơn nữa?
Nếu chỉ trên các cột này thì chỉ có thể xảy ra các trường hợp: chữ x nằm ở 5 cột liên tiếp A:E hoặc B:F hoặc C:G. Do đó chỉ cần 1 hàm OR và 3 hàm COUNTIF là có thể xử lý được.
Nếu số cột nhiều hơn thì bạn phải đưa dữ liệu thực tế lên đây thì mới giải quyết được.
 
Cám ơn bạn nghiaphuc nhìu lắm nhé! Đúng là cái bảng trên chỉ là ví dụ đơn giản. Trong thực tế mình phải đếm theo điều kiện như vậy với số cột lên tới 30 cột lận.
 
Cám ơn bạn nghiaphuc nhìu lắm nhé! Đúng là cái bảng trên chỉ là ví dụ đơn giản. Trong thực tế mình phải đếm theo điều kiện như vậy với số cột lên tới 30 cột lận.

Dữ liệu thế nào thì đưa lên thế ấy đi, đừng có ví dụ mất công làm đi làm lại nhiều lần
 
Các bạn ơi, giúp mình với!

Mình đang cần lập một cái mô hình theo kiểu đếm có điều kiện, mà điều kiện ở đây là dữ liệu xuất hiện liên tiếp và số lần xuất hiện tối đa là 5. Ví dụ, mình cần công thức cho cột H, sao cho nếu dấu "x" xuất hiện đủ 5 lần nhưng liên tiếp nhau ở những cột trước thì kết quả hiện chữ "OK", với những trường hợp còn lại thì để trống:

View attachment 101160

Có bạn nào biết nên dùng hàm gì không? Làm ơn giúp mình với! Cám ơn các bạn nhiều lắm!!

"đủ" là "xuất hiện đúng 5 lần" hay "xuất hiện ít nhất 5 lần"?

Xin lỗi. Ở trên bạn viết "tối đa là 5", ở dưới là "đủ 5 lần", do đó phải là "đúng 5 lần".
Vậy tại sao bạn không dùng "đúng 5 lần" mà lại "tối đa"?
-----------
Để thật rõ ràng bạn nên khẳng định lại: "xuất hiện đúng 5 lần" hay "xuất hiện ít nhất 5 lần"
 
Lần chỉnh sửa cuối:
Dữ liệu thế nào thì đưa lên thế ấy đi, đừng có ví dụ mất công làm đi làm lại nhiều lần

Mình không đưa dữ liệu lên chỉ bởi một lý do đơn giản... là chả có có dữ liệu gì để đưa. Mình được giao một cái task, và những gì bạn đọc chính là idea của mình để mình có thể hoàn thành cái task được giao. Và idea của mình bị stuck ở chỗ không biết nên dùng hàm gì và như thế nào...

"đủ" là "xuất hiện đúng 5 lần" hay "xuất hiện ít nhất 5 lần"?

Xin lỗi. Ở trên bạn viết "tối đa là 5", ở dưới là "đủ 5 lần", do đó phải là "đúng 5 lần".
Vậy tại sao bạn không dùng "đúng 5 lần" mà lại "tối đa"?
-----------
Để thật rõ ràng bạn nên khẳng định lại: "xuất hiện đúng 5 lần" hay "xuất hiện ít nhất 5 lần"

Cám ơn bạn rất nhiều vì đã sửa từ ngữ của mình. Đúng là ý mình muốn nói là: xuất hiện đúng 5 lần, và phải liên tiếp nhau. Không biết bạn có suggestion gì giúp mình giải quyết bài toán này không?
 
Chỉnh sửa lần cuối bởi điều hành viên:
Mình không đưa dữ liệu lên chỉ bởi một lý do đơn giản... là chả có có dữ liệu gì để đưa. Mình được giao một cái task, và những gì bạn đọc chính là idea của mình để mình có thể hoàn thành cái task được giao. Và idea của mình bị stuck ở chỗ không biết nên dùng hàm gì và như thế nào...

Cám ơn bạn rất nhiều vì đã sửa từ ngữ của mình. Đúng là ý mình muốn nói là: xuất hiện đúng 5 lần, và phải liên tiếp nhau. Không biết bạn có suggestion gì giúp mình giải quyết bài toán này không?
Bạn cứ task, idea, stuck rồi suggestion, khó hiểu quá, tiếng Việt không có từ nào để thay thế được à? Xin hỏi lại bạn:
1. Nếu các chữ x xuất hiện 6 lần liên tiếp hoặc nhiều hơn thì có được xem là một kết quả hợp lệ không?
2. Nếu sử dụng VBA để giải quyết thì có được chấp nhận không?
 
Bạn cứ task, idea, stuck rồi suggestion, khó hiểu quá, tiếng Việt không có từ nào để thay thế được à? Xin hỏi lại bạn:
1. Nếu các chữ x xuất hiện 6 lần liên tiếp hoặc nhiều hơn thì có được xem là một kết quả hợp lệ không?
2. Nếu sử dụng VBA để giải quyết thì có được chấp nhận không?

Thành thật xin lỗi bạn nếu cách dùng từ của mình khiến bạn khó chịu! Và mình xin trả lời câu hỏi của bạn:
1. Nếu dấu "x" xuất hiện 6 lần liên tiếp hoặc hơn thì kết quả không hợp lệ.
2. Mình chưa có kiến thức về VBA nên không biết nó như thế nào, nhưng nếu nó có thể giúp mình giải quyết được bài toán này thì có sử dụng cũng chẳng sao.

Cám ơn bạn rất nhiều vì đã cùng tham gia và giúp mình giải quyết vấn đề!
 
Thành thật xin lỗi bạn nếu cách dùng từ của mình khiến bạn khó chịu! Và mình xin trả lời câu hỏi của bạn:
1. Nếu dấu "x" xuất hiện 6 lần liên tiếp hoặc hơn thì kết quả không hợp lệ.
2. Mình chưa có kiến thức về VBA nên không biết nó như thế nào, nhưng nếu nó có thể giúp mình giải quyết được bài toán này thì có sử dụng cũng chẳng sao.

Cám ơn bạn rất nhiều vì đã cùng tham gia và giúp mình giải quyết vấn đề!
Tôi sử dụng code như sau, vẫn còn luộm thuộm nhưng tạm thời giải quyết được yêu cầu của bạn:
[GPECODE=vb]Function Check(Rng As Range) As String
Dim Cll As Range
For Each Cll In Rng.Resize(, Rng.Columns.Count - 5)
If WorksheetFunction.CountIf(Cll.Resize(, 6), "x") = 6 Then Exit Function
If WorksheetFunction.CountIf(Cll.Resize(, 5), "x") = 5 Then
Check = "OK"
Exit Function
End If
Next
If WorksheetFunction.CountIf(Rng.Offset(, Rng.Columns.Count - 5).Resize(, 5), "x") = 5 Then Check = "OK"
End Function[/GPECODE]
Cú pháp: =Check(Vùng cần kiểm tra)

Xin hỏi bạn thêm một trường hợp: Trên 1 hàng có 1 vùng có 5 chữ x liên tiếp và 1 vùng khác có hơn 5 chữ x liên tiếp (như hàng 10 trong file đính kèm) có được xem là một kết quả hợp lệ (OK) không? Không biết liệu trong thực tế có trường hợp này không? (hình như code còn trục trặc chỗ này)
 

File đính kèm

  • Test.xlsm
    15.6 KB · Đọc: 24
Lần chỉnh sửa cuối:
Cám ơn bạn rất nhiều vì đã sửa từ ngữ của mình. Đúng là ý mình muốn nói là: xuất hiện đúng 5 lần, và phải liên tiếp nhau. Không biết bạn có suggestion gì giúp mình giải quyết bài toán này không?

Vì bạn nói số cột có thể lên tới 30 nên có thể sẩy ra trường hợp vd. là có 1 khoảng đúng 5 x liên tiếp, 2 khoảng đúng 6 x liên tiếp, 1 khoảng đúng 2 x liên tiếp, 1 khoảng đúng 7 x liên tiếp thì có OK không?
 
Lần chỉnh sửa cuối:
Tôi sử dụng code như sau, vẫn còn luộm thuộm nhưng tạm thời giải quyết được yêu cầu của bạn:
[GPECODE=vb]Function Check(Rng As Range) As String
Dim Cll As Range
For Each Cll In Rng.Resize(, Rng.Columns.Count - 5)
If WorksheetFunction.CountIf(Cll.Resize(, 6), "x") = 6 Then Exit Function
If WorksheetFunction.CountIf(Cll.Resize(, 5), "x") = 5 Then
Check = "OK"
Exit Function
End If
Next
If WorksheetFunction.CountIf(Rng.Offset(, Rng.Columns.Count - 5).Resize(, 5), "x") = 5 Then Check = "OK"
End Function[/GPECODE]
Cú pháp: =Check(Vùng cần kiểm tra)

Xin hỏi bạn thêm một trường hợp: Trên 1 hàng có 1 vùng có 5 chữ x liên tiếp và 1 vùng khác có hơn 5 chữ x liên tiếp (như hàng 10 trong file đính kèm) có được xem là một kết quả hợp lệ (OK) không? Không biết liệu trong thực tế có trường hợp này không? (hình như code còn trục trặc chỗ này)
Góp thêm 1 Function, bất cứ vị trí nào có hơn 5 lần "x" liên tiếp là không hợp lệ.
Hổng đúng thì thôi, hên xui!
PHP:
Public Function Check(Rng As Range) As String
Dim Cll As Range, DK As Long, MaxDK As Long
For Each Cll In Rng
    If UCase(Cll) = "X" Then
        DK = DK + 1
        If DK > MaxDK Then MaxDK = DK
        If MaxDK > 5 Then Exit For
    Else
        DK = 0
    End If
Next
If MaxDK = 5 Then Check = "OK"
End Function
 
Lần chỉnh sửa cuối:
Tôi sử dụng code như sau, vẫn còn luộm thuộm nhưng tạm thời giải quyết được yêu cầu của bạn:
[GPECODE=vb]Function Check(Rng As Range) As String
Dim Cll As Range
For Each Cll In Rng.Resize(, Rng.Columns.Count - 5)
If WorksheetFunction.CountIf(Cll.Resize(, 6), "x") = 6 Then Exit Function
If WorksheetFunction.CountIf(Cll.Resize(, 5), "x") = 5 Then
Check = "OK"
Exit Function
End If
Next
If WorksheetFunction.CountIf(Rng.Offset(, Rng.Columns.Count - 5).Resize(, 5), "x") = 5 Then Check = "OK"
End Function[/GPECODE]
Cú pháp: =Check(Vùng cần kiểm tra)

Xin hỏi bạn thêm một trường hợp: Trên 1 hàng có 1 vùng có 5 chữ x liên tiếp và 1 vùng khác có hơn 5 chữ x liên tiếp (như hàng 10 trong file đính kèm) có được xem là một kết quả hợp lệ (OK) không? Không biết liệu trong thực tế có trường hợp này không? (hình như code còn trục trặc chỗ này)
Nếu code của Nghĩa Phúc đúng như ý tác giả thì mình sẽ dùng công thức này:
Mã:
=IF(SUMPRODUCT(1*(SUBTOTAL(103,OFFSET($A2,,COLUMN($A:$Z)-1,,5))=5))=1,"OK","")
Hoặc cẩn thận hơn:
Mã:
=IF(SUMPRODUCT((1*(SUBTOTAL(103,OFFSET($A2,,COLUMN($A:$Y)-1,,6))=6)))=0,IF(SUMPRODUCT(1*(SUBTOTAL(103,OFFSET($A2,,COLUMN($A:$Z)-1,,5))=5)),"OK",""),"")
Test thử xem
 
Lần chỉnh sửa cuối:
Ôi, thực sự không biết nói gì hơn.... mình cám ơn các bạn, các anh (chị) nhiều nhiều lắm vì đã hết mình giúp đỡ!!!! nhìn thấy giờ reply là đủ hiểu sự nhiệt tình đến mức độ nào rồi, chứ đừng nói chi đến nội dung góp ý.

Thành thật cám ơn!
 
Các bạn ơi, xin giúp mình lần nữa, vẫn bài toán trên, nhưng tình huống mới là bây giờ không chỉ là ký tự "X" mà còn thêm một vài ký tự khác nữa như: "O", "F" hay "R"...

Tức là dữ liệu xuất hiện liên tiếp 5 lần nhưng chỉ là ký tự "X" trong chuỗi liên tiếp ấy thì mới hiện kết quả "OK" thôi, ngoài ra thì bỏ qua tất cả những trường hợp còn lại như: xuất hiện không liên tiếp (đã giải rồi) hoặc xuất hiện liên tiếp 5 lần nhưng chen lẫn là những ký tự như "O", "F" hay "R"....
 
Lần chỉnh sửa cuối:
Các bạn ơi, xin giúp mình lần nữa, vẫn bài toán trên, nhưng tình huống mới là bây giờ không chỉ là ký tự "X" mà còn thêm một vài ký tự khác nữa như: "O", "F" hay "R"...

Tức là dữ liệu xuất hiện liên tiếp 5 lần nhưng chỉ là ký tự "X" trong chuỗi liên tiếp ấy thì mới hiện kết quả "OK" thôi, ngoài ra thì bỏ qua tất cả những trường hợp còn lại như: xuất hiện không liên tiếp (đã giải rồi) hoặc xuất hiện liên tiếp 5 lần nhưng chen lẫn là những ký tự như "O", "F" hay "R"....
Hoặc là bạn chưa thử dùng hàm tự tạo ở bài #9 và bài #11 bên trên.
Hoặc là bạn không biết Enable Macros để dùng hàm tự tạo.
 
Nếu code của Nghĩa Phúc đúng như ý tác giả thì mình sẽ dùng công thức này:
Mã:
=IF(SUMPRODUCT(1*(SUBTOTAL(103,OFFSET($A2,,COLUMN($A:$Z)-1,,5))=5))=1,"OK","")
Hoặc cẩn thận hơn:
Mã:
=IF(SUMPRODUCT((1*(SUBTOTAL(103,OFFSET($A2,,COLUMN($A:$Y)-1,,6))=6)))=0,IF(SUMPRODUCT(1*(SUBTOTAL(103,OFFSET($A2,,COLUMN($A:$Z)-1,,5))=5)),"OK",""),"")
Test thử xem

Mình rất thích 2 cái công thức IF của bạn. Nhưng mình có một thắc mắc, xin bạn giải đáp dùm mình chút nhé, trong công thức của OFFSET, tại sao bạn phải thêm hàm COLUMN mà không để trống hoặc cho giá trị 0 vậy? vì nếu COLUMN($A:$Z)-1 thì cũng là 0 rồi??
 
Các bạn ơi, xin giúp mình lần nữa, vẫn bài toán trên, nhưng tình huống mới là bây giờ không chỉ là ký tự "X" mà còn thêm một vài ký tự khác nữa như: "O", "F" hay "R"...

Tức là dữ liệu xuất hiện liên tiếp 5 lần nhưng chỉ là ký tự "X" trong chuỗi liên tiếp ấy thì mới hiện kết quả "OK" thôi, ngoài ra thì bỏ qua tất cả những trường hợp còn lại như: xuất hiện không liên tiếp (đã giải rồi) hoặc xuất hiện liên tiếp 5 lần nhưng chen lẫn là những ký tự như "O", "F" hay "R"....

Có thể thay SUBTOTAL thành COUNTIF
Mã:
=IF(SUMPRODUCT((1*(COUNTIF(OFFSET($A2,,COLUMN($A:$Y)-1,,6),"x")=6)))=0,IF(SUMPRODUCT(1*(COUNTIF(OFFSET($A2,,COLUMN($A:$Z)-1,,5),"x")=5)),"OK",""),"")
-----------------------
Mình rất thích 2 cái công thức IF của bạn. Nhưng mình có một thắc mắc, xin bạn giải đáp dùm mình chút nhé, trong công thức của OFFSET, tại sao bạn phải thêm hàm COLUMN mà không để trống hoặc cho giá trị 0 vậy? vì nếu COLUMN($A:$Z)-1 thì cũng là 0 rồi??
COLUMN($A:$Z) tạo ra 1 mảng gồm các số từ 1 đến 26
suy ra
COLUMN($A:$Z)-1 tạo ra 1 mảng gồm các số từ 0 đến 25
Chứ hổng phải COLUMN($A:$Z)-1 = 0 đâu nha
 
Có thể thay SUBTOTAL thành COUNTIF
Mã:
=IF(SUMPRODUCT((1*(COUNTIF(OFFSET($A2,,COLUMN($A:$Y)-1,,6),"x")=6)))=0,IF(SUMPRODUCT(1*(COUNTIF(OFFSET($A2,,COLUMN($A:$Z)-1,,5),"x")=5)),"OK",""),"")
-----------------------

COLUMN($A:$Z) tạo ra 1 mảng gồm các số từ 1 đến 26
suy ra
COLUMN($A:$Z)-1 tạo ra 1 mảng gồm các số từ 0 đến 25
Chứ hổng phải COLUMN($A:$Z)-1 = 0 đâu nha

Bạn ơi, bạn có thể giải thích cho mình hiểu một chút về công thức của bạn không? Tại sao phải lồng thêm hàm SUMPRODUCT mà không chỉ đơn giản là IF với logical test là hàm COUNTIF(...) = 5? Rồi tại sao phải có nhân với 1 trong hàm SUMPRODUCT?...

hix.... làm phiền quá... nhờ giải kết quả rồi còn bắt giải thích.... tại mình muốn hiểu để sau này tự áp dụng được. :)
 
Bạn ơi, bạn có thể giải thích cho mình hiểu một chút về công thức của bạn không? Tại sao phải lồng thêm hàm SUMPRODUCT mà không chỉ đơn giản là IF với logical test là hàm COUNTIF(...) = 5? Rồi tại sao phải có nhân với 1 trong hàm SUMPRODUCT?...

hix.... làm phiền quá... nhờ giải kết quả rồi còn bắt giải thích.... tại mình muốn hiểu để sau này tự áp dụng được. :)
Chỗ màu đỏ thì theo tôi hiểu thì thế này: Cái nhóm 5 chữ x hay 6 chữ x ấy có thể xuất hiện (hoặc không xuất hiện) ở bất kỳ vị trí nào trong vùng cần kiểm tra, do đó ở đây phải dùng đến hàm mảng, chứ nếu chỉ đơn thuần 1 hàm COUNTIF thì không thể xác định được cái tham số thứ nhất của hàm COUNTIF này là vùng nào.

Còn chỗ màu xanh thì thiệt tình là tôi thích những người như vậy đấy, hỏi 1 lần để biết, để áp dụng cho lần sau chẳng phải là tốt hơn nhiều so với cứ gặp vấn đề là nhờ người ta giải quyết mà chẳng cần biết người ta đã làm như thế nào sao?

À, nhân tiện, bạn vẫn chưa trả lời câu hỏi hôm qua của tôi: Trên 1 hàng có 1 vùng có 5 chữ x liên tiếp và 1 vùng khác có hơn 5 chữ x liên tiếp thì có được xem là một kết quả hợp lệ hay không?
 
Các bạn ơi, xin giúp mình lần nữa, vẫn bài toán trên, nhưng tình huống mới là bây giờ không chỉ là ký tự "X" mà còn thêm một vài ký tự khác nữa như: "O", "F" hay "R"...

Tức là dữ liệu xuất hiện liên tiếp 5 lần nhưng chỉ là ký tự "X" trong chuỗi liên tiếp ấy thì mới hiện kết quả "OK" thôi, ngoài ra thì bỏ qua tất cả những trường hợp còn lại như: xuất hiện không liên tiếp (đã giải rồi) hoặc xuất hiện liên tiếp 5 lần nhưng chen lẫn là những ký tự như "O", "F" hay "R"....

Đã là "xuất hiện liên tiếp" thì sao lại có "nhưng chen lẫn là những ký tự? Phải hiểu thế nào?
--------
Giúp bạn tôi thấy khó thật vì bạn không miêu tả gì cả.
Tôi thử nhé.

1. Khái niệm.
Trong mỗi dòng trong vùng xác định ngoài ký tự "x" còn có những ký tự bất kỳ. Ta chỉ xét những khoảng - ô liên tiếp - tiếp theo gọi tắt là khoảng - dài nhất có thể mà chứa các ký tự x. Số ô trong khoảng gọi là độ dài của khoảng.
2. Yêu cầu.
Nếu trong dòng có khoảng với độ dài <> 5 (tức 1, 2, 3, 4, >= 6) thì trả về kết quả chuỗi rỗng. Khi và chỉ khi tất cả mọi khoảng đều có độ dài = 5 thì trả về "OK"
-------------
Tôi phát biểu như trên có đúng với yêu cầu của bạn hay không? Đặc biệt chỗ tôi tô mầu đỏ.

Mà bạn nên tạo 1 tập tin trong đó bạn cho ví dụ về phân bố ký tự "x" và các ký tự khác. Bạn làm được thì tại sao lại đùn cho người khác?

Tò mò: do bạn chưa có chỗ nào miêu tả kỹ bài cũ nên tôi tò mò thêm. Cái yêu cầu ở điểm 2, đặc biệt chỗ tô mầu đỏ, có trùng với yêu cầu của bài cũ không? Vì theo tôi hiểu thì bài mới chỉ khác bài cũ ở chỗ thay cho ký tự dấu cách thì có thể là ký tự bất kỳ <> "x". Đúng như thế không.
 
Web KT

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

Back
Top Bottom