Giúp code đếm 1 ký tự trong 1 vùng (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

minhtuan55

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
23/3/16
Bài viết
705
Được thích
52
Chào cả nhà GPE ! CHúc cả nhà Giáng sinh vui vẽ
Cả nhà giúp em đoạn code đểm 1 ký tự nào đó xuất hiện bao nhiêu lần trong 1 vùng. Xin chân thành cảm ơn
 

File đính kèm

1/ Ctrl + H
Find what:
- Với ký tự *: ~*
- Với ký tự ?: ~?
- Với ký tự ;: ;

2/
Mã:
J7=SUMPRODUCT(LEN($D$7:$D$21)*1)-SUMPRODUCT(LEN(SUBSTITUTE($D$7:$D$21,I7,""))*1)
 
Upvote 0
Xin chuyển đến bạn hàm người dùng sau:
PHP:
Function DemKiTu(KT As String, Rng As Range)
 Dim sRng As Range, Cls As Range, Rg0 As Range
 Dim Tmp As String
 Dim Dem As Integer, VTr As Byte

 Set sRng = Rng.Find(KT, , xlFormulas, xlPart)
 If sRng Is Nothing Then
    MsgBox "Nothing"
 Else
    Set Rg0 = Range(sRng, Rng(Rng.Rows.Count))
    For Each Cls In Rg0
        Tmp = Cls.Value & "GPE.COM"
        Do
            VTr = InStr(Tmp, KT)
            If VTr Then
                DemKiTu = DemKiTu + 1
                Tmp = Mid(Tmp, VTr + 1, Len(Tmp))
            Else
                Exit Do
            End If
        Loop
    Next Cls
 End If
End Function
 
Upvote 0
Chào cả nhà GPE ! CHúc cả nhà Giáng sinh vui vẽ
Cả nhà giúp em đoạn code đểm 1 ký tự nào đó xuất hiện bao nhiêu lần trong 1 vùng. Xin chân thành cảm ơn
Có ký tự nào cần đếm mà liên quan đến việc phân biệt HOA thường không?
Bởi nếu bạn muốn viết một hàm tổng quát (dùng cho mọi nơi) thì bạn phải tính toán đến điều này
 
Upvote 0
Xin chuyển đến bạn hàm người dùng sau:
PHP:
Function DemKiTu(KT As String, Rng As Range)
 Dim sRng As Range, Cls As Range, Rg0 As Range
 Dim Tmp As String
 Dim Dem As Integer, VTr As Byte

 Set sRng = Rng.Find(KT, , xlFormulas, xlPart)
 If sRng Is Nothing Then
    MsgBox "Nothing"
 Else
    Set Rg0 = Range(sRng, Rng(Rng.Rows.Count))
    For Each Cls In Rg0
        Tmp = Cls.Value & "GPE.COM"
        Do
            VTr = InStr(Tmp, KT)
            If VTr Then
                DemKiTu = DemKiTu + 1
                Tmp = Mid(Tmp, VTr + 1, Len(Tmp))
            Else
                Exit Do
            End If
        Loop
    Next Cls
 End If
End Function
Code này nếu để đếm ký tự đơn thì được chứ đếm 1 chuỗi nhiều ký tự thì sai sư phụ à
Chẳng hạn đếm có bao nhiêu dấu ;;
 
Upvote 0
Đó là làm theo đề nghị của chủ bài đăng mà.
Còn đếm chuỗi kí tự thì fải sửa tiếp hàm thôi.
 
Upvote 0
Đó là làm theo đề nghị của chủ bài đăng mà.
Còn đếm chuỗi kí tự thì fải sửa tiếp hàm thôi.

Đếm chuỗi thì dùng Regex là hiệu quả nhất. Regex nó như một chiếc xe tải công ten nơ, làm việc hàng đống như thế này mới thấy sức mạnh của nó.
 
Upvote 0
Em yêu cầu rất rõ và ví dụ có ** và ;; mà anh
Tôi thấy chứ! Vấn đề hiện nay người ta nghĩ rằng bạn muốn đếm 1 ký tự, tức đến 1 dấu * hoặc 1 dấu ;
Còn tôi thì nghĩ đến hướng tổng quát: muốn đếm cái gì cũng được
Ví dụ:
- Ta có chuỗi N**DU
- Nếu bạn muốn đếm 1 dấu * thì kết quả sẽ = 2
- Nếu bạn muốn đếm 2 dấu * (tức đếm **) thì kết quả sẽ =1
Vậy thôi!
 
Upvote 0
Chào cả nhà GPE ! CHúc cả nhà Giáng sinh vui vẽ
Cả nhà giúp em đoạn code đểm 1 ký tự nào đó xuất hiện bao nhiêu lần trong 1 vùng. Xin chân thành cảm ơn
Mã:
Function CountChar(Rng As Variant, Ch As String) As Integer
  Dim Cell As Variant
  For Each Cell In Rng
    If InStr(Cell.Value, Ch) Then CountChar = CountChar + (Len(Cell) - Len(Replace(Cell.Value, Ch, ""))) / Len(Ch)
  Next Cell
End Function
 

File đính kèm

Upvote 0
Mã:
Function CountChar(Rng As Variant, Ch As String) As Integer
  Dim Cell As Variant
  For Each Cell In Rng
    If InStr(Cell.Value, Ch) Then CountChar = CountChar + (Len(Cell) - Len(Replace(Cell.Value, Ch, ""))) / Len(Ch)
  Next Cell
End Function
Tôi đả test gần 3 ngày. Code chính xác 100% cho hầu hết mọi trường hợp. Chân thành cảm ơn Giáo sư Code ( tôi bái phục thích nhất đoạn code tìm kiếm 10.000 tôi đã hỏi. Code rất rất Nhanh Nhanh và Cực kỳ chính xác )
 
Upvote 0
Mã:
Function CountChar(Rng As Variant, Ch As String) As Integer
  Dim Cell As Variant
  For Each Cell In Rng
    If InStr(Cell.Value, Ch) Then CountChar = CountChar + (Len(Cell) - Len(Replace(Cell.Value, Ch, ""))) / Len(Ch)
  Next Cell
End Function

cảm ơn đoạn code của bác nha. Thật ra e chỉ cần đoạn code đếm được 2 ký tự * và ; để em ứng dụng cho công việc của em ( nếu chỉ cần đếm >0 thì em không cho người dùng nhập vào ô Tên hàng ( vì sau này nó sẽ ảnh hưởng đến code tìm kiếm siêu tốc độ 10.000 dòng của bác ). Em tự mò mẫm thì nó chỉ đếm được 1 ô thôi. Bác sữa lại giúp em đếm được 1 vùng ( chẳng hạn ( D8:C100). THank bác

Mã:
Sub codedem2kytu()
' Thuc ra a cam Dem 2 ky tu * va ;
 
     Range("d3") = (Len(Range("d8").Value) * 2) - _
     Len(Replace(Range("d8").Value, "*", "")) - _
     Len(Replace(Range("d8").Value, ";", ""))
 
End Sub
 
Upvote 0
Mã:
...
    If InStr(Cell.Value, Ch) Then CountChar = CountChar + (Len(Cell) - Len(Replace(Cell.Value, Ch, ""))) / Len(Ch)

Dùng hàm Split đơn giản hơn.

If Not IsEmpty(Cell) Then CountChar = CountChar + UBound(Split(Cell.Value, Ch))

Hàm Split chậm hơn Replace 1 chút. Nhưng bù lại, giảm được phép chia Len(Ch)
 
Upvote 0
cảm ơn đoạn code của bác nha. Thật ra e chỉ cần đoạn code đếm được 2 ký tự * và ; để em ứng dụng cho công việc của em ( nếu chỉ cần đếm >0 thì em không cho người dùng nhập vào ô Tên hàng ( vì sau này nó sẽ ảnh hưởng đến code tìm kiếm siêu tốc độ 10.000 dòng của bác ). Em tự mò mẫm thì nó chỉ đếm được 1 ô thôi. Bác sữa lại giúp em đếm được 1 vùng ( chẳng hạn ( D8:C100). THank bác

Mã:
Sub codedem2kytu()
' Thuc ra a cam Dem 2 ky tu * va ;
 
     Range("d3") = (Len(Range("d8").Value) * 2) - _
     Len(Replace(Range("d8").Value, "*", "")) - _
     Len(Replace(Range("d8").Value, ";", ""))
 
End Sub
Mã:
Sub codedem2kytu()
  Dim Cell As Variant, CountChar As Long, tmp As Variant
  For Each Cell In Range("d8:c17")
    tmp = Cell.Value
    If InStr(tmp, "*") Then CountChar = CountChar + Len(tmp) - Len(Replace(tmp, "*", ""))
    If InStr(tmp, ";") Then CountChar = CountChar + Len(tmp) - Len(Replace(tmp, ";", ""))
  Next Cell
  Range("d3") = CountChar
End Sub
 
Upvote 0
Làm tôi nhớ vụ hàm if gì của bạn.

If làm được + test 1 tháng> zả tiền, ngược lại về "ăn cơm mẹ nấu"... :D:D:D
(Chú: hôm nay mới gần 3 ngày thôi ah.)

Gặp loại thân chủ khó tính thế này thì ngừoi ta ký hợp đồng theo kiểu LC.
Có một đối tác thứ ba làm trung gian. Bên A ký gởi tiền cho C. Khi C báo tiền đã có đủ thì B bắt đầu làm việc. Khi xong việc, B báo cho C. Khi A hài lòng thì báo C đưa tiền cho B (tuỳ theo hợp đồng, có thể giữ lại 1 phần để bảo hành). Nếu quá một thời hạn nào đó mà A không chịu bảo C đưa tiền thì B sẽ đưa hợp đồng ra toà phân xử. Tiền nằm trong tay C cho nên A không thể trở mặt dễ dàng. Lúc ấy chỉ khi toà cho phép C mới đưa tiền cho bên thắng kiện.

LC bến cảng hơi dễ dãi hơn một chút. Chỉ cần hàng về đến bến cảng, cảng nhận đủ là ngân hàng giao tiền cho bên bán. Chuyện hư hỏng này nọ là kiện cáo sau này. Loại giao dịch này bảo đảm bên bán không thiệt thòi khi bên mua giật giọng. Một khi hàng xuất lên tàu rồi thì coi như có iền. Nếu rủi ro thì có bảo hiểm chịu trách nhiệm.
 
Upvote 0
Mã:
Sub codedem2kytu()
  Dim Cell As Variant, CountChar As Long, tmp As Variant
  For Each Cell In Range("d8:c17")
    tmp = Cell.Value
    If InStr(tmp, "*") Then CountChar = CountChar + Len(tmp) - Len(Replace(tmp, "*", ""))
    If InStr(tmp, ";") Then CountChar = CountChar + Len(tmp) - Len(Replace(tmp, ";", ""))
  Next Cell
  Range("d3") = CountChar
End Sub
Code của bác chính xác theo ý em rồi, chúc bác năm mới thật nhiều sức khoẻ
 
Upvote 0
Web KT

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

Back
Top Bottom