Đếm số cột có dữ liệu đầu tiên trong nhóm dòng

Liên hệ QC

pt_hcl

Thành viên hoạt động
Tham gia
15/2/11
Bài viết
138
Được thích
2
Thân gửi GPE! Mình có file dữ liệu ví dụ cho trường hợp nhỏ mong GPE giúp đỡ cách đếm số cột đầu tiên có dữ liệu! Mình xin cảm ơn!
 
Lần chỉnh sửa cuối:
Thân gửi GPE! Mình có file dữ liệu ví dụ cho trường hợp nhỏ mong GPE giúp đỡ cách đếm số cột đầu tiên có dữ liệu! Mình xin cảm ơn!
- Kết quả đặt ở đâu?
- Bạn điền luôn kết quả mà bạn muốn vào file để mọi người tham khảo
Ngoại ra tôi không hiểu chổ này: đếm số cột đầu tiên có dữ liệu là thế nào nhỉ? Đã là CỘT ĐẦU TIÊN thì đương nhiên nó chỉ là 1 CỘT thôi ---> Đếm gì nữa?
Tôi nghĩ có thể bạn muốn XÁC ĐỊNH CỘT ĐẦU TIÊN CÓ DỮ LIỆU chăng? (xem nó là cột thứ mấy)
Bạn nói lại 1 lần nữa cho rõ ràng hơn đi ---> Điền kết quả đúng vào 1 file khác rồi post lên đây
 
- Kết quả đặt ở đâu?
- Bạn điền luôn kết quả mà bạn muốn vào file để mọi người tham khảo
Ngoại ra tôi không hiểu chổ này: đếm số cột đầu tiên có dữ liệu là thế nào nhỉ? Đã là CỘT ĐẦU TIÊN thì đương nhiên nó chỉ là 1 CỘT thôi ---> Đếm gì nữa?
Tôi nghĩ có thể bạn muốn XÁC ĐỊNH CỘT ĐẦU TIÊN CÓ DỮ LIỆU chăng? (xem nó là cột thứ mấy)
Bạn nói lại 1 lần nữa cho rõ ràng hơn đi ---> Điền kết quả đúng vào 1 file khác rồi post lên đây

Vâng! Cảm ơn các bạn! Đếm số cột đầu tiên liên tiếp có dữ liệu như sau ạ:
-Mình lấy ví dụ: ở file trên mình gửi kèm:
+ Nhóm dòng đầu tiên (5;6;7;8;9;10;11): có số cột liên tiếp đầu tiên có dữ liệu là 1 (cột B tô nền xanh): kết quả dán vào phía trên nhóm dòng: ở cột A tô nền vàng chữ số màu đỏ.
+ . . .
+ Nhóm dòng (29;30;31;32;33;34;35): có số cột liên tiếp đầu tiên có dữ liệu là 3 (cột B,C,D tô nền xanh): kết quả dán ở phía trên nhóm dòng:ở cột A tô nền vàng chữ số màu đỏ.
...
- Vì font chữ trong file excel của mình bị lỗi nên mình không chú thích được trực tiếp trong file mong các bạn thông cảm!
- Một lần nữa xin cảm ơn các bạn!
p/s: Ngoài ra các bạn có thể giúp mình đếm số cột liên tiếp nhiều nhất trong nhóm dòng có dữ liệu: Kết quả có thể dán ở phía trên nhóm dòng (ở cột B).
- Chúc GPE một tuần mới thắng lợi!
 
