Giúp code hoặc công thức đếm bao nhiêu chữ HOA và chữ thường

Liên hệ QC

hondacrv2019

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
19/5/19
Bài viết
116
Được thích
9
Ví dụ ô A1 có Text "ABCD 123 ef +-*/" thì có 4 chữ Hoa và 2 chữ thường ( không đếm số và các ký tự đặc biệt )
 
Ví dụ ô A1 có Text "ABCD 123 ef +-*/" thì có 4 chữ Hoa và 2 chữ thường ( không đếm số và các ký tự đặc biệt )
Thử hàm này xem được không.
Mã:
Function demso(ByVal dk As String, ByVal cach As Boolean) As Long
         Dim i As Long, arr
         With CreateObject("VBScript.RegExp")
                .Global = True
               If cach = True Then
                  .Pattern = "[^A-Z]"
               Else
                  .Pattern = "[^a-z]"
               End If
                arr = .Replace(dk, "")
                demso = Len(arr)
         End With
End Function
Mã:
=demso(A1,0)
Mã:
=demso(A1,1)
 
Lần chỉnh sửa cuối:
Upvote 0
Ví dụ ô A1 có Text "ABCD 123 ef +-*/" thì có 4 chữ Hoa và 2 chữ thường ( không đếm số và các ký tự đặc biệt )
Mã:
Function DemKyTu(ByVal iStr$, Optional ByVal ChuIn As Boolean = True) As Long
  Dim N&, i&, k&, tmp$, iChr$
  N = Len(iStr)
  tmp = UCase(iStr)
  For i = 1 To N
    iChr = Mid(tmp, i, 1)
    If LCase(iChr) <> iChr Then
      If (Mid(iStr, i, 1) = iChr) = ChuIn Then k = k + 1
    End If
  Next i
  DemKyTu = k
End Function
Đếm chữ thường
=DemKyTu(A1,0)
Đếm chữ in
=DemKyTu(A1,1)
=DemKyTu(A1)
 
Upvote 0
Tiếng Việt có dấu rắc rối lắm!:giveup:
Tiếng việt unicode thì dùng hàm này anh:
Mã:
Function dem_kt(Rng As Range, a As Boolean) As Long
Dim Arr1 As String, Arr2 As String, i As Long

Arr1 = "AÂBCDEÊGHIKLMNOÔPQRSTUVXYJWZF" & ChrW(249) & ChrW(263) & ChrW(407) & ChrW(422)
Arr2 = "aâbcdeêghiklmnoôpqrstuvxyjwzf" & ChrW(250) & ChrW(264) & ChrW(408) & ChrW(423)
For i = 1 To Len(Rng.Value)
If a = False Then
    If InStr(Arr1, Mid(Rng.Value, i, 1)) <> 0 Then dem_kt = dem_kt + 1
Else
    If InStr(Arr2, Mid(Rng.Value, i, 1)) <> 0 Then dem_kt = dem_kt + 1
End If
Next

End Function
Mã:
=dem_kt(A1,0) 'Đếm chữ hoa'
=dem_kt(A1,1) 'Đếm chữ thường'
 
Upvote 0
A Ả Ã Ạ À Á
Ă Ẳ Ẵ Ặ Ằ Ắ
 Ẩ Ẫ Ậ Ầ Ấ
... (Mỗi nguyên âm có 6 ký tự).

Function dem_kt(Rng As Range, a As Boolean) As Long
Đầu vào là chuỗi thì khai báo tham số là chuỗi luôn, nên dùng dạng truyền tham số ByVal.
 
