Xin vui lòng hướng dẫn HÀM tách chữ trong VBA

Liên hệ QC

Ếch Xanh

Thành viên tích cực
Tham gia
12/8/09
Bài viết
865
Được thích
1,572
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 ** là không xác định ký tự, Xác định được là: A, ()-
Tôi muốn tách lấy **.

Cám ơn rất nhiều!
 
Bạn thử đoạn hàm này xem:

Mã:
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ú pháp =Tachso(Chuoi)
 
Upvote 0
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 ** là không xác định ký tự, Xác định được là: A, ()-
Tôi muốn tách lấy **.

Cám ơn rất nhiều!
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ó
PHP:
=MID(Chuổi,FIND("(",Chuổi)+1,FIND("-",Chuổi)-FIND("(",Chuổi)-1)
Nếu muốn tạo 1 UDF, tôi làm như sau:
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
Cú pháp:
PHP:
=GetString(Chuổi, Ký bắt đầu, Ký tự kết thúc)
Ví dụ:
PHP:
=GetString(A1,"(","-")
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ập
----------------------
Anh sealand ơi! Tác giá yêu cầu tách chữ chứ đâu phải chỉ tách lấy số
 
Lần chỉnh sửa cuối:
Upvote 0
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ó
PHP:
=MID(Chuổi,FIND("(",Chuổi)+1,FIND("-",Chuổi)-FIND("(",Chuổi)-1)
Nếu muốn tạo 1 UDF, tôi làm như sau:
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
Cú pháp:
PHP:
=GetString(Chuổi, Ký bắt đầu, Ký tự kết thúc)
Ví dụ:
PHP:
=GetString(A1,"(","-")
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ập
----------------------
Anh sealand ơi! Tác giá yêu cầu tách chữ chứ đâu phải chỉ tách lấy số
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"
Các Thầy xem có cách nào không
 

File đính kèm

Upvote 0
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"
Anh ơi, ở trên người ta có nói rằng:
Xác định được là: A, ()-
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!
 
Lần chỉnh sửa cuối:
Upvote 0
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!

Cám ơn các Thầy các Anh đã quan tâm hướng dẫn em. Mấy ngày nay lu bu không lên mạng được. Em chỉ cần xác định đúng kiểu cấu trúc mà em đã đề cập, tức là không thêm dấu ngoặc nào ở trong ** cả. Em cám ơn Anh Sealand đã gửi hàm đầu tiên, nhiêu đó cũng đã đúng ý em rồi. Nhưng giờ được Anh NDU hướng dẫn thêm UFD nữa thật là quá tốt vì em nghĩ nó rộng hơn về điều kiện đã xác định.

Một lần nữa em xin cảm ơn mọi người đã giúp em!


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)
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
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!
 
Upvote 0
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Ì?
 
Upvote 0
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Ì?

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.
 
Upvote 0
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.
Ô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?
 
Upvote 0
Ô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?
Thầ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!
 
Upvote 0
Thầ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!
Đó 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àm
Cách tôi đưa ở trên là dùng cho trường hợp tổng quát: Tách lấy chuổi từ sau ký tự "(" đến trước ký tự "-" tiếp theo
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom