Option Explicit
Function Tachso(ch As String)
Dim i As Integer
Dim kt As String
Dim test As Boolean
For i = 1 To Len(ch)
kt = Mid(ch, i, 1)
If kt = "(" Then test = True
If kt = "-" And test Then Exit Function
If IsNumeric(kt) And test Then Tachso = Tachso & kt
Next
End Function
Cái này dùng công thức quá đơn giản!Kính nhờ các Thầy, Anh, Chị hướng dẫn tôi code (Hàm) tách chữ trong textbox với cấu trúc như sau:
XXX (**-A)
Với XXX và ** là không xác định ký tự, Xác định được là: A, () và -
Tôi muốn tách lấy **.
Cám ơn rất nhiều!
=MID(Chuổi,FIND("(",Chuổi)+1,FIND("-",Chuổi)-FIND("(",Chuổi)-1)
Function GetString(Text As String, StartStr As String, EndStr As String) As String
Dim StP As Long, EnP As Long
On Error Resume Next
StP = InStr(1, Text, StartStr)
EnP = InStr(1, Text, EndStr)
If StP * EnP Then
GetString = Mid(Text, StP + 1, EnP - StP - 1)
End If
End Function
=GetString(Chuổi, Ký bắt đầu, Ký tự kết thúc)
=GetString(A1,"(","-")
Thầy Ndu & Thầy Sealand ơi, em cũng làm công thức y như Thầy Ndu nhưng nếu lỡ XXX mà có "(" hoặc ")" hoặc "_" thì "tèo"Cái này dùng công thức quá đơn giản!
Vì bạn biết trước ký tự bắt đầu tìm là "(" và ký tự kết thúc là "-" ---> Vậy ta có
Nếu muốn tạo 1 UDF, tôi làm như sau:PHP:=MID(Chuổi,FIND("(",Chuổi)+1,FIND("-",Chuổi)-FIND("(",Chuổi)-1)
Cú pháp:PHP:Function GetString(Text As String, StartStr As String, EndStr As String) As String Dim StP As Long, EnP As Long On Error Resume Next StP = InStr(1, Text, StartStr) EnP = InStr(1, Text, EndStr) If StP * EnP Then GetString = Mid(Text, StP + 1, EnP - StP - 1) End If End Function
Ví dụ:PHP:=GetString(Chuổi, Ký bắt đầu, Ký tự kết thúc)
Tất cả dùng các hàm xử lý chuổi để xác định vị trí và lấy ra chuổi mình cần, không vòng lậpPHP:=GetString(A1,"(","-")
----------------------
Anh sealand ơi! Tác giá yêu cầu tách chữ chứ đâu phải chỉ tách lấy số
Anh ơi, ở trên người ta có nói rằng:Thầy Ndu & Thầy Sealand ơi, em cũng làm công thức y như Thầy Ndu nhưng nếu lỡ XXX mà có "(" hoặc ")" hoặc "_" thì "tèo"
Em thử dùng vòng lặp nhưng nếu ** mà có "(" cũng "tèo"
XÁC ĐỊNH ĐƯỢC ở đây em nghĩ rằng ký tự ấy là duy nhất ấy chứ (mới gọi là xác định)... Chứ nếu có hàng trăm ký tự giống nhau tồn tại trong 1 chuổi thì lại là vấn đề khác à nhaXác định được là: A, () và -
Anh ơi, ở trên người ta có nói rằng:
XÁC ĐỊNH ĐƯỢC ở đây em nghĩ rằng ký tự ấy là duy nhất ấy chứ (mới gọi là xác định)... Chứ nếu có hàng trăm ký tự giống nhau tồn tại trong 1 chuổi thì lại là vấn đề khác à nha
Em nghĩ bài toán này yêu cầu rằng "Tách lấy nhóm ký tự nằm giữa 2 ký tự cho trước (2 ký tự đã xác định)"
Chờ tác giả có ý kiến vậy!
PS: Thầy NDU ơi, nhưng nếu có dấu "-" phía trước thì không cho kết quả?!
VD: 28/02-Canh Dần 15:05:00 (909-A)
Có thêm "-" thì công thức "tèo", miễn " (**-A) " nằm ở cuối cùng thì code vẫn okCó lẽ không thể để 2 dấu "-" trong cùng một cell chăng? Bạn thử đổi dấu khác trước nó được không?
Hỏi lại cho rõ:Thấy cấu trúc của Thầy NDU là =GetString(chuỗi, ký tự đầu, ký tự cuối), tưởng vậy đã xác định, nhưng trong trường hợp này ký tự cuối cũng được xác định như ký tự đầu trong trường hợp xx-xx-xx (**-A). Không biết Thầy NDU có thể chỉnh code sao cho chỉ xác định vùng cần tìm (***-A) còn bên ngoài thì không quan tâm hay không? Riêng phần bên trong dấu Ngoặc không có thêm bất cứ dấu "-" hay dấu ngoặc nào khác!
Cám ơn rất nhiều!
Hỏi lại cho rõ:
Với chuổi: xx-xx-xx (**-A)
Thì cái bạn cần lấy là CÁI GÌ?
Ôi... nếu thế thì hàm trên chẳng cần chỉnh sửa gì cả! Khéo léo phối hợp công thức là ra!Dạ, em chỉ cần lấy ** trong ngoặc thôi ạ. xx-xx-xx (**-A)
Tính từ phải qua trái thì 3 ký tự "-A)", đến ** rồi đến dấu mở ngoặc "(". Vì ** không xác định được 1 hay nhiều ký tự nên mới tìm hàm tách là vậy đó ạ.
Cám ơn Thầy đã quan tâm.
Thầy ơi, em thấy vầy, sau khi có KQ1 thì như vầy cho tiện:Ôi... nếu thế thì hàm trên chẳng cần chỉnh sửa gì cả! Khéo léo phối hợp công thức là ra!
Ví dụ:
- Với chuổi xx-xx-xx (456-A) nằm tại cell A1
- Bạn cần lấy ra số 456
Vậy:
- Đầu tiên dùng hàm GetString với ký tự đầu là "(" và ký tự cuối là ")"
GetString(A1,"(",")") ---> ta được kết quả 456-A (tạm gọi là KQ1)
- Dùng tiếp GetString với kết quả trên như sau:
=GetString(Char(1) & KQ1,CHAR(1),"-")
Hay:
=GetString(CHAR(1)&GetString(A1,"(",")"),CHAR(1),"-")
Thử xem đúng không?
Đó là tùy vào dữ liệu thật của bạn mà quyết định thôi... Nếu bạn chắc rằng sẽ "bỏ bớt" 2 ký tự cuối thì... cứ thế mà làmThầy ơi, em thấy vầy, sau khi có KQ1 thì như vầy cho tiện:
=LEFT(KQ1,LEN(KQ1)-2)
Như vậy khỏi cầu kỳ phải không thưa Thầy!