Upvote 0
Làm hàm chơi, file không dành cho tiếng Việt, còn công thức đưa ra là áp dụng cho tiếng Việt nhấn Ctrl+Shift+Enter:
Chữ hoa:
Mã:
=COUNT(FIND(IF(MMULT(1-ISNUMBER(FIND(MID(A2,ROW($1:$20),1),IF({1,0},UPPER(A2),LOWER(A2)))),{1;1}),MID(A2,ROW($1:$20),1)),UPPER(A2)))
Chữ thường:
Mã:
=COUNT(FIND(IF(MMULT(1-ISNUMBER(FIND(MID(A2,ROW($1:$20),1),IF({1,0},UPPER(A2),LOWER(A2)))),{1;1}),MID(A2,ROW($1:$20),1)),LOWER(A2)))
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
A Ả Ã Ạ À Á
Ă Ẳ Ẵ Ặ Ằ Ắ
 Ẩ Ẫ Ậ Ầ Ấ
... (Mỗi nguyên âm có 6 ký tự).

Function dem_kt(Rng As Range, a As Boolean) As Long
Đầu vào là chuỗi thì khai báo tham số là chuỗi luôn, nên dùng dạng truyền tham số ByVal.
Dạ vâng em ghi nhớ ạ, em cảm ơn anh
 
Upvote 0
Thử hàm này xem được không.
Mã:
Function demso(ByVal dk As String, ByVal cach As Boolean) As Long
         Dim i As Long, arr
         With CreateObject("VBScript.RegExp")
                .Global = True
               If cach = True Then
                  .Pattern = "[^A-Z]"
               Else
                  .Pattern = "[^a-z]"
               End If
                arr = .Replace(dk, "")
                demso = Len(arr)
         End With
End Function
Mã:
=demso(A1,0)
Mã:
=demso(A1,1)

Cảm ơn bác code chạy ok. Còn trường hợp 1 text làm sao biết bao nhiêu số từ 0 đến 9 thì làm sao bác. Ví dụ "ABC1234" Thì gồm 3 chử và 4 số
 
Upvote 0
Dùng Regex thì dùng 4 mẫu:
[A-Z]
[a-z]
[0-9]
(nếu muốn, thêm mẫu thứ tư, cộng 3 mẫu kia lại thêm dấu ^, tức là các ký tự đặc biệt)
Không phải ri pơ lết pơ lọt gì hết. Excecute và xét Count thì biết có bao nhiêu lần match.

Loại hàm này thì cũng chả cần flag để lựa loại trả về. Cứ việc cho nó Excecute lần lượt các mẫu, và cho kết quả vào một mảng. Hàm sẽ trả về một mảng 3 (hoặc 4 phần tử). Trong bảng tính, dùng hàm Index để lấy đúng phần tử cần.
 
Upvote 0
VBA Regexp:
Mã:
Function CountCharTypes(ByVal s As String) As Variant
' returns an array showing count of each character type within string 2
' array indices: 1st = alphabetic capital; 2nd = alpahbetic noncapital; 3rd = digit; 4th = others
Static rx As Object
If rx Is Nothing Then
    Set rx = CreateObject("vbscript.regexp")
    rx.Global = True
End If
Dim CountChar(0 To 3) As Integer, i As Integer
rx.Pattern = "([A-Z])|([a-z])|([0-9])" ' alphabetic, capital, non-capital (need to add more if Vietnamese), and digits
For Each mat In rx.Execute(s)
    For i = 0 To mat.submatches.count - 1
        If Not IsEmpty(mat.submatches(i)) Then CountChar(i) = CountChar(i) + 1
    Next i
Next mat
CountChar(3) = Len(s) - CountChar(0) - CountChar(1) - CountChar(2) ' other characters
CountCharTypes = CountChar
End Function
Đây là hàm trả về 1 mảng. Cách dùng:
Tính 1 lần: chọn 4 ô liên tiếp trên bảng tính, nhập hàm =CountCharTypes("ABC, 123 ab"), và Ctrl+Shift+Enter
Kết quả sẽ là 3 2 3 4 (3 dấu cách và 1 dấu phẩy)
Lưu ý đây là mảng 1 dòng. Nếu chọn cột dọc thì phải dùng hàm Transpose.
Tính nhiều lần: =Index(CountCharTypes("ABC, 123 ab"),1) là đếm số ký tự viết hoa. Kết quả là 3

