Không tách được họ tên

Liên hệ QC

challenge98

Thành viên chính thức
Tham gia
21/6/09
Bài viết
90
Được thích
5
Mặc dù đã làm theo đúng hướng dẫn trong sách cua GPE nhưng không hiếu sao không chạy nhờ mọi người xem giúp với.

Function tachten(ten As String) As String
Dim i As Integer
ten = Trim(ten)
For i = Len(ten) To 1 Step -1
If Mid(ten, i, 1) = " " Then
tachten = Right(ten, Len(ten) - i)
End If
Next
End Function

Mình để chế độ medum khi mở file thì ennable mà sao không được? Chẳng nhẽ còn chạy chỗ nào nữa? à mà nó có chạy nhưng chạy không chính xác chứ không phải là không chạy.
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Bạn phải đặt chế độ macro hoạt động thì mới được, hàm không bị lỗi gì. Bạn xem ch tiết chương 5:

Chương 5: Làm việc với file Excel có chứa macro
5.1. Sử dụng chức năng Security
5.2. Sử dụng các chương trình diệt virus
 
Upvote 0
Mình để chế độ medum khi mở file thì ennable mà sao không được? Chẳng nhẽ còn chạy chỗ nào nữa? à mà nó có chạy nhưng chạy không chính xác chứ không phải là không chạy.
Bạn chỉnh lại code như sau :
PHP:
Function tachten(ten As String) As String
Dim i As Integer
ten = Trim(Replace(ten, "  ", " "))
For i = Len(ten) To 1 Step -1
If Mid(ten, i, 1) = " " Then
    tachten = Right(ten, Len(ten) - i)
    Exit Function
End If
Next
End Function

Hay dùng code sau, không dùng for :
PHP:
Function tachten(ten As String) As String
Dim i As Integer
ten = Trim(Replace(ten, "  ", " "))
tachten = Right(ten, Len(ten) - InStrRev(ten, " "))
End Function
 
Upvote 0
Function tachten(ten As String) As String
Dim i As Integer
ten = Trim(ten) 'Cắt bỏ ký tự trắng thừa bên phải
For i = Len(ten) To 1 Step -1 ' ví dụ tên có 20 ký tự i chạy từ 20,19,18...
If Mid(ten, i, 1) = " " Then ' lặp tới khi gặp ký tự trắng (Space) thì làm
tachten = Right(ten, Len(ten) - i) ' Tính từ chỗ có ký tự trắng dừng lại lấy phần bên phải
End If ' kết thúc giả thiết
Next ' chạy i
End Function
Sao lô gíc thế mà lại sai được nhỉ? ai giải thích lỗi do đâu hộ mình với.
 
Upvote 0
Khi tìm thấy khoảng trắng đầu tiên thì phải cho lệnh thoát vòng lặp ngay

PHP:
Option Explicit
Function tachTen(HoTen As String) As String
 Dim i As Integer
2 HoTen = " " & Trim(HoTen)
 For i = Len(HoTen) To 1 Step -1
   If Mid(HoTen, i, 1) = " " Then Exit For
 Next
 tachTen = Right(HoTen, Len(HoTen) - i)
End Function

Bạn hãy cho biết sao lại phải dùng dòng lệnh 2 làm vậy? (Nghĩa là thêm " " làm chi?)
 
Upvote 0
Nếu chỉ tách mỗi tên thì tôi thường dùng cách này
Vd B2:B10 là danh sách họ tên thì chọn C2:C10 và chạy sub TachTen; lưu ý muốn lấy kết quả đến cột nào thì chỉnh lại số chỉ vị trí cột của hàm Offset (số màu đỏ)
Mã:
Sub TachTen()
    Selection = Selection.Offset(, [SIZE=5][B][COLOR=Red]-1[/COLOR][/B][/SIZE]).Value
    Selection.Replace What:="* ", Replacement:=""
End Sub
 
Upvote 0
Mình cũng không chắc có lẽ để đưa hoten ban đầu vào chuỗi chăng? nhờ bạn chỉ giáo

Nếu cắt cớ ai đó chỉ nhập các từ liên tục, nghĩa là không khoảng trống; Ví dụ "GiaiPhapExcel.Com", Thì hàm sẽ đi đến đâu đây, (?). . . Bạn thử xem! :-= --=0 :-=
 
Upvote 0
Nếu cắt cớ ai đó chỉ nhập các từ liên tục, nghĩa là không khoảng trống; Ví dụ "GiaiPhapExcel.Com", Thì hàm sẽ đi đến đâu đây, (?). . . Bạn thử xem! :-= --=0 :-=
Ủa sao mình chỉ dùng: ten=trim(ten) 'xoa " " vẫn chạy bình thường kẻ cả nhập giaiphapex.com vẫn không thấy thông báo lỗi gì?
 
Upvote 0
Mình đã viết 1 hàm tham gia với bài khác, nay gửi bạn tham khảo tách Họ, lót, tên và cắt khoảng trắng thừa:
Mã:
Public Function hoten(ch As String, ten As Integer) As String
Dim kq As Variant, vt, i As Long
vt = 0
For i = 0 To Len(ch) - 1
If Mid(ch, i + 1, 1) = " " Then vt = vt + 1
Next
kq = Split(ch, " ")
Select Case ten
Case Is = 1
hoten = kq(0)
Case Is = 2
For i = 1 To vt - 1
hoten = IIf(Len(kq(i)) > 0, hoten & kq(i) & " ", hoten)
Next i
Case Is = 3
hoten = kq(vt)
End Select
End Function
Tham số ch: chuỗi họ tên. Tham số tên: 1-Họ, 2-Lót, 3-Tên
 