Vâng! Cảm ơn các bạn! Đếm số cột đầu tiên liên tiếp có dữ liệu như sau ạ:
-Mình lấy ví dụ: ở file trên mình gửi kèm:
+ Nhóm dòng đầu tiên (5;6;7;8;9;10;11): có số cột liên tiếp đầu tiên có dữ liệu là 1 (cột B tô nền xanh): kết quả dán vào phía trên nhóm dòng: ở cột A tô nền vàng chữ số màu đỏ.
+ . . .
+ Nhóm dòng (29;30;31;32;33;34;35): có số cột liên tiếp đầu tiên có dữ liệu là 3 (cột B,C,D tô nền xanh): kết quả dán ở phía trên nhóm dòng:ở cột A tô nền vàng chữ số màu đỏ.
...
- Vì font chữ trong file excel của mình bị lỗi nên mình không chú thích được trực tiếp trong file mong các bạn thông cảm!
- Một lần nữa xin cảm ơn các bạn!
p/s: Ngoài ra các bạn có thể giúp mình đếm số cột liên tiếp nhiều nhất trong nhóm dòng có dữ liệu: Kết quả có thể dán ở phía trên nhóm dòng (ở cột B).
- Chúc GPE một tuần mới thắng lợi!
Nếu cấu trúc dữ liệu của bạn đúng "ang chi" như cấu trúc dữ liệu trong bài và nếu mình hiểu đúng câu hỏi (híc) thì bạn "chơi" cái này thử xem sao
Mã:
Public Sub NgoWaChoi()
    Dim Vung, I, J, Wf, K, kK, iMax, SoSanh
    Set Wf = Application.WorksheetFunction
    Set Vung = Range([a4], [a10000].End(xlUp))
        For I = 1 To Vung.Rows.Count Step 8
            For J = 1 To 200
                If Wf.CountA(Vung(I).Resize(8).Offset(, J)) = 0 Then
                    Cells(I + 3, 1) = J - 1
                    If J = 2 Then
                        Cells(I + 3, 2) = 1
                    Else
                            For kK = 1 To 7
                                For K = 1 To J
                                    If K = J Then
                                        iMax = Wf.Max(SoSanh, iMax)
                                        SoSanh = 0
                                    End If
                                    If Vung(I + kK).Offset(, K) <> "" Then
                                        SoSanh = SoSanh + 1
                                    Else
                                        iMax = Wf.Max(SoSanh, iMax)
                                        SoSanh = 0
                                    End If
                                Next K
                            Next kK
                                    Cells(I + 3, 2) = iMax
                   End If
                        Exit For
                End If
            Next J
            iMax = 0: SoSanh = 0
        Next I
End Sub
Công nhận cái bảng này làm nhiều thứ thật, mà nó là cái gì í nhỉ ???
Thân
 
Nếu cấu trúc dữ liệu của bạn đúng "ang chi" như cấu trúc dữ liệu trong bài và nếu mình hiểu đúng câu hỏi (híc) thì bạn "chơi" cái này thử xem sao
Mã:
Public Sub NgoWaChoi()
Dim Vung, I, J, Wf, K, kK, iMax, SoSanh
Set Wf = Application.WorksheetFunction
Set Vung = Range([a4], [a10000].End(xlUp))
For I = 1 To Vung.Rows.Count Step 8
For J = 1 To 200
If Wf.CountA(Vung(I).Resize(8).Offset(, J)) = 0 Then
Cells(I + 3, 1) = J - 1
If J = 2 Then
Cells(I + 3, 2) = 1
Else
For kK = 1 To 7
For K = 1 To J
If K = J Then
iMax = Wf.Max(SoSanh, iMax)
SoSanh = 0
End If
If Vung(I + kK).Offset(, K) <> "" Then
SoSanh = SoSanh + 1
Else
iMax = Wf.Max(SoSanh, iMax)
SoSanh = 0
End If
Next K
Next kK
Cells(I + 3, 2) = iMax
End If
Exit For
End If
Next J
iMax = 0: SoSanh = 0
Next I
End Sub
Công nhận cái bảng này làm nhiều thứ thật, mà nó là cái gì í nhỉ ???
Thân

Vâng! Ngày mới tốt lành!
Đúng rồi bạn ạ, đếm số cột liên tiếp đầu tiên có dữ liệu rất chính xác! Cảm ơn bạn nhiều!
- Còn đếm số cột liên tiếp nhiều nhất trong nhóm dòng có dữ liệu: Kết quả có thể dán ở phía trên nhóm dòng (ở cột B): mình thấy chưa được chính xác ạ? Bạn có thể xem lại giúp mình cách đếm số cột liên tiếp nhiều nhất có dữ liệu trong nhóm dòng với ạ? (không tính số cột liên tiếp đầu tiên có dữ liệu đã làm ở phần trên)
- Ví dụ: ở file dữ liệu trên:
+ Nhóm dòng đầu tiên (5;6;7;8;9;10;11): có số cột liên tiếp nhiều nhất có dữ liệu trong nhóm dòng là: 10 cột -> dán kết quả ở phía trên nhóm dòng (ở cột B) là: 10
...
- Thân ái! Mong tin bạn!

- Chúc GPE một tuần mới thắng lợi!
 
Thêm 1 cái nữa đê!