Cách khác:
rx.Pattern = "[A-Z]"
CountChar(0) = rx.Execute(s).Count
rx.Pattern = "[a-z]"
CountChar(1) = rx.Execute(s).Count
...
 
Upvote 0
Góp vui tí
Mã:
Chữ Hoa=SUMPRODUCT(N(NOT(EXACT(MID(A2,ROW($1:$100),1),LOWER(MID(A2,ROW($1:$100),1))))))
Chữ thường=SUMPRODUCT(N(NOT(EXACT(MID(A2,ROW($1:$100),1),UPPER(MID(A2,ROW($1:$100),1))))))
Kết quả ổn không, tôi không ngồi máy nhưng ngắn là thích rồi haha. Bạn thử các từ có dấu chưa.
 
Lần chỉnh sửa cuối:
Upvote 0
Lại VBA regex:
Nới rộng thêm một chút, bao gồm trường hợp bài #2 và #4.
Mã:
Function CountCharTypes(ByVal s As String, Optional Byval As Integer typ = 0) As Variant
  ' returns count of a type of characters in string s.
  ' Type specified as typ:
  ' 1: alphabetic, capital
  ' 2: alphabetic, noncapital
  ' 3: digit
  ' 4: none of the above, ie other characters
  ' Otherwise
  ' returns an array showing count of each character type within string
  ' array indices: 1st = alphabetic capital; 2nd = alpahbetic noncapital; 3rd = digit; 4th = others
Static rx As Object
Static cPattern(1 To 3) As String
Dim CountChar(1 To 4) As Integer
If rx Is Nothing Then
  Set rx = CreateObject("vbscript.regexp")
  rx.Global = True
End If
If cPattern(1) = "" Then
  cPattern(1) = "[A-Z]" ' add Vietnamese characters here
  cPattern(2) = "[a-z]"
  cPattern(3) = "[0-9]"
End If
Select Case typ
Case 1, 2, 3, 4 ' only one type specified
  If typ = 4 Then ' characters outside all three patterns above
    rx.Pattern = Repace(Replace(Join(cPattern, ""), "][", ""), "[", "[^")
  Else
    rx.Pattern = cPattern(typ)
  End If
  CountCharTypes = rx.Execute(s).Count
Case Else ' count each type separately
  For typ = 1 To 3
    rx.Pattern = cPattern(typ)
    CountChar(typ) = rx.Execute(s).Count
  Next i
  CountChar(4) = Len(s) - CountChar(1) - CountChar(2) - CountChar(3) ' other characters
  CountCharTypes = CountChar
End Select
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Công thức này chỉ áp dụng cho chuỗi chữ cái không dấu hihi
Không chịu thử lại, nên trả lời trật lất rồi em. :)

Công thức em tạo bất chấp chữ nguyên âm VN có hay không có dấu.
Có thể rút gọn 1 chút:
Mã:
Chữ hoa=SUMPRODUCT(1-EXACT(MID(A1,ROW($1:$100),1),LOWER(MID(A1,ROW($1:$100),1))))
Chữ thường=SUMPRODUCT(1-EXACT(MID(A1,ROW($1:$100),1),UPPER(MID(A1,ROW($1:$100),1))))
Đếm số=SUMPRODUCT(ISNUMBER(--MID(A2,ROW($1:$100),1))*1)
Enter, fill xuống.

Nhưng, nhớ không lầm đây là Box Lập trình mà 2 em @dazkangel@hocexcel_1991!!!??? :rolleyes::rolleyes::rolleyes:

Thân
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Không chịu thử lại, nên trả lời trật lất rồi em. :)

Công thức em tạo bất chấp chữ nguyên âm VN có hay không có dấu.
Có thể rút gọn 1 chút:
Mã:
Chữ hoa=SUMPRODUCT(1-EXACT(MID(A1,ROW($1:$100),1),LOWER(MID(A1,ROW($1:$100),1))))
Chữ thường=SUMPRODUCT(1-EXACT(MID(A1,ROW($1:$100),1),UPPER(MID(A1,ROW($1:$100),1))))
Đếm số=SUMPRODUCT(ISNUMBER(--MID(A2,ROW($1:$100),1))*1)
Enter, fill xuống.