Upvote 0
Với việc TÁCH TÊN và tất cả các bài toán tách chuổi khác, tôi nghĩ chúng ta không nên dùng vòng lập chi cho mất công ---> Cứ Split mà "phang" là ra tuốt... Cực đơn giản!
 
Upvote 0
To Ndu:
1-Tách tên hay Họ: Split No.1.
2-Lót: Phai cân nhắc chút vì căn cứ tách là Space(1). Vậy trong họ tên gõ nhầm vài dấu cách là sinh chuyện.
 
Upvote 0
PHP:
Option Explicit
Function tachTen(HoTen As String) As String
 Dim i As Integer
2 HoTen = " " & Trim(HoTen)
 For i = Len(HoTen) To 1 Step -1
   If Mid(HoTen, i, 1) = " " Then Exit For
 Next
 tachTen = Right(HoTen, Len(HoTen) - i)
End Function
Bạn hãy cho biết sao lại phải dùng dòng lệnh 2 làm vậy? (Nghĩa là thêm " " làm chi?)
Tại sao không cần end if nhỉ cho vào thấy báo lỗi mình tưởng có if thì phải end if chứ?

Function khoangtrang(hoten As String) As Integer
Dim i As Integer
hoten = Trim(hoten)
Dim j As Integer
j = 0
For i = Len(hoten) To 1 Step -1
If Mid(hoten, i, 1) = " " Then
j = j + 1
Next i
Next j
khoangtrang = j
End Function
Mình dùng hàm đếm khoảng trắng (space) trong tên sao không được nhỉ?
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Không rõ vì sao nên tốt nhất là thay

If Mid(hoten, i, 1) = " " Then

bằng:

If Len(Mid(hoten, i, 1)) = 0 Then

*If...Then.... cùng dòng thì bỏ end if
 
Lần chỉnh sửa cuối:
Upvote 0
To Ndu:
1-Tách tên hay Họ: Split No.1.
2-Lót: Phai cân nhắc chút vì căn cứ tách là Space(1). Vậy trong họ tên gõ nhầm vài dấu cách là sinh chuyện.
Ấy dzà... đương nhiên không chỉ dùng mỗi Split là được... Nếu cần thiết anh có thể dùng WorksheetFunction.Trim để loại bỏ khoảng trắng
Thêm mấy điều kiện nữa:
- Sau khi dùng Split để tạo mãng, nếu mãng có từ 2 phần tử trở xuống thì xem như không có tên lót
- Nếu mãng có từ 3 phần từ trở lên thì phần tử thứ 2 đến kế cuối chính là tên lót
....
Ngoài ra cũng có thể dùng cách khác: Tách HỌ TÊN trước, phần còn lại (nếu có) chính là TÊN LÓT (dùng hàm Replace)
-----------
Mình dùng hàm đếm khoảng trắng (space) trong tên sao không được nhỉ?
Đếm khoảng trắng ai lại làm thế!
- Dùng Replace biến khoảng trắng thành rổng
- Lấy độ dài chuổi gốc trừ cho độ dài chuổi sau khi đã loại khoảng trắng ---> Kết quả = bao nhiêu chính là số khoảng trắng cần tìm
Ví dụ:
PHP:
Function DemKT(Chuoi As String) As Long
  DemKT = Len(Chuoi) - Len(Replace(Chuoi, " ", ""))
End Function
Cách này không chỉ dùng đếm khoảng trắng mà còn được dùng để đếm bất cứ ký tự nào bạn muốn
 
Lần chỉnh sửa cuối:
Upvote 0
Với việc TÁCH TÊN và tất cả các bài toán tách chuổi khác, tôi nghĩ chúng ta không nên dùng vòng lập chi cho mất công ---> Cứ Split mà "phang" là ra tuốt... Cực đơn giản!

@ Ndu: lần đầu tiên mình nghe thấy phương pháp này, Bạn cho mình xin một ví dụ dùng Split nhé. Cảm ơn bạn trước !
 
Upvote 0
@ Ndu: lần đầu tiên mình nghe thấy phương pháp này, Bạn cho mình xin một ví dụ dùng Split nhé. Cảm ơn bạn trước !
Ví dụ đơn giản thế này để lấy TÊN trong HỌ VÀ TÊN
PHP:
Function TachTen(Hovaten As String) As String
  Dim Temp
  Hovaten = WorksheetFunction.Trim(Hovaten)
  Temp = Split(Hovaten, " ")
  TachTen = Temp(UBound(Temp))
End Function
Đương nhiên bài toán thực thế có khác hơn 1 chút, người ta còn có nhu cầu Tách HỌ, tách CHỬ LÓT và tách TÊN... ta phát triển bài toán thêm:
PHP:
Function TachTen(HovaTen As String, Kieu As String) As String
  Dim Temp, Item1 As String, Item2 As String, Item3 As String
  Temp = Split(WorksheetFunction.Trim(HovaTen), " ")
  If Trim(HovaTen) = "" Then
    TachTen = ""
  Else
    Item3 = Temp(UBound(Temp))
    Item1 = Temp(0)
    Item2 = WorksheetFunction.Trim(Replace(Replace(HovaTen, Item1, ""), Item3, ""))
    Select Case UCase(Kieu)
      Case "HO": TachTen = IIf(UBound(Temp) > 0, Item1, "")
      Case "DEM": TachTen = IIf(UBound(Temp) > 1, Item2, "")
      Case "TEN": TachTen = Item3
    End Select
  End If
End Function
Đại khái là thế.. và không có vòng lập nào
Các bạn thử xem... tùy theo yêu cầu cụ thể sẽ rút gọn hơn
-------------
Nói nôm na thế này anh TrungChinh sẽ rất dể hiểu: Hàm Split tương đương với công cụ Text to Columns đấy
 
Upvote 0
Web KT

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

Back
Top Bottom