tìm SỐ Ô LIÊN TIẾP NHIỀU NHẤT CÓ DỮ LIỆU TRONG DÒNG

Liên hệ QC
Vâng cảm ơn bạn, bạn ơi những ô có chứa dữ liệu là số 0 thì vẫn được tính ạ, trong code của bạn mình chạy thì không đếm dữ liệu là số 0. Bạn xem giúp ạ! Xin cảm ơn bạn1
hãy up file lên để chứng minh điều bạn nói

Mã:
[COLOR=#000000]If Not arr(r, c) = Empty Then[/COLOR]

sửa thành
Mã:
If Len(arr(r, c)) > 0 Then
 
Lần chỉnh sửa cuối:

code bí hiểm như người vậy............hihihihi
mà sao lại phải xài tới 3 vòng lặp lận
giải thích tí cho anh em được mở mang với
(vòng lặp while làm gì vậy?)
============
à hiểu sơ sơ rồi,chắc là để xác định vùng arr từ dòng hiện tại tới cuối bảng
 
Lần chỉnh sửa cuối:
code bí hiểm như người vậy............hihihihi
mà sao lại phải xài tới 3 vòng lặp lận
giải thích tí cho anh em được mở mang với
(vòng lặp while làm gì vậy?)
============
à hiểu sơ sơ rồi,chắc là để xác định vùng arr từ dòng hiện tại tới cuối bảng

không đơn giản vậy đâu bồ ơi
khi mảng mà đòi nhét dữ liệu lớn quá là nó bị OVER FLOW liền . dữ liệu lên hàng triệu dòng thì ta chỉ có cách chặt ra lấy từng 50 000 dòng ra đọc thôi .
 
hãy up file lên để chứng minh điều bạn nói

Mã:
[COLOR=#000000]If Not arr(r, c) = Empty Then[/COLOR]

sửa thành
Mã:
If Len(arr(r, c)) > 0 Then
Vâng, cảm ơn bạn rất rất nhiều! Chính xác rồi bạn ạ.
Mình xin hỏi thêm một chút: code này chỉ chạy với sheet1, nhưng muốn chạy với sheet khác thì mình làm thế nào ạ? Xin cảm ơn bạn!
 
Bạn xem kết quả dòng 13 chính xác không ạ!
Cảm ơn bạn, kết quả ở dòng 13 phải là 99 ạ! Mặt khác nếu ô có dữ liệu là số 0 thì vẫn được tính ạ, trong code của bạn không đếm ô dữ liệu có chứa số 0. Rất mong bạn xem lại giúp!
 
Mong GPE giúp đỡ mình trường hợp này, mình có bảng dữ liệu cần tìm SỐ Ô LIÊN TIẾP NHIỀU NHẤT CÓ DỮ LIỆU MÀ ĐỨNG TRƯỚC NÓ LÀ CÓ ÍT NHẤT 1 Ô TRỐNG KHÔNG CÓ DỮ LIỆU đối với từng dòng. Mình có gửi file minh hoạ. Kết quả đếm số cột liên tiếp có dữ liệu nhiều nhất được ghi vào cột 4. File thực tế có vùng dữ liệu rất lớn: (D4: DB966748). Rất mong GPE giúp đỡ. Xin cảm ơn!
Thử vầy xem
PHP:
Sub HôAndLé()
Const StartR As Long = 4, StartC As Long = 7
Dim EndR As Long, EndC As Long, Cols As Long, i As Long, j As Long, jStart As Long, ArrData, ArrResult() As Long, iResult As Long, Status As Boolean
EndR = Cells(&H100000, StartC - 1).End(xlUp).Row
EndC = Cells(StartR - 1, &H4000).End(xlToLeft).Column
If EndR < StartR Or EndC < StartC Then Exit Sub
ArrData = Range(Cells(StartR, StartC), Cells(EndR, EndC)).Value
ReDim ArrResult(1 To UBound(ArrData, 1), 1 To 1)
Cols = EndC - StartC + 1
For i = 1 To UBound(ArrData, 1)
    For j = 1 To Cols
        If Len(ArrData(i, j)) = 0 Then GoTo HasBlank
    Next
    GoTo Next_i
HasBlank:
    Status = False:    jStart = j:  iResult = 0
    Do: Do
            j = j + 1
            If j > Cols Then Exit Do
        Loop Until (Len(ArrData(i, j)) > 0) Xor Status
        If Status And j - jStart > iResult Then iResult = j - jStart
        Status = Not Status:    jStart = j
    Loop Until j > Cols
    ArrResult(i, 1) = iResult
Next_i:
Next
Range("D4:D" & EndR).Value = ArrResult
End Sub
 
Lần chỉnh sửa cuối:
Thử vầy xem
PHP:
Sub HôAndLé()
Const StartR As Long = 4, StartC As Long = 7
Dim EndR As Long, EndC As Long, Cols As Long, i As Long, j As Long, jStart As Long, ArrData, ArrResult() As Long, iResult As Long, Status As Boolean
EndR = Cells(&H100000, StartC - 1).End(xlUp).Row
EndC = Cells(StartR - 1, &H4000).End(xlToLeft).Column
If EndR < StartR Or EndC < StartC Then Exit Sub
ArrData = Range(Cells(StartR, StartC), Cells(EndR, EndC)).Value
ReDim ArrResult(1 To UBound(ArrData, 1), 1 To 1)
Cols = EndC - StartC + 1
For i = 1 To UBound(ArrData, 1)
    For j = 1 To Cols
        If Len(ArrData(i, j)) = 0 Then GoTo HasBlank
    Next
    GoTo Next_i
HasBlank:
    Status = False:    jStart = j:  iResult = 0
    Do: Do
            j = j + 1
            If j > Cols Then Exit Do
        Loop Until (Len(ArrData(i, j)) > 0) Xor Status
        If Status And j - jStart > iResult Then iResult = j - jStart
        Status = Not Status:    jStart = j
    Loop Until j > Cols
    ArrResult(i, 1) = iResult
Next_i:
Next
Range("D4:D" & EndR).Value = ArrResult
End Sub
Cảm ơn bạn nhiều quá, chuẩn không cần chỉnh ạ! Cảm ơn GPE!
- Bạn ơi cho mình hỏi trong code của bạn chỗ nào yêu cầu thực hiện vẫn tính ô có dữ liệu là số 0 ạ? Vì mình thấy trong code khác của các bạn cứ ô có dữ liệu là số 0 thì lại không đếm? Mong bạn chỉ giúp! Cảm ơn bạn!
 
Mong GPE giúp đỡ mình trường hợp này, mình có bảng dữ liệu cần tìm SỐ Ô LIÊN TIẾP NHIỀU NHẤT CÓ DỮ LIỆU MÀ ĐỨNG TRƯỚC NÓ LÀ CÓ ÍT NHẤT 1 Ô TRỐNG KHÔNG CÓ DỮ LIỆU đối với từng dòng. Mình có gửi file minh hoạ. Kết quả đếm số cột liên tiếp có dữ liệu nhiều nhất được ghi vào cột 4. File thực tế có vùng dữ liệu rất lớn: (D4: DB966748). Rất mong GPE giúp đỡ. Xin cảm ơn!

Tham khảo 1 đoạn code. Thời gian chạy cho 1000000 dòng khoảng 300s
Xem chơi chứ dữ liệu lớn thế này chắc không dùng được

Dữ liệu trong 1 ô nếu có chỉ là 1 số
Chèn thêm sheet2 rồi chạy

Mã:
Public Sub LienTuc()
Dim reg As Object, kq(), Dong, r As Long, tg
tg = Timer

On Error Resume Next
Dong = Sheet1.UsedRange.Rows.Count
ReDim kq(1 To Dong, 1 To 1)

Set reg = CreateObject("vbscript.regexp")
reg.Global = True
reg.Pattern = "(\d)\s"

With CreateObject("MSScriptControl.ScriptControl")
.Language = "JavaScript"
For r = 4 To Dong
kq(r, 1) = Join(Application.Transpose(Application.Transpose(Sheet1.Range("G" & r, "DB" & r))))
kq(r, 1) = reg.Replace(kq(r, 1), "$1")
kq(r, 1) = Split(kq(r, 1), " ")
kq(r, 1)(0) = ""
kq(r, 1) = Application.Trim(Join(kq(r, 1), " "))
kq(r, 1) = .Eval("('" & kq(r, 1) & "').split(' ').sort(function (a, b) { return a - b; }).reverse()")
kq(r, 1) = Len(Split(kq(r, 1), ",")(0))
Next r
End With

With Sheet2
.UsedRange.Clear
.Range("A1").Resize(UBound(kq), 1) = kq
.Range("A1") = Timer - tg
End With

End Sub
 
Web KT

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

Back
Top Bottom