Nhưng, nhớ không lầm đây là Box Lập trình mà 2 em @dazkangel@hocexcel_1991!!!??? :rolleyes::rolleyes::rolleyes:

Thân
Giúp code hoặc công thức anh, nên em làm thử :D
 
Upvote 0
Cái này nếu công thức không quá khủng thì nên dùng công thức.

Tôi ở đây chỉ hiến kế mọi ngừoi cách dùng regex. Hai điểm ít thấy sử dụng trên GPE:
1. thay nhiều pattern khác nhau để tìm nhiều lần. Hồi nào giờ trên GPE ngừoi ta quen là chỉ dùng 1 pattern.
2. đếm số lần xuất hiện của pattern (bài #12, #15). Hồi nào giờ trên nGPE ngừoi ta quen dùng Replace chứ ít dùng tới Execute.

Thêm một phần phụ về cách dùng hàm UDF trả về mảng (bài #12).
 
Upvote 0
Bạn thử sử dụng code dưới đây với 50000 từ xem.

Hoa: LenCharSpecial("chuỗi", 1)
Thường: LenCharSpecial("chuỗi")
Đếm số: LenNumberChar("Chuỗi 123")


PHP:
Function LenCharSpecial(ByVal Text As String, Optional ByVal iU As Boolean = False) As Long
  With CreateObject("VBScript.RegExp")
    .Global = True
    .IgnoreCase = False
    .Pattern = "[\\\?\+\*\[\]\$\^\=\-\{\}\(\)\:\.\|]"
    Text = .Replace(Text, "")
    If iU Then .Pattern = "[^" & LCase(Text) & "]" Else .Pattern = "[^" & UCase(Text) & "]"
    LenCharSpecial = .Execute(Text).Count
  End With
End Function

Function LenNumberChar(ByVal Text As String) As Long
  With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "[\d]"
    LenNumberChar= .Execute(Text).Count
  End With
End Function

'Xu hướng lập trình xử lý dữ liệu lớn:'
'+ Phương hướng 1: Thay vì là một Function hãy đưa code thẳng vào Thủ tục chính.'
'+ Phương hướng 2: Khởi tạo một lần duy nhất'
'Static RE As Object'
'If RE Is Nothing Then Set RE = CreateObject("VBScript.RegExp")'
'With RE'
'Thay vì sử dụng IIf hãy sử dụng If'
'End With'
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử sử dụng code dưới đây với 50000 từ xem.

Hoa: LenCharSpecial("chuỗi", 1)
Thường: LenCharSpecial("chuỗi")
Đếm số: LenNumberChar("Chuỗi 123")


PHP:
Function LenCharSpecial(ByVal Text As String, Optional ByVal iU As Boolean = False) As Long
  Dim Tmp1$, Tmp2$, L$, U$
  #If VBA7 Then
    L = LCase$(Text): U = UCase$(Text)
  #Else
    L = LCase(Text): U = UCase(Text)
  #End If
  With CreateObject("VBScript.RegExp")
    .Global = True
    .IgnoreCase = False
    .Pattern = "[^" & IIf(iU, L, U) & "]"
    Tmp1 = .Replace(Text, "")
    .Pattern = "[^" & IIf(iU, U, L) & "]"
    Tmp2 = .Replace(Text, "")
    .Pattern = "[" & Tmp1 & "]"
    LenCharSpecial = Len(.Replace(Tmp2, ""))
  End With
End Function

Function LenNumberChar(ByVal Text As String) As Long
  With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "[^\d]"
    LenNumberChar= Len(.Replace(Text, ""))
  End With
End Function
Trích
Ví dụ ô A1 có Text "ABCD 123 ef +-*/" thì có 4 chữ Hoa và 2 chữ thường ( không đếm số và các ký tự đặc biệt )

Bạn thử chạy code với A1 = "ABCD 123 ef +-*/" xem sao
 
Upvote 0
Web KT

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

Back
Top Bottom