Nghĩa là sao bạn? Bạn nói cụ thể hơn đi với file dữ liệu của bạnsố cột đầu tiên có dữ liệu
- Kết quả đặt ở đâu?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
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 saoVâ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!
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
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
Công nhận cái bảng này làm nhiều thứ thật, mà nó là cái gì í nhỉ ???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
Thân
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
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ảiVâ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!
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ầ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.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
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 ạ!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
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