PHP:
Option Explicit
Sub CountValueColumns()
 Dim Rng As Range, sRng As Range, Cls As Range
 Dim jJ As Long, eRw As Long, Col As Integer, Color_ As Byte, Timer_ As Double
 
 eRw = Range("A" & Cells.Rows.Count).End(xlUp).Row
 Col = [B1].CurrentRegion.Columns.Count
 On Error Resume Next:                          Timer_ = Timer
 Columns("A:A").SpecialCells(xlCellTypeConstants, 21).ClearContents
 On Error GoTo 0:                       Color_ = [A4].Interior.ColorIndex
 Set Rng = [A4].Resize(eRw).SpecialCells(xlCellTypeBlanks)
 If Color_ < 34 Or Color_ > 42 Then
    Color_ = 34
 Else
    Color_ = Color_ + 1
 End If
 For Each Cls In Rng
    Set sRng = Range(Cls.Offset(1), Cls.Offset(1).End(xlDown))
    For jJ = 1 To Col
        If Application.WorksheetFunction.Sum(sRng.Offset(, jJ)) = 0 Then
            sRng(0).Value = jJ - 1
            Exit For
        End If
    Next jJ
 Next Cls
 Rng.Interior.ColorIndex = Color_:          [A1].Value = Timer - Timer_
End Sub

To ConCoGia:

"Để đánh đề đó mà"
 
Lần chỉnh sửa cuối:
Vâng! Ngày mới tốt lành!
Đúng rồi bạn ạ, đếm số cột liên tiếp đầu tiên có dữ liệu rất chính xác! Cảm ơn bạn nhiều!
- Còn đếm số cột liên tiếp nhiều nhất trong nhóm dòng có dữ liệu: Kết quả có thể dán ở phía trên nhóm dòng (ở cột B): mình thấy chưa được chính xác ạ? Bạn có thể xem lại giúp mình cách đếm số cột liên tiếp nhiều nhất có dữ liệu trong nhóm dòng với ạ? (không tính số cột liên tiếp đầu tiên có dữ liệu đã làm ở phần trên)
- Ví dụ: ở file dữ liệu trên:
+ Nhóm dòng đầu tiên (5;6;7;8;9;10;11): có số cột liên tiếp nhiều nhất có dữ liệu trong nhóm dòng là: 10 cột -> dán kết quả ở phía trên nhóm dòng (ở cột B) là: 10
...
- Thân ái! Mong tin bạn!

- Chúc GPE một tuần mới thắng lợi!
Híc, như "zị" là mình hiểu....... "trật lấc" (híc), làm lại thế này, mà hình như các nhóm của bạn có "số cột liên tiếp có dữ liệu" đều là 10 hết thì phải
Mã:
Public Sub NgoWaChoi()
    Dim Vung, I, J, Wf, iMax, SoSanh
    Set Wf = Application.WorksheetFunction
    Set Vung = Range([a4], [a10000].End(xlUp))
        For I = 1 To Vung.Rows.Count Step 8
            For J = 1 To 391
                If Wf.CountA(Vung(I + 1).Resize(7).Offset(, J)) = 0 Then
                    Cells(I + 3, 1) = J - 1
                    Exit For
                End If
            Next J
        Next I
                For I = 1 To Vung.Rows.Count Step 8
                    For J = 1 To 391
                        If J = 392 Then
                            iMax = Wf.Max(iMax, SoSanh)
                            SoSanh = 0
                        End If
                            If Wf.CountA(Vung(I + 1).Resize(7).Offset(, J)) > 0 Then
                                SoSanh = SoSanh + 1
                            Else
                                iMax = Wf.Max(iMax, SoSanh)
                                SoSanh = 0
                            End If
                    Next J
                    Cells(I + 3, 2) = iMax
                    iMax = 0: SoSanh = 0
                Next I
End Sub
Thân
 
PHP:
Option Explicit
Sub CountValueColumns()
 Dim Rng As Range, sRng As Range, Cls As Range
 Dim jJ As Long, eRw As Long, Col As Integer, Color_ As Byte, Timer_ As Double
 
 eRw = Range("A" & Cells.Rows.Count).End(xlUp).Row
 Col = [B1].CurrentRegion.Columns.Count
 On Error Resume Next:                          Timer_ = Timer
 Columns("A:A").SpecialCells(xlCellTypeConstants, 21).ClearContents
 On Error GoTo 0:                       Color_ = [A4].Interior.ColorIndex
 Set Rng = [A4].Resize(eRw).SpecialCells(xlCellTypeBlanks)
 If Color_ < 34 Or Color_ > 42 Then
    Color_ = 34
 Else
    Color_ = Color_ + 1
 End If
 For Each Cls In Rng
    Set sRng = Range(Cls.Offset(1), Cls.Offset(1).End(xlDown))
    For jJ = 1 To Col
        If Application.WorksheetFunction.Sum(sRng.Offset(, jJ)) = 0 Then
            sRng(0).Value = jJ - 1
            Exit For
        End If
    Next jJ
 Next Cls
 Rng.Interior.ColorIndex = Color_:          [A1].Value = Timer - Timer_
