Tạo UDF để đếm số phần tử với điều kiện là độ dài của phần tử

Liên hệ QC

ontopoftheworld

Am a Peasant Guy
Tham gia
17/3/07
Bài viết
109
Được thích
182
Cụ thể như sau:
Cột A
FEWF
AEF
FEWG
EGR
GEGH
GEG
Tạo UDF như thế nào để có thể đếm số phần tử(giống hàm countif) nhưng điều kiện ở đây là độ dài(=3 theo ví dụ trên) của phần tử
Em cám ơn trước.
 
Lần chỉnh sửa cuối:
Trường hợp này không cần xây dựng UDF đâu bạn ạ. Bạn có thể dùng hàm có sẵn DCOUNTA để làm như file đính kèm.
 

File đính kèm

Upvote 0
Cụ thể như sau:
Cột A
FEWF
AEF
FEWG
EGR
GEGH
GEG
Tạo UDF như thế nào để có thể đếm số phần tử(giống hàm countif) nhưng điều kiện ở đây là độ dài(=3 theo ví dụ trên) của phần tử
Em cám ơn trước.
Cũng có thể dùng sumproduct(--(len(a1:a100)=3))
 
Upvote 0
anh Thu Nghi ơi, em muốn hỏi trong VBA đó anh, còn dùng hàm mảng thì em có thể dùng được.



Minh Hòa
 
Upvote 0
anh Thu Nghi ơi, em muốn hỏi trong VBA đó anh, còn dùng hàm mảng thì em có thể dùng được.



Minh Hòa
Lại thế nữa. Hàm có sẵn lại không dùng muốn UDF.
Chiều ý thôi.
PHP:
Function Dem(rng As Range)
Dim i As Long, eRow As Long, KQ As Long
On Error Resume Next
KQ = 0
eRow = rng.Rows.Count
If eRow = 0 Then Exit Function
For i = 1 To eRow
    If Len(rng(i)) = 3 Then KQ = KQ + 1
Next
Dem = KQ
End Function
 
Upvote 0
VBA thì bạn có thể thử dùng hàm này xem sao.
Mã:
Function CountByLen(arr As Range, iLength As Integer) As Long
    Dim Temp As Range
    Dim iCount As Long
    For Each Temp In arr
        If Len(Temp) = iLength Then iCount = iCount + 1
    Next
    CountByLen = iCount
End Function
 
Upvote 0
To Rollover79: Code của Bác không làm việc
To Anh Thu Nghi: Em có ý đồ riêng mà dùng hàm mảng thì rối rắm giữa VBA và hàm Excel, em muốn tách biệt giữa 2 anh chàng này, nhưng bị tịt ngòi giữa đường. Em mò mãi mà chẳng chịu ra mấy hôm nay. Cuối cùng phải post lên hỏi.
Cám ơn Anh nhiều.

MH
 
Upvote 0
bạn thử nhập vào 1 ô nào đó công thức này xem có hoạt động không nhé. Hàm của mình viết cho trường hợp tổng quát là đếm trong 1 vùng bất kỳ các ô có độ dài xác định do người dùng truyền vào.
Mã:
=CountByLen(A2:A8,3)
Hàm của ThuNghi chỉ đúng trong trường hợp vùng truyền vào nằm trên 1 cột duy nhất. Nếu truyền vào 1 vùng nằm trên các cột khác nhau sẽ không cho ra kết quả đúng.
 
Upvote 0
Đúng là hàm của bạn tổng quát hơn!
Nhưng để thỏa mong ước tác giả Topic, bạn nên thêm tùy chọn vô biến thứ hai,
Theo kiểu:

Mã:
Function CountByLen(arr As Range, Optional iLength As Byte = 3) As Long
Lúc đó đỡ bị thắc mắc rồi!
 
Upvote 0
Dùng vòng lặp cũng là một điều tốt.
Tuy nhiên sẽ nhanh hơn nhiều nếu sử dụng phương thức Find, khi mảng tìm kiếm là rộng thì sẽ thấy rất rõ.

PHP:
.Find(What:="???", After:=ActiveCell, LookIn:=xlValues, LookAt:= xlWhole,  MatchCase:=False )

Khi viết hàm chú ý việc bẫy lỗi, tuy đơn giản nhưng thiếu nó nhiều khi lại khóc ròng (và người khác lại càng không hiểu)

SA tiên sinh lại giấu không cho hậu nhân biết các "tiểu xảo" trong UDF sao!:=\+

Thân!
 
Lần chỉnh sửa cuối:
Upvote 0
VBA thì bạn có thể thử dùng hàm này xem sao.
Mã:
Function CountByLen(arr As Range, iLength As Integer) As Long
    Dim Temp As Range
    Dim iCount As Long
    For Each Temp In arr
        If Len(Temp) = iLength Then iCount = iCount + 1
    Next
    CountByLen = iCount
End Function
Thế sao không là:
PHP:
Function CountByLen(arr As Range, iLength As Integer) As Long
    Dim Temp As Range
    Dim iCount As Long
    For Each Temp In arr
      iCount = iCount - (Len(Temp) = iLength)
    Next
    CountByLen = iCount
