- 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 )
Thử hàm này xem được không.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 )
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
=demso(A1,0)
=demso(A1,1)
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 )
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
Tiếng việt unicode thì dùng hàm này anh:Tiếng Việt có dấu rắc rối lắ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
=dem_kt(A1,0) 'Đếm chữ hoa'
=dem_kt(A1,1) 'Đếm chữ thường'
A Ả Ã Ạ À ÁTiếng việt unicode
=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)))
=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)))
Dạ vâng em ghi nhớ ạ, em cảm ơn anhA Ả Ã Ạ À Á
Ă Ẳ Ẵ Ặ Ằ Ắ
 Ẩ Ẫ Ậ Ầ Ấ
... (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.
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)
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))))))
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
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.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))))))
Công thức này chỉ áp dụng cho chuỗi chữ cái không dấu hihiKế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.
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
Không chịu thử lại, nên trả lời trật lất rồi em.Công thức này chỉ áp dụng cho chuỗi chữ cái không dấu hihi
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)
Giúp code hoặc công thức anh, nên em làm thử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:
Enter, fill xuống.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)
Nhưng, nhớ không lầm đây là Box Lập trình mà 2 em @dazkangel và @hocexcel_1991!!!???
Thân
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'
TríchBạ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
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 )