Đảo ngược chuỗi kí tự

Liên hệ QC

kongcom

Thành viên hoạt động
Tham gia
20/11/07
Bài viết
189
Được thích
179
Giới tính
Nam
Nghề nghiệp
Dạy cắt may
Mình gặp một bài toán dạng đánh đố . Trong đó các từ đều bị đảo ngược .... Nghe nói EXCEL có thể làm đảo ngược lại chuỗi kí tự bằng hàm tự tạo trong VBA . Nhờ các cao thủ giúp đỡ mình một tay . Cụ thể là làm sao để có thể đọc thành xuôi các từ kiểu như : " lecxE pahP iaiG " ????
 
Có giải pháp đảo chữ đây rồi

kongcom đã viết:
Mình gặp một bài toán dạng đánh đố . Trong đó các từ đều bị đảo ngược .... Nghe nói EXCEL có thể làm đảo ngược lại chuỗi kí tự bằng hàm tự tạo trong VBA . Nhờ các cao thủ giúp đỡ mình một tay . Cụ thể là làm sao để có thể đọc thành xuôi các từ kiểu như : " lecxE pahP iaiG " ????
Oh, thách đố lạ vậy nhỉ:
Có giải pháp đảo chữ đây rồi:
PHP:
Public Function DaoChu(St As String) As String
    Dim strText As String, i As Integer
    Dim subText() As String

    strText = SuperTrim(St)
    subText = Split(strText, " ")
    strText = ""
    For i = UBound(subText) To 0 Step -1
        subText(i) = StrReverse(subText(i))
        strText = strText + subText(i) + " "
    Next
    DaoChu = Trim(strText)

End Function
Trong đó có sd hàm SuperTrim (sưu tầm trên GPE của tác giả nvson, xin cám ơn nvson) đề loại bỏ các khoảng trắng 2 đầu và khoảng có 2 dấu trắng giữa các từ (giống hàm trim trong excel)

Kết quả như ý:
tại ô A1: ="lecxE pahP iaiG"
tại ô B1: =DaoChu(A1) -> là được kết quả như ý