End Function
Cho gọn (Khỏi IF ét gì cả)
Không thì SUMPRODUCT cho rồi
=SUMPRODUCT((LEN(Vùng)= Điều kiện)*1)
 
Upvote 0
Upvote 0
Upvote 0
Tham gia chút cho vui.
Mục đính của bạn ontopoftheworld là dùng VBA, nhưng theo tôi bạn nên dùng ngay hàm CountIf với cú pháp như sau:

hoặc kết hợp với hàm Rept



P/s:
- Số lượng dấu "?" chính là số ký tự bạn cần
- Nếu bạn thích dùng VBA thì tạo 1 hàm trong VBA và gọi chính hàm CountIf của M$ Excel, chắc chắn sẽ nhanh hơn cách chúng ta sử dụng các vòng lặp.
 
Upvote 0
Cám ơn Anh NVSON rất nhiều về hai hàm mới trên đây(riêng với em).
Còn cách mà viết hàm VBA để gọi đích danh hàm Countif của Excel thì thực tình là em không biết nó như thế nào. Có thể trên GPE có mà em không biết chăng.?
Anh Sơn có 1 ví dụ nào cho em tham khảo về cách thức viết được không ạh.

Cám ơn Anh nhiều.
 
Upvote 0
Cám ơn Anh NVSON rất nhiều về hai hàm mới trên đây(riêng với em).
Còn cách mà viết hàm VBA để gọi đích danh hàm Countif của Excel thì thực tình là em không biết nó như thế nào. Có thể trên GPE có mà em không biết chăng.?
Anh Sơn có 1 ví dụ nào cho em tham khảo về cách thức viết được không ạh.

Cám ơn Anh nhiều.
WORKSHEETFUNCTION.COUNTIF(........)
Kết hợp viết ra 1 code dem
Cú pháp dem(Vungdem,sokytu)
PHP:
Function Dem(Rng As Range, Optional iLength As Byte = 3) As Long
Dim i As Long, eRow As Long, KQ As Long, iText As String
On Error Resume Next
eRow = Rng.Count
If eRow = 0 Then Exit Function
iText = WorksheetFunction.Rept("?", iLength)
KQ = WorksheetFunction.CountIf(Rng, iText)
Dem = KQ
End Function
 
Upvote 0
Cám ơn Anh NVSON rất nhiều về hai hàm mới trên đây(riêng với em).
Còn cách mà viết hàm VBA để gọi đích danh hàm Countif của Excel thì thực tình là em không biết nó như thế nào. Có thể trên GPE có mà em không biết chăng.?
Anh Sơn có 1 ví dụ nào cho em tham khảo về cách thức viết được không ạh.

Cám ơn Anh nhiều.

Bạn xem nhé

PHP:
WorksheetFunction.CountIf(Range("A1:B50"), "???")

Thân!
 
Upvote 0
Lý ra phải đầy đủ thế này:
Application.WorksheetFunction.CountIf([A1:A10], "???")
Nhưng bỏ Application hoặc WorksheetFunction đều thấy không có vấn đề
PHP:
Sub Test()
   [C1] = Application.CountIf([A1:A10], "???")
End Sub
Hoặc
PHP:
Sub Test()
   [C1] = WorksheetFunction.CountIf([A1:A10], "???")
End Sub
Tôi test mấy hôm nay đều được (mà không hiểu tại sao nó... được)
Hic...
 
Lần chỉnh sửa cuối:
Upvote 0
Tuy nhiên sẽ nhanh hơn nhiều nếu sử dụng phương thức Find, khi mảng tìm kiếm là rộng thì sẽ thấy rất rõ.
PHP:
.Find(What:="???", After:=ActiveCell, LookIn:=xlValues, LookAt:= xlWhole,  MatchCase:=False )
Thân!
Vậy các bạn cho biết với:
Viết hàm áp dụng phương thức FIND() này & ApplicationFunction thì cái nào sẽ có triển vọng nhanh hơn cái nào vậy?

Xin cảm ơn các bác nhiều!@$@!^%+-+-+-+:=\+
 
Upvote 0
Vậy các bạn cho biết với:
Viết hàm áp dụng phương thức FIND() này & ApplicationFunction thì cái nào sẽ có triển vọng nhanh hơn cái nào vậy?

Xin cảm ơn các bác nhiều!@$@!^%+-+-+-+:=\+

Mình chưa thử nghiệm giữa Find và WorkbookFunction, tuy nhiên mình nghĩ WF đã được Bill tối ưu hóa hoàn toàn, vì vậy nó sẽ nhanh hơn.

Do đó có thể nói
  1. WF là nhanh nhất
  2. Find nhanh thứ nhì
  3. Vòng lặp là chậm nhất
Khi dữ liệu nhiều thì ta áp dụng WorkbookFunction.Match nhanh hơn Vòng lặp nhiều. Tuy nhiên match vẫn chậm hơn Find

PHP:
WorksheetFunction.Match(Range("A1:B50"), "???",0)
Match chậm hơn Countif bởi Match chỉ có thể dùng cho một cột, hay một hàng. Và với 1 ĐK thỏa thì nó chỉ trả về 1 lần.

Thân!
 
Upvote 0
Web KT

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

Back
Top Bottom