Đảo chuỗi

  • Thread starter Thread starter chibi
  • Ngày gửi Ngày gửi
Liên hệ QC

chibi

Thành viên tích cực
Thành viên danh dự
Tham gia
10/1/07
Bài viết
1,120
Được thích
623
Chào các bạn, cho mình xin hàm đảo chuỗi, ví dụ
dao_chuoi("cong hoa xa hoi")="hoi xa hoa cong"
 
Bạn thử dùng hàm StrReverse xem có vừa ý không? Ví dụ:

Mã:
Sub Ham_StrReverse()
  Dim sReverse As String
    sReverse = StrReverse("1234567")
    MsgBox sReverse
End Sub
 
Upvote 0
Không phải thế đâu. Chính xác là đảo các thành phần trong chuỗi (Các thành phần cách nhau bởi dấu cách)
 
Upvote 0
Mã:
Function Dao_Chuoi(ByVal Text As String) As String
Dim S As String
Dim p1, p2
Text = Trim(Text)
If Right(Text, 1) <> " " Then Text = Text & " "
S = ""
p1 = 0
p2 = 1
Do While p2 > 0
    p2 = InStr(p1 + 1, Text, " ")
    If p2 > 0 Then
        If S = "" Then
            S = Mid(Text, p1 + 1, p2 - p1 - 1) & S
        Else
            S = Mid(Text, p1 + 1, p2 - p1) & S
        End If
       p1 = p2
    End If
Loop

Dao_Chuoi = S
End Function
 
Upvote 0
Thêm một cách nữa bạn tham khảo
Mã:
Public Function daochuoi_2(strText As String)
Dim strText2() As String
Dim strText3 As String
Dim i
strText = Trim(strText)
strText2 = Split(strText, Space(1))
For i = UBound(strText2) To 0 Step -1
    strText3 = Trim(strText3 & Space(1) & strText2(i))
Next i
daochuoi_2 = strText3
End Function
 
Upvote 0
Hàm đảo tên, tách tên, tách họ đệm

chibi đã viết:
Chào các bạn, cho mình xin hàm đảo chuỗi, ví dụ
dao_chuoi("cong hoa xa hoi")="hoi xa hoa cong"
Cách đảo chuỗi của bạn cũng giống như cách đảo họ tên. Ví dụ "Phạm Duy Long" đảo thành "Long Duy Phạm", thường dùng cách này để sắp xếp họ tên theo ABC vì sắp theo tên.
Sau đây là 3 hàm liên quan đến họ tên:
DaoTen: đảo ngược thứ tự chuỗi (theo từ)
TachHo: Tách họ, tên đệm trong chuỗi họ tên
TachTen: Tách ten trong chuỗi họ tên
'==========
Function DaoTen(hoten) As String
hoten = " " & Trim(hoten)
Do
vt = InStrRev(hoten, " ", Len(hoten))
DaoTen = DaoTen & Mid(hoten, vt + 1) & " "
hoten = " " & Trim(Left(hoten, vt - 1))
If hoten = " " Then Exit Do
Loop
End Function

'====================
Function TachHo(hoten As String) As String
hoten = Trim(hoten)
If hoten = "" Then
TachHo = ""
Else
vt = InStrRev(hoten, " ", Len(hoten))
If vt = 0 Then
TachHo = ""
Else
TachHo = Trim(Mid(hoten, 1, vt))
End If
End If
End Function

'====================
Function TachTen(hoten As String) As String
hoten = Trim(hoten)
If hoten = "" Then
TachTen = ""
Else
vt = InStrRev(hoten, " ", Len(hoten))
If vt = 0 Then
TachTen = hoten
Else
TachTen = Mid(hoten, vt + 1)
End If
End If
End Function
 
Upvote 0
Hàm Dao_Chuoi

To PhamDuyLong: Hàm DaoTen của bạn gần đúng khi dùng với việc đảo họ tên, nếu với đảo chuỗi thì chưa đúng.
Ví dụ
A1 là " Ngày ---- Tháng ----- Năm "
LEN(A1)=50