End Sub
Thầy ChanhTQ và các Thầy trong GPE có thể giúp đỡ em trường hợp ngược lại là " Đếm số cột KHÔNG có dữ liệu đầu tiên trong nhóm dòng". Cách làm giống như trường hợp "Đếm số cột có dữ liệu đầu tiên trong nhóm dòng" như ở bên trên, nhưng thay cho đếm số cột có dữ liệu đầu tiên thì mình đếm số cột không có dữ liệu đầu tiên.
Xin cảm ơn các Thầy!
 

File đính kèm

  • Demsocotkhongcodulieudautien.xlsm
    22 KB · Đọc: 5
Bạn thử chạy với macro sau, trên file bạn đã đưa lên diễn đàn

PHP:
Option Explicit
Sub CountBlankColumns()
 Dim Tmr As Double, lRw As Long
 Const CF As String = ";"
 Dim Rng As Range, Cls As Range, bRg As Range
 
 lRw = [B1].CurrentRegion.Rows.Count
 Set Rng = Range("A4:A" & lRw):                         Tmr = Timer
 For Each Cls In Rng
    If InStr(Cls.Value, CF) Then
        If Cls.Offset(, 1).Value = "" Then
            Set bRg = Range(Cls.Offset(, 1), Cls.End(xlToRight))
        Else
            Set bRg = Range(Cls.End(xlToRight), Cls.End(xlToRight).End(xlToRight))
        End If
        Cls.Value = Cls.Value & Space(9) & Str(bRg.Columns.Count - 1)
    End If
 Next Cls
 [A1].Value = Timer() - Tmr
End Sub
 
PHP:
Option Explicit
Sub CountBlankColumns()
 Dim Tmr As Double, lRw As Long
 Const CF As String = ";"
 Dim Rng As Range, Cls As Range, bRg As Range
 
 lRw = [B1].CurrentRegion.Rows.Count
 Set Rng = Range("A4:A" & lRw):                         Tmr = Timer
 For Each Cls In Rng
    If InStr(Cls.Value, CF) Then
        If Cls.Offset(, 1).Value = "" Then
            Set bRg = Range(Cls.Offset(, 1), Cls.End(xlToRight))
        Else
            Set bRg = Range(Cls.End(xlToRight), Cls.End(xlToRight).End(xlToRight))
        End If
        Cls.Value = Cls.Value & Space(9) & Str(bRg.Columns.Count - 1)
    End If
 Next Cls
 [A1].Value = Timer() - Tmr
End Sub
Cảm ơn thầy SA_DQ! Thầy ơi, code này của thầy khi e cho chạy là đếm số cột trống của từng dòng một. Còn bài trên thầy có thể giúp tìm "Đếm số cột KHÔNG có dữ liệu đầu tiên trong nhóm dòng", tương tự như bài của thầy ChánhTQ là đếm số cột có dữ liệu đầu tiên trong nhóm dòng! Mong thầy xem giúp ạ!
 
Chắc nó đây & xin mời

PHP:
Option Explicit
Sub CountBlankColumns()
 Dim lRw As Long, J As Long, Col As Integer, Max_ As Integer, SoO As Integer, Tmr As Double
 Dim Rng As Range, Rg0 As Range, Cls As Range, Cll As Range
 
 Tmr = Time()
 lRw = Cells(Cells.Rows.Count, "A").End(xlUp).Row
 Set Rng = Range("A4:A" & lRw).SpecialCells(xlCellTypeConstants, 1)
 Rng.Value = "":                            Col = [B1].CurrentRegion.Columns.Count
 For Each Cls In Rng
    Set Rg0 = Range(Cls.Offset(1), Cls.Offset(1).End(xlDown))
    If Rg0.Cells.Count > lRw Then
        Rg0(0).Value = 0:                   Exit For
    End If
    Max_ = Col
    For Each Cll In Rg0
        If Cll.Offset(, 1).Value <> "" Then
            Max_ = 1:                       Exit For
        Else
            SoO = Range(Cll.Offset(, 1), Cll.Offset(, 1).End(xlToRight)).Cells.Count
            If SoO < Max_ Then
                Max_ = SoO
            End If
        End If
    Next Cll
    Rg0(0).Value = Max_ - 1:                Max_ = Col
 Next Cls
 [a1].Value = Time() - Tmr
End Sub
 
Web KT

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

Back
Top Bottom