- Tham gia
- 17/8/08
- Bài viết
- 8,662
- Được thích
- 16,725
- Giới tính
- Nam
Xin vui lòng hướng dẫn hàm viết tắt họ tên sẽ được viết như thế nào?
Xin cám ơn rất nhiều.
Giả sử tôi có tên là Hoàng Trọng Nghĩa, kết quả sẽ là H.T.NGHĨA
Vu gì vậy?
Thứ nhất: Hàm này đã từng làm trên diễn đàn rồi
Thứ hai: Chẳng lẽ Nghĩa không tự viết được?
Function ShortName(ByVal FullName As String) As String
FullName = Trim(FullName)
If Len(FullName) = 0 Then
ShortName = vbNullString
Exit Function
End If
If InStr(FullName, " ") = 0 Then
ShortName = UCase(FullName)
Else
Dim FirstName As String, LastName As String
FirstName = " " & FullName
LastName = FullName
Do While InStr(FirstName, " ")
FirstName = Mid(FirstName, InStr(FirstName, " ") + 1, Len(FirstName))
LastName = Replace(LastName, Left(LastName, InStr(LastName, " ")), "")
ShortName = ShortName & Left(FirstName, 1) & "."
Loop
ShortName = UCase(Left(ShortName, Len(ShortName) - 2) & LastName)
End If
End Function
Function ShortName(ByVal FullName As String) As String
Dim i As Long
Do While InStr(FullName, " ")
i = i + 2
FullName = Application.Replace(FullName, i, InStr(FullName, " ") - i + 1, ".")
Loop
ShortName = UCase(FullName)
End Function
Function strName(str As String) As String
Dim sTemp() As String
Dim i As Long
sTemp = Split(Application.WorksheetFunction.Trim(str))
For i = 0 To UBound(sTemp) - 1
strName = strName & UCase(Left(sTemp(i), 1)) & "."
Next i
strName = UCase(strName & sTemp(UBound(sTemp)))
End Function
Em viết tạm hàm củ chuối như sau:
Mã:Function strName(str As String) As String Dim sTemp() As String Dim i As Long [COLOR=#ff0000][B]sTemp = Split(Application.WorksheetFunction.Trim(str))[/B][/COLOR] For i = 0 To UBound(sTemp) - 1 strName = strName & UCase(Left(sTemp(i), 1)) & "." Next i strName = UCase(strName & sTemp(UBound(sTemp))) End Function ODE][/QUOTE] Tôi thấy [COLOR=#ff0000][B]sTemp = Split(Trim(str))[/B][/COLOR] cũng được mà.
Tôi thấy sTemp = Split(Trim(str)) cũng được mà.
Không được đâu ạ, nếu ở khoảng giữa 2 chữ có nhiều khoảng trắng, thì nó sẽ thay đổi mỗi khoảng trắng là 1 dấu chấm (.) ạ.
.......
Nghĩa có nghĩ đến tình huông mà chuổi chứa nhiều khoảng trắng thừa không?Thật ra là có làm thử rồi, nhưng có vẽ lượm thượm nên không tự tin lắm.
Xin nhờ góp ý và sửa chữa.
Hãy thử làm bài này mà không có sự có mặt có WorksheetFunction đi! Thế mới là VB chứ!
----------------
Nghĩa có nghĩ đến tình huông mà chuổi chứa nhiều khoảng trắng thừa không?
Thì đúng vậy sư phụ à!Dùng For - Next (abc VBA) thông thường duyệt từ đầu đến cuối là Ok thôi.
Theo mình, bài này cứ phang "chim, chim" như anh Hai Lúa cho chắc cú.
Cách của Thầy Mỹ thì truyền thống rối, nhưng vòng lặp phải chạy hết chuỗi ==> mệt
Cách của Thầy Ndu hổng xài "chim" & bẫy lỗi cũng Ok nhưng nếu khoảng trắng dư ở cuối chuỗi mà không có "chim" thì cũng .....hơi mệt í
Híc
Function strName(str As String) As String
Dim sTemp() As String
Dim i As Long
Do While InStr(1, str, " ") > 0
str = Replace(str, " ", " ")
Loop
sTemp = Split(IIf(Trim(str) <> "", Trim(str), " "))
If UBound(sTemp) = 1 Then
strName = Trim(Str)
Else
For i = 0 To UBound(sTemp) - 1
strName = strName & Left(sTemp(i), 1) & "."
Next i
strName = UCase(strName) & sTemp(UBound(sTemp))
End If
End Function
Hình như code của Thầy Sealand dính 2 chưởng:Mình gom ý kiến mọi người vào hàm của Hai Lua xem sao:
Mã:Function strName(str As String) As String Dim sTemp() As String Dim i As Long Do While InStr(1, str, " ") > 0 str = Replace(str, " ", " ") Loop sTemp = Split(IIf(Trim(str) <> "", Trim(str), " ")) If UBound(sTemp) = 1 Then strName = Trim(Str) Else For i = 0 To UBound(sTemp) - 1 strName = strName & Left(sTemp(i), 1) & "." Next i strName = UCase(strName) & sTemp(UBound(sTemp)) End If End Function
hình như số 1 phải thay bằng số 0 ( số không)If UBound(sTemp) = 1 Then
strName = Trim(Str)
Theo mình, bài này cứ phang "chim, chim" như anh Hai Lúa cho chắc cú.
Cách của Thầy Mỹ thì truyền thống rối, nhưng vòng lặp phải chạy hết chuỗi ==> mệt
Cách của Thầy Ndu hổng xài "chim" & bẫy lỗi cũng Ok nhưng nếu khoảng trắng dư ở cuối chuỗi mà không có "chim" thì cũng .....hơi mệt í
Híc
Function strName(ByVal str As String) As String
Dim sTemp, tmp As String, n As Long, i As Long, Arr()
sTemp = Split(Trim(str))
If UBound(sTemp) > -1 Then
For i = 0 To UBound(sTemp)
tmp = sTemp(i)
If Len(tmp) Then
n = n + 1
ReDim Preserve Arr(1 To n)
Arr(n) = IIf(i = UBound(sTemp), UCase(tmp), UCase(Left(tmp, 1)))
End If
Next
If n Then strName = Join(Arr, ".")
End If
End Function
Làm được tuốt anh à!
Sửa lại code của Hai Lúa thế này là được rồi:
Mã:Function strName(ByVal str As String) As String Dim sTemp, tmp As String, n As Long, i As Long, Arr() sTemp = Split(Trim(str)) If UBound(sTemp) > -1 Then For i = 0 To UBound(sTemp) tmp = sTemp(i) If Len(tmp) Then n = n + 1 ReDim Preserve Arr(1 To n) [COLOR=#0000cd] [B]Arr(n) = IIf(i = UBound(sTemp), UCase(tmp), UCase(Left(tmp, 1)))[/B][/COLOR] End If Next [COLOR=#0000cd][B] If n Then strName = Join(Arr, ".")[/B][/COLOR] End If End Function
Anh thử cho 1 trường hợp mà ÚCase bị sai xemCode này mà dung Ucase e không ổn lắm vì dính mã tiếng Việt thì Ucase đi đời. Vì vậy mà mình bỏ Ucase phần tên (Xác xuất lỗi cực cao)
If UBound(sTemp) = 1 Then
strName = Trim(Str)
là đúng đấy bác Cò ơi.
Function ShortName(ByVal Str As String) As String
Dim i As Long
Str = Trim(Str)
Do While InStr(Str, " ")
If InStr(Str, " ") > i + 1 Then i = i + 2
Str = Replace(Str, Mid(Str, i, InStr(Str, " ") - i + 1), ".", , 1)
Loop
ShortName = UCase(Str)
End Function
Thì được... nhưng mà.. làm biếng lắm!Bài này dùng thuật toán xử lý chuỗi cũng được mà.
Thì được... nhưng mà.. làm biếng lắm!
Cứ Split ra rồi For.. Next trên mảng cho nó đơn giản
-------------
Ngoài ra thì 1 lời khuyên thiết nghĩ cũng không thừa: Giải thuật dùng Split bao giờ cũng nhanh hơn so với xử lý chuổi thông thường (đương nhiên chỉ nói với những bài toán lớn)
Làm được tuốt anh à!
Sửa lại code của Hai Lúa thế này là được rồi:
PHP:Function strName(ByVal str As String) As String Dim sTemp, tmp As String, n As Long, i As Long, Arr() sTemp = Split(Trim(str)) If UBound(sTemp) > -1 Then For i = 0 To UBound(sTemp) tmp = sTemp(i) If Len(tmp) Then n = n + 1 ReDim Preserve Arr(1 To n) Arr(n) = IIf(i = UBound(sTemp), UCase(tmp), UCase(Left(tmp, 1))) End If Next If n Then strName = Join(Arr, ".") End If End Function
Thì được... nhưng mà.. làm biếng lắm!
Cứ Split ra rồi For.. Next trên mảng cho nó đơn giản
-------------
Ngoài ra thì 1 lời khuyên thiết nghĩ cũng không thừa: Giải thuật dùng Split bao giờ cũng nhanh hơn so với xử lý chuổi thông thường (đương nhiên chỉ nói với những bài toán lớn)
Function convName(fullName As String) As String
Dim sT As String, Tmp, i As Long
sT = Trim(fullName)
If sT <> "" Then
Tmp = Split(sT)
sT = ""
For i = 0 To UBound(Tmp) - 1
If Tmp(i) <> "" Then sT = sT & Left(Tmp(i), 1) & "."
Next i
sT = UCase(sT & Tmp(UBound(Tmp)))
End If
convName = sT
End Function
Thử thế này coi, chắc chưa ổn lắm1. Cho em hỏi cái này đổi tên thành chữ hoa đầu câu thì code như thế nào? VD như: PHẠM MINH TUẤN thì thành P.M.Tuấn.
Public Function tach(cell As Range)
Dim i, tam, kq
tam = Application.Trim(tam)
tam = Split(cell, " ")
For i = 0 To UBound(tam) - 1
kq = kq & " " & UCase(Left(tam(i), 1)) & "."
Next
tach = kq & " " & Application.Proper(tam(UBound(tam)))
End Function
Cảm ơn anh nhiều. Em đã thử thấy được rồi. Chúc anh cuối tuần vui nhé.Thử thế này coi, chắc chưa ổn lắm
PHP:Public Function tach(cell As Range) Dim i, tam, kq tam = Application.Trim(tam) tam = Split(cell, " ") For i = 0 To UBound(tam) - 1 kq = kq & " " & UCase(Left(tam(i), 1)) & "." Next tach = kq & " " & Application.Proper(tam(UBound(tam))) End Function
Đâu nhất thiết phải xây dựng thêm một hàm phụ đâu nhỉ, nếu áp dụng cho Excel thì ta đã có WorksheetFunction.Trim rồi mà.để tránh lằng nhằng tui làm thêm hàm trìm2 để loại tất cả các khoảng trắng thừa ở hai đầu và ở giữa.
Function Trim2(s$)
Dim str$
str = s
Do While InStr(str, " ") > 0
str = Replace(str, " ", " ") 'thay 2 khoảng trắng bằng 1 khoảng trắng
Loop
Trim2 = Trim(str)
End Function
Hoàng Trọng Nghĩa => H.T.Nghĩa
Function HoTen(a As String) As String
Dim i As Integer, j As Integer
Dim VT As String
If a = "" Then
HoTen = ""
Exit Function
End If
a = Trim(a)
VT = Left(a, 1) & "."
For i = 1 To Len(a)
If Mid(a, i, 1) = ChrW(32) And Mid(a, i + 1, 1) <> ChrW(32) Then
VT = VT & Mid(a, i + 1, 1) & "."
j = i
End If
Next
HoTen = Left(VT, Len(VT) - 2) & Right(a, Len(a) - j)
End Function
Cho mình xin hỏi code trên các anh đề cập đến thấy tốt.
ví dụ mình muốn viết tắt hết tất cả các tên luôn thì code như thế nào? cho mình xin code nhé.
VD: Nguyễn Văn Trường ---> NVT
Xin cảm ơn các bạn xem bài.
Function getInitialName(name As String) As String
Dim arr() As String
Dim i As Long
arr = Split(name)
For i = LBound(arr) To UBound(arr)
getInitialName = getInitialName & Left(arr(i), 1)
Next i
End Function
Function getInitialName(name As String) As String
Dim arr() As String
Dim i As Long
If Len(Trim(name)) = 0 Then Exit Function
arr = Split(name)
For i = LBound(arr) To UBound(arr) - 1
getInitialName = getInitialName & Left(arr(i), 1) & "."
Next i
getInitialName = getInitialName & arr(UBound(arr))
End Function
Thử hàm nàyCho mình xin hỏi code trên các anh đề cập đến thấy tốt.
ví dụ mình muốn viết tắt hết tất cả các tên luôn thì code như thế nào? cho mình xin code nhé.
VD: Nguyễn Văn Trường ---> NVT
Xin cảm ơn các bạn xem bài.
Function VT(Cell As Range)
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "[^A-Z]"
VT = .Replace(Cell, "")
End With
End Function
Đã giải quyết vấn đề, cảm ơn 2 bạn.
Cho mình hỏi thêm ví dụ có dữ liệu như thế này
THPT NGUYỄN QUANG DIÊU ---> thành THPT NQD
THCS NGUYỄN TRÃI ---> thành THCS NT
Vậy cho mình xin code nhé, 1 lần nữa xin cảm ơn.
Function VT(Cell As Range) As String
Dim tam, i, kq
tam = Split(Application.Trim(Cell), " ")
For i = 1 To UBound(tam)
kq = kq & Left(tam(i), 1)
Next
VT = tam(0) & " " & kq
End Function
Thử hàm này
Cú pháp = VT(A1)
PHP:Function VT(Cell As Range) With CreateObject("vbscript.regexp") .Global = True .Pattern = "[^A-Z]" VT = .Replace(Cell, "") End With End Function