Code của anh quang hai chinh lại tí xíuThử code này coi sao
Sub dem()
Application.ScreenUpdating = False
Dim i, r, k, vung
Set C = Cells
vung = UsedRange
i = UsedRange.Row
k = UBound(vung)
k = k + i - 1
For r = i To k
C(r, 14) = Application.CountBlank(Range(C(r, 1), C(r, 13)))
Next
Application.ScreenUpdating = True
End Sub
Bài em đăng có nhầm 1 chút đếm có điều kiện. Mục đích bài đếm các ô kế tiếp cuối cùng.Nghĩ cũng hơi mắc cười!
Đằng nào thì cũng dùng COUNTBLANK, vậy sao không gõ trực tiếp vào cell (chẳng hạn =COUNTBLANK(A1:M1) ...)
Còn nếu viết thành code VBA thì nên viết theo kiểu xử lý mảng nhầm tăng tốc độ tính toán ---> Khi ấy ta sẽ không dùng đến hàm COUNTBLANK trong code VBA
---------------
Ngoài ra xin nói ngoài lề một chút: Rõ ràng tiêu đề là Đếm các ô liên tiếp bằng VBA ---> Vậy chổ nào trong code hoặc công thức mô tả cái vụ LIÊN TIẾP kia?
Code của anh quang hai chinh lại tí xíu
Sub dem()
Application.ScreenUpdating = False
Dim i, r, k, vung, c
Set c = Cells
vung = UsedRange
k = UBound(vung)
For r = 1 To k
c(r, 14) = Application.CountBlank(Range(c(r, 1), c(r, 13)))
Next
Application.ScreenUpdating = True
End Sub
em có file sau mong các anh chị giúy em đếm các ô liên tiếp bằng VBA thay vì countif dùm em
Cảm ơn mọi người quan tâm!
em xin dính chính lại file và viết code đếm ô liên tiếp cuối cùng
View attachment 83766
Function LastBlanks(ByVal SrcRng As Range)
Dim Arr(), tmpArr, tmp As String
Dim lR As Long, lC As Long, n As Long
On Error Resume Next
tmpArr = SrcRng.Value
ReDim Arr(1 To UBound(tmpArr, 1), 1 To 1)
For lR = 1 To UBound(tmpArr, 1)
lC = UBound(tmpArr, 2)
tmp = CStr(tmpArr(lR, lC))
Do While Len(tmp) = 0
lC = lC - 1
If lC <= 0 Then Exit Do
tmp = CStr(tmpArr(lR, lC))
Loop
Arr(lR, 1) = UBound(tmpArr, 2) - lC
Next
LastBlanks = Arr
End Function
Sub Main()
Dim Arr, SrcRng As Range
Set SrcRng = Range("A1:M14")
Arr = LastBlanks(SrcRng)
SrcRng.Offset(, SrcRng.Columns.Count).Resize(, 1).Value = Arr
End Sub
Thử lại xem sao, cũng không biết là cuối cùng của bạn là so sánh với cột nào.
Sub Dem()
Application.ScreenUpdating = False
Dim i, r, k, j, n, vung, c
Dim Arr()
Set c = Cells
vung = UsedRange
i = UsedRange.Row
j = UBound(vung)
k = j + i - 1
ReDim Arr(1 To j, 1 To 1)
For r = i To k
n = n + 1
Arr(n, 1) = c(r, 14).Column - c(r, 14).End(1).Column
Next
Cells(i, 15).Resize(n, 1) = Arr
Application.ScreenUpdating = True
QUÓToQUỐTEnd Sub[/QUÓT
cuối cùng của em so với điểm cuối có số 1 và bắt đầu đếm từ đó
View attachment Dem lai.xlsx
Bạn sửa code của tôi lại chút là được rồi:cuối cùng của em so với điểm cuối có số 1 và bắt đầu đếm từ đó
Function LastBlanks(ByVal SrcRng As Range, Inc As Long)
Dim Arr(), tmpArr, tmp As String
Dim lR As Long, lC As Long, n As Long
On Error Resume Next
tmpArr = SrcRng.Value
ReDim Arr(1 To UBound(tmpArr, 1), 1 To 1)
For lR = 1 To UBound(tmpArr, 1)
lC = UBound(tmpArr, 2)
tmp = CStr(tmpArr(lR, lC))
Do While Len(tmp) = 0
lC = lC - 1
If lC <= 0 Then Exit Do
tmp = CStr(tmpArr(lR, lC))
Loop
Arr(lR, 1) = UBound(tmpArr, 2) - lC + Inc
Next
LastBlanks = Arr
End Function
Sub Main()
Dim Arr, SrcRng As Range, Inc As Long
Inc = 6
Set SrcRng = Range("A1:J27")
Arr = LastBlanks(SrcRng, Inc)
Range("R1").Resize(UBound(Arr, 1)).Value = Arr
End Sub
Public Function GPE(Rng As Range) As LongBác viết lần đầu rất chuẩn chỉnh lại hỏng hay do bác hiểu nhầm ý em. Bắt đầu đếm từ điểm 1 cuối cùng từ trái qua phải liên tục không gián đoạn tại đâu như file trên. chứ không phải đếm tất cả các ô trống bác ah.
Rất cảm ơn mọi người quan tâm!
View attachment 83784
Bác viết lần đầu rất chuẩn chỉnh lại hỏng hay do bác hiểu nhầm ý em. Bắt đầu đếm từ điểm 1 cuối cùng từ trái qua phải liên tục không gián đoạn tại đâu như file trên. chứ không phải đếm tất cả các ô trống bác ah.
Rất cảm ơn mọi người quan tâm!