Đã thử cả kết quả có dấu tiếng việt lun được như ý:
ô A2: "Giải pháp excel"
ô B2: =DaoChu(A2)
ô C2: =DaoChu(B2) -> hi iii, lại trở lại ....
(tiếng việt

xem thêm fine gửi kèm
 

File đính kèm

  • DaoChu_tigertiger.zip
    8.1 KB · Đọc: 309
Lần chỉnh sửa cuối:
Upvote 0
@ tigertiger:
Theo mình thì không cần dùng hàm For ... Next nữa vì chỉ cần hàm StrReverse là đã hoàn thành nhiệm vụ rồi!
Mã:
Option Explicit

Public Function daochuoi(strText As String) As String
    Dim sReverse As String
    sReverse = StrReverse(strText)
    daochuoi = sReverse
End Function
(Thêm SuperTrim - nếu cần)
 
Upvote 0
Hay và rất hiệu quả . Nhất là hàm Daochu vì nó tích hợp luôn cả chức năng loại bỏ những dấu cách thưà . Nếu kết hợp cả hàm Daochuoi với SuperTrim thì có ổn không nhỉ . Các hàm này chơi tuốt các thứ tiếng mới kinh .
 
Upvote 0
nvson đã viết:
Theo mình thì không cần dùng hàm For ... Next nữa vì chỉ cần hàm StrReverse là đã hoàn thành nhiệm vụ rồi!
+ oh, cám ơn nvson nhé
+ Đúng là đêm làm - bị sao rồi - quả là ngớ ngẩn khi dùng For tách chuỗi nữa hi hi hi hi

kongcom đã viết:
Hay và rất hiệu quả . Nhất là hàm Daochu vì nó tích hợp luôn cả chức năng loại bỏ những dấu cách thưà . Nếu kết hợp cả hàm Daochuoi với SuperTrim thì có ổn không nhỉ . Các hàm này chơi tuốt các thứ tiếng mới kinh .

Oh, có thể kết hợp được chứ, giờ kết hợp rùi và rút ngắn thế này:
PHP:
Option Explicit

Public Function DaoChu(St As String) As String
    DaoChu = StrReverse(SuperTrim(St))
End Function

Private Function SuperTrim(TheStr As String)
Dim Temp As String, DoubleSpase As String
DoubleSpase = Chr(32) & Chr(32)
Temp = Trim(TheStr)
Temp = Replace(Temp, DoubleSpase, Chr(32))
Do Until InStr(Temp, DoubleSpase) = 0
    Temp = Replace(Temp, DoubleSpase, Chr(32))
Loop
SuperTrim = Temp
End Function
 
Upvote 0
Oke Man .Mình tập hợp các hàm Daochu Daochuoi và ReverTexts vào trong 1 file post lên làm tư liệu chung cho GPE rồi đây . Các bạn xem thế nào nha
 

File đính kèm

  • Ðao chuoi ki tu.rar
    8.4 KB · Đọc: 194
Upvote 0
PHP:
Option Explicit
Public Function DaoChu(strText As String) As String
    Dim sReverse As String 'Nvson
    sReverse = StrReverse(strText)
    'DaoChu = Trim(sReverse)
    DaoChu = WorksheetFunction.Trim(sReverse)
End Function
Tôi thấy từng này cũng được rồi, cần gì phải thêm UDF SuperTrim
Xin hỏi tại sao dùng
DaoChu = Trim(sReverse)
không được mà phải
WorksheetFunction.Trim(sReverse)
Trong khi hàm Trim dùng cả cho VBA và Excel.
Xin cám ơn!
 
Lần chỉnh sửa cuối:
Upvote 0
kongcom đã viết:
Oke Man .Mình tập hợp các hàm Daochu Daochuoi và ReverTexts vào trong 1 file post lên làm tư liệu chung cho GPE rồi đây . Các bạn xem thế nào nha

+ Oh, sao lại viết hàm ReverTexts làm gì nhỉ (lại có cả FOR nữa) ???

+ vì có hàm StrReverse sẵn trong VBA có chức năng tương tự rồi, chi tiết như sau:
PHP:
Function StrReverse(Expression As String) As String
    Member of VBA.Strings
    Reverse a string

Và chỉ cần sử dùng 1 cái DaoChu() cuối cùng trên là đủ rùi, kongcom ah (sorry đấy chỉ là ý kiến của tigertiger)
 
Upvote 0
ThuNghi đã viết:
Tôi thấy từng này cũng được rồi, cần gì phải thêm UDF SuperTrim
Xin hỏi tại sao dùng
DaoChu = Trim(sReverse)
không được mà phải
WorksheetFunction.Trim(sReverse)
Trong khi hàm Trim dùng cả cho VBA và Excel.
Xin cám ơn!

+ Vì phòng trường hợp các chữ gõ cách nhau 2 dấu cách anh thunghi à, hàm Trim trong VBA chỉ bỏ các khoảng trắng trước và sau chuỗi thôi (chắc cái này anh biết rồi)
+ Sử dụng hàm superstrim cho nó chuyên nghiệp hơn (hic) sử dụng toàn VBA thôi,
+ không biết giải thích như vậy đã thỏa ý của anh chưa?
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
ThuNghiXin hỏi tại sao dùng [B đã viết:
DaoChu = Trim(sReverse)[/b]
không được mà phải
WorksheetFunction.Trim(sReverse)
Trong khi hàm Trim dùng cả cho VBA và Excel.
Xin cám ơn!
Hàm TRIM trong Excel cắt tất cả dấu cách thừa (dấu cách bên trái, bên phải và các dấu cách liên tục từ 2 dấu cách trở lên), Ví dụ " Giải pháp____Excel " > "Giải pháp Excel"
Hàm TRIM trong VBA chỉ cắt dấu cách bên trái, bên phải. Ví dụ " Giải pháp____Excel " > "Giải pháp Excel"
 
Upvote 0
Cho hỏi tại sao phải cần dùng TRIM?
Vì làm sao các bạn dám chắc chắn rằng tác giã muốn cắt bõ khoãng trắng 2 đầu? Theo tôi thì có sao đễ vậy sẽ tốt hơn... Khi ra dc kết quả, nếu muốn cắt hay gì nữa thì TRIM vẫn chưa muộn... Lở như có người muốn giữ nguyên gốc thì khi đó có phải là mất công sữa code ko? Dù sao thì giữ nguyên khoãng trắng, cắt bỏ sau đó nếu người dùng muốn vẫn dễ hơn là lỡ cắt rồi giờ lại muốn "gắn" trở lại... Hi... hi...
ANH TUẤN
 
Upvote 0
Nếu dùng bằng công thức thì:
Mã:
=MID($A1,LEN($A1)+1-ROW(INDIRECT("1:"&LEN($A1))),1)
Cái công thức mãng này thật sự đã đão toàn bộ chuổi... Các bạn có thể bôi đen công thức trên thanh Formula rồi F9 sẽ thấy... Nhưng vấn đề là làm sao ráp dc toàn bộ các phần tử trong mãng lại với nhau...
Tôi đã từng gặp rắc rối về vấn đề lắp ráp các phần tử trong mãng lại với nhau... nhưng ko biết phải làm thế nào... Rõ ràng nó có tồn tại, vậy mà ráp lại ko dc... Các cao thủ góp ý giùm với
ANH TUẤN
 
Upvote 0
anhtuan1066 đã viết:
Nếu dùng bằng công thức thì:
Mã:
=MID($A1,LEN($A1)+1-ROW(INDIRECT("1:"&LEN($A1))),1)
Cái công thức mãng này thật sự đã đão toàn bộ chuổi... Các bạn có thể bôi đen công thức trên thanh Formula rồi F9 sẽ thấy... Nhưng vấn đề là làm sao ráp dc toàn bộ các phần tử trong mãng lại với nhau...
Tôi đã từng gặp rắc rối về vấn đề lắp ráp các phần tử trong mãng lại với nhau... nhưng ko biết phải làm thế nào... Rõ ràng nó có tồn tại, vậy mà ráp lại ko dc... Các cao thủ góp ý giùm với
ANH TUẤN

oh, nếu làm được việc ghép các p tử trong mảng -> thì sẽ làm được nhiều điều
tigertiger trước đã thử mãi cũng trả được, lạ wa,
atuan cố lên nhé....
 
Upvote 0
Nhập công thức của AT xong nó ra như thế này mới lạ chứ ?

={" ";" ";" ";" ";"G";"i";"a";"i";" ";"P";"h";"a";"p";" ";"E";"x";"c";"e";"l"}
Không hiểu sao công thức cũng biến mất tiêu ?
 
Upvote 0
Uh... điều đó tất nhiên... Bấm F9 khi quét công thức trên thanh Formula là đễ kiểm tra nhanh kq cũa 1 đoạn công thức nào đó... tuy nhiên khi xem xong thì ko dc Enter, nếu ko sẽ mất sạch... Bạn nên bấm phím Esc thì đúng hơn...
Mến
ANH TUẤN
 
Upvote 0
Đã có hồi âm từ tác giả câu đố .
Để cảm ơn tất cả các bạn đã giúp mình , mình chia sẻ phần thưởng lên đây các bạn cùng thưởng thức nhé .

́OHK ̀AV ̃ÊD
.óđ iờưgn aủc mit iárt gnort ỗhc tộm cợưđ mìt nạb ihk àl óhk gnưhn ,iờưgn tộm aủc ỉhc aịđ ổs gnort ỗhc tộm óc nạb ihk àl ễD
.hnìm hníhc aủc mầl ias ar nậhn ihk àl óhk gnưhn ,cáhk iờưgn aủc mầl iỗl áig hnáđ ihk àl ễD
.hnìm aủc ión iờl gnữhn táos mểik tếib ihk àl óhk gnưhn ,ĩhgn yus gnôhk àm ión ihk àl ễD
.óđ gnơưht tếv nắg nàh ihk àl óhk gnưhn ,gnơưht uêy nạb àm iờưgn tộm gnơưht nổt màl ihk àl ễD
.hnìm ohc ứht aht cáhk iờưgn ohc màl ihk àl óhk gnưhn ,cáhk iờưgn ohc ứht aht ihk àl ễD
.gnúhc oeht màl ihk àl óhk gnưhn ,cắt nêyugn các ar tặđ ihk àl ễD
.ơm cớư tộm ìv uấđ nếihc ihk àl óhk gnưhn ,mêđ gnàh ơm mằn ihk àl ễD
.iạb tấht tộm nậhn nìhn ihk àl óhk gnưhn ,gnắht nếihc nệih ểht ihk àl ễD
.pếit iđ àv yậd gnứđ ihk àl óhk gnưhn ,ãgn àv áđ nòh tộm iảhp pấv ihk àl ễD
.óđ aứh iờl hnàht nàoh ihk àl óhk gnưhn ,óđ ia iớv uềiđ tộm aứh ihk àl ễD
.yàgn gnàh ếht ưhn yấht mảc cáhk iờưgn ohc màl ihk àl óhk gnưhn ,gnơưht uêy at gnúhc gnằr ión at gnúhc ihk àl ễD
.hnìm nâht nảb hníhc nệiht iảc ihk àl óhk gnưhn ,cáhk iờưgn hnìb êhp ihk àl ễD
.óđ mầl ias gnữhn ừt cọh ihk àl óhk gnưhn ,mầl ias ar yảx ểđ ihk àl ễD
.tấm màl gnừđ ểđ óđ uềiđ nếđ ủđ mât nauq ihk àl óhk gnưhn ,iđ tấm óđ ìg uềiđ tộm ìv cựb nồub ihk àl ễD
.gnộđ hnàh uầđ tắb àv ĩhgn yus gnừgn ihk àl óhk gnưhn ,cệiv tộm ềv ĩhgn ihk àl ễD
.nit mềin ọh ohc ihk àl óhk gnưhn ,cáhk iờưgn ềv uấx ĩhgn ihk àl ễD
.ohc ihk àl óhk gnưhn ,nậhn ihk àl ễD
.ón nệih cựht nạb ihk àl óhk gnưhn ,yàn uềiđ gnữhn cọđ ihk àl ễD
.ãđ aưhc aửc hnác tộm yâx ãđ hnìm mex iảhp nạb ,aửc õg gnôhk iãm iộh ơc uếN


 
Upvote 0
Xin diển nôm bài viết cũa Kongcom bằng UDF đơn giãn này:
PHP:
Function Dao(text) As String
    For i = Len(text) To 1 Step -1
        Dao = Dao & Mid(text, i, 1)
    Next i
End Function
------------------------
Bài dịch:
Mã:
DỄ VÀ KHÓ
Dễ là khi bạn có một chỗ trong sổ địa chỉ của một người, nhưng khó là khi bạn tìm được một chỗ trong trái tim của người đó.
Dễ là khi đánh giá lỗi lầm của người khác, nhưng khó là khi nhận ra sai lầm của chính mình.
Dễ là khi nói mà không suy nghĩ, nhưng khó là khi biết kiểm soát những lời nói của mình.
Dễ là khi làm tổn thương một người mà bạn yêu thương, nhưng khó là khi hàn gắn vết thương đó.
Dễ là khi tha thứ cho người khác, nhưng khó là khi làm cho người khác tha thứ cho mình.
Dễ là khi đặt ra các nguyên tắc, nhưng khó là khi làm theo chúng.
Dễ là khi nằm mơ hàng đêm, nhưng khó là khi chiến đấu vì một ước mơ.
Dễ là khi thể hiện chiến thắng, nhưng khó là khi nhìn nhận một thất bại.
Dễ là khi vấp phải một hòn đá và ngã, nhưng khó là khi đứng dậy và đi tiếp.
Dễ là khi hứa một điều với ai đó, nhưng khó là khi hoàn thành lời hứa đó.
Dễ là khi chúng ta nói rằng chúng ta yêu thương, nhưng khó là khi làm cho người khác cảm thấy như thế hàng ngày.
Dễ là khi phê bình người khác, nhưng khó là khi cải thiện chính bản thân mình.
Dễ là khi để xảy ra sai lầm, nhưng khó là khi học từ những sai lầm đó.
Dễ là khi buồn bực vì một điều gì đó mất đi, nhưng khó là khi quan tâm đủ đến điều đó để đừng làm mất.
Dễ là khi nghĩ về một việc, nhưng khó là khi ngừng suy nghĩ và bắt đầu hành động.
Dễ là khi nghĩ xấu về người khác, nhưng khó là khi cho họ niềm tin.
Dễ là khi nhận, nhưng khó là khi cho.
Dễ là khi đọc những điều này, nhưng khó là khi bạn thực hiện nó.
Nếu cơ hội mãi không gõ cửa, bạn phải xem mình đã xây một cánh cửa chưa đã.
ANH TUẤN
 
Upvote 0
Mình đã test thử hàm đảo chữ này cho những chuỗi có đầy đủ dấu tiếng việt unicode thì thấy phát sinh vấn đề như sau:

Vd: chữ "Nguyễn" sau khi đảo chữ thì thành "ñêyugN" >>> đúng ra khi đảo chữ xong thì phải là "nyugN"
 
Upvote 0
Cho tớ hỏi là muốn đảo chuỗi thoe kiểu này thì làm thế nào ạ. VD: Từ "Anh Yêu Em" -> "Em Yêu Anh" đảo ngược lại chuỗi theo dấu cách ý. !$@!!
 
Upvote 0
Cho tớ hỏi là muốn đảo chuỗi thoe kiểu này thì làm thế nào ạ. VD: Từ "Anh Yêu Em" -> "Em Yêu Anh" đảo ngược lại chuỗi theo dấu cách ý. !$@!!
PHP:
Function dao(Rng As String)
Dim i As Long, kQ As String
Dim Arr
Arr = Split(Rng, " ")
For i = UBound(Arr) To 0 Step -1
    kQ = kQ & " " & Arr(i)
Next
    dao = kQ
End Function
 
Upvote 0
Web KT
Back
Top Bottom