Cần anh chị giúp em cách đếm số lần xuất hiện liên tục nhiều nhất (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

TrumUcChe

Thành viên mới
Tham gia
12/10/11
Bài viết
2
Được thích
1
Hiện tại em cần đếm số lần xuất hiện liên tục của số 3 hoặc số 1 trong cột X. Ví dụ: ta xem trong cột X có thứ tự xuât hiên như sau: 3-1-1-3-3-1-1-1-3-3-3-1-1-1-1-3-3-3-3-1 . Em đang cần là 1 hàm nào đó thống kê xem số 1 xuất hiện liên tục bao nhiêu lần là cao nhất,số 3 xuất hiện liên tục bao nhiêu lần là cao nhất. Ở ví dụ trên thì số 3 xuất hiện liên tuc cao nhất là 4 lần,còn số 1 xuất hiện liên tục cao nhất là 4 lần.
Em chân thành cám ơn sự giúp đỡ của anh chị !
 

File đính kèm

Bài này của bạn mình nghĩ chỉ có cách viết VBA thôi. Mình đã viết Sub và kiểm tra thấy chạy tốt. Bạn xem file đính kèm nhé. Nhớ enable macro.
 

File đính kèm

Lần chỉnh sửa cuối:
Dùng sub thông thường thì có nhược điểm sau:
- Khi dữ liệu không nằm tại cột A hoặc không nằm bắt đầu từ dòng 1 thì phải sửa code
- Chỉ đếm dọc, không đếm được ngang và ngược lại
- Ô kết quả và ô điều kiện bị chỉ định, không làm chỗ khác được. Nếu ô đang chỉ định là ô chứa dữ liệu, thì phải sửa, mà cũng lại là chỉ định chỗ khác.

Ngoài ra, code của anhkt08 có điểm yếu sau:
- Giải thuật phức tạp
- Phải dùng cell tạm trên bảng tính, nếu cell tạm đó đang chứa dữ liệu thì bị mất, hoặc lại phải sửa code.
- Xác định Range để làm việc dư (A1:A6000)

Khắc phục:

- Dùng Function
- Không dùng For i mà dùng For Each để có thể đếm ngang dọc gì cũng được
- Dùng giải thuật đơn giản hơn
- Không dùng cell tạm mà dùng biến.

PHP:
Function DemMax(Rng As Range, Criteria)
Dim Clls As Range, DemTmp As Long, DemMaxTmp As Long
For Each Clls In Rng
    If Clls.Value = Criteria Then
        DemTmp = DemTmp + 1
        If DemTmp >= DemMaxTmp Then DemMaxTmp = DemTmp
    Else
        DemTmp = 0
    End If
Next
DemMax = DemMaxTmp
End Function

Đây chỉ mới đếm cho vùng 1 dòng hoặc 1 cột. Nếu muốn đếm cho 1 vùng chữ nhật (2 chiều) thì thêm 1 chút.
 

File đính kèm

Lần chỉnh sửa cuối:
cám ơn bạn đã góp ý. Mình cũng chỉ biết chút ít về vba thôi. Rất mong được mọi người chỉ bảo thêm
 
Dùng sub thông thường thì có nhược điểm sau:
- Khi dữ liệu không nằm tại cột A hoặc không nằm bắt đầu từ dòng 1 thì phải sửa code
- Chỉ đếm dọc, không đếm được ngang và ngược lại
- Ô kết quả và ô điều kiện bị chỉ định, không làm chỗ khác được. Nếu ô đang chỉ định là ô chứa dữ liệu, thì phải sửa, mà cũng lại là chỉ định chỗ khác.
Ngoài ra, code của anhkt08 có điểm yếu sau:
- Giải thuật phức tạp
- Phải dùng cell tạm trên bảng tính, nếu cell tạm đó đang chứa dữ liệu thì bị mất, hoặc lại phải sửa code.
- Xác định Range để làm việc dư (A1:A6000)
Khắc phục:
- Dùng Function
- Không dùng For i mà dùng For Each để có thể đếm ngang dọc gì cũng được
- Dùng giải thuật đơn giản hơn
- Không dùng cell tạm mà dùng biến.
Đây chỉ mới đếm cho vùng 1 dòng hoặc 1 cột. Nếu muốn đếm cho 1 vùng chữ nhật (2 chiều) thì thêm 1 chút.

Một cách khác không dùng code (Mượn file của sư phụ ptm0412 để đối chiếu):

Đếm dọc:
Mã:
=MAX(FREQUENCY(IF(A2:A37=$I$4,ROW(A2:A37)),IF(A2:A37<>$I$4,ROW(A2:A37))))

Đếm ngang:
Mã:
=MAX(FREQUENCY(IF(B1:X1=$I$4,COLUMN(B1:X1)),IF(B1:X1<>$I$4,COLUMN(B1:X1))))

Kết thúc bằng Ctrl-Shift-Enter

!$@!! !$@!! !$@!! !$@!!
 

File đính kèm

Mở rộng đếm Max liên tục trong vùng hình chữ nhật:
PHP:
Function DemMax2D(Rng As Range, Criteria, Optional Direction = "D")
Dim DemTmp As Long, DemMaxTmp As Long, SArray
SArray = Rng.Value
If Direction = "D" Then
    For j = 1 To UBound(SArray, 2)
        For i = 1 To UBound(SArray, 1)
            If SArray(i, j) = Criteria Then
                DemTmp = DemTmp + 1
                If DemTmp >= DemMaxTmp Then DemMaxTmp = DemTmp
            Else
                DemTmp = 0
            End If
        Next
    DemTmp = 0
    Next
Else
    For i = 1 To UBound(SArray, 1)
        For j = 1 To UBound(SArray, 2)
            If SArray(i, j) = Criteria Then
                DemTmp = DemTmp + 1
                If DemTmp >= DemMaxTmp Then DemMaxTmp = DemTmp
            Else
                DemTmp = 0
            End If
        Next
    DemTmp = 0
    Next
End If
DemMax2D = DemMaxTmp

End Function
 

File đính kèm

3D thì lồng thêm 1 vòng lặp
Muốn thức hông?
 
Hic,doc vo thuat ngu em bi sốc mấy anh ơi.Chắc em phải nghiên cứu từ từ các hàm quá.Em xin chân thành cảm ơn!

Một cách khác không dùng code (Mượn file của sư phụ ptm0412 để đối chiếu):
Đếm dọc:
Mã:
=MAX(FREQUENCY(IF(A2:A37=$I$4,ROW(A2:A37)),IF(A2:A37<>$I$4,ROW(A2:A37))))
Đếm ngang:
Mã:
=MAX(FREQUENCY(IF(B1:X1=$I$4,COLUMN(B1:X1)),IF(B1:X1<>$I$4,COLUMN(B1:X1))))
Kết thúc bằng Ctrl-Shift-Enter
!$@!! !$@!! !$@!! !$@!!
Lệnh này thix ghê hihi. Cảm ơn anh nhiều nha
 
Chỉnh sửa lần cuối bởi điều hành viên:
Web KT

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

Back
Top Bottom