A3=DaoTen(A1) = "Năm ----- Tháng ---- Ngày "
LEN(A3)=26 - Do thừa dấu trống ở cuối (nếu là đảo họ tên thì cũng là bị sai do thừa ký tự)

Hàm của NVSON
A4=daochuoi_2(A1) = "Năm ----- Tháng ---- Ngày"
LEN(A4)=25

Như vậy cả hai hàm này đã xóa các dấu trống bên trong chuỗi chỉ để ngăn cách từ bởi một dấu trống. Là một chuỗi, sau khi đảo thì vẫn phải đảm bảo số ký tự trong một chuỗi khôing đổi (như ví dụ trên là 44).

Hàm Dao_Chuoi trước của tôi chưa chuẩn vì nó khử tất tả dấu trống bên ngoài mặc dù vẫn bảo toàn bên trong.
Tôi gửi lại phiên hoàn thiện hơn của hàm Dao_Chuoi.

Mã:
Function Dao_Chuoi(ByVal Text As String) As String
On Error GoTo RaiseErr

Dim S As String, tmpText As String
Dim p1, p2, nLen, nSpace1, nSpace2

Dao_Chuoi = Text
tmpText = Trim(Text)
If tmpText = "" Then Exit Function

nSpace1 = 0
GetSpace1:
    If Mid(Text, nSpace1 + 1, 1) = " " Then
        nSpace1 = nSpace1 + 1
        GoTo GetSpace1
    End If
    
nLen = Len(Text)
nSpace2 = 0
GetSpace2:
    If Mid(Text, nLen - nSpace2, 1) = " " Then
        nSpace2 = nSpace2 + 1
        GoTo GetSpace2
    End If
    
tmpText = tmpText & " "
S = ""
p1 = 0
p2 = 1
Do While p2 > 0
    p2 = InStr(p1 + 1, tmpText, " ")
    If p2 > 0 Then
        If S = "" Then
            S = Mid(tmpText, p1 + 1, p2 - p1 - 1) & S
        Else
            S = Mid(tmpText, p1 + 1, p2 - p1) & S
        End If
       p1 = p2
    End If
Loop

Dao_Chuoi = Space(nSpace2) & S & Space(nSpace1)
Exit Function

RaiseErr:
'Dao_Chuoi="Error!"
End Function

A5=Dao_Chuoi(A1) = " Năm ----- Tháng ---- Ngày "
LEN(A5)=50
 
Lần chỉnh sửa cuối:
Upvote 0
....
Như vậy cả hai hàm này đã xóa các dấu trống bên trong chuỗi chỉ để ngăn cách từ bởi một dấu trống. Là một chuỗi, sau khi đảo thì vẫn phải đảm bảo số ký tự trong một chuỗi khôing đổi (như ví dụ trên là 44).
.....
Hi, Anh!
Em chủ yếu làm vậy mà.
Nếu muốn như anh thì:
Mã:
Option Explicit
Public Function daochuoi_2(strText As String)
Dim strText2() As String
Dim strText3 As String
Dim i
strText = strText
strText2 = Split(strText, Space(1))
For i = UBound(strText2) To 0 Step -1
    strText3 = strText3 & Space(1) & strText2(i)
Next i
daochuoi_2 = Mid$(strText3, 2)
End Function
 
Upvote 0
nvson đã viết:
Hi, Anh!
Em chủ yếu làm vậy mà.
Nếu muốn như anh thì:
Mã:
Option Explicit
Public Function daochuoi_2(strText As String)
Dim strText2() As String
Dim strText3 As String
Dim i
strText = strText
strText2 = Split(strText, Space(1))
For i = UBound(strText2) To 0 Step -1
    strText3 = strText3 & Space(1) & strText2(i)
Next i
daochuoi_2 = Mid$(strText3, 2)
End Function

Oh! Hàm Split lợi hại thật! Thế mà anh không biết cứ lọ tự viết hàm từ đầu mới khổ chứ.
Thanks!
 
Upvote 0
Một tuần đi chơi không vào GPE. Cảm ơn các bạn đã quan tâm.
 
Upvote 0
Web KT

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

Back
Top Bottom