Hàm tách dãy ký tự trong chuỗi

Liên hệ QC

yeuhainhat

Thành viên mới
Tham gia
28/7/09
Bài viết
6
Được thích
0
Hi cả nhà,

Cả nhà giúp em dùng hàm để tách dãy ký tự trong 1 chuỗi với.
VD: Áo thun bé gái tay ngắn G017001 (18-24M, Cam) -> tách thành G017001
VD: Áo thun bé trai tay ngắn B116021 (6-9M, Vàng) -> tách thành B116021

Em cảm ơn cả nhà nhiều ạ..
 
Hi cả nhà,

Cả nhà giúp em dùng hàm để tách dãy ký tự trong 1 chuỗi với.
VD: Áo thun bé gái tay ngắn G017001 (18-24M, Cam) -> tách thành G017001
VD: Áo thun bé trai tay ngắn B116021 (6-9M, Vàng) -> tách thành B116021

Em cảm ơn cả nhà nhiều ạ..
Chắc không ai đi tách cái mã hàng đó cả, bởi chắc đã có bảng mã đó rồi. Khi đó, người ta làm như vầy:
=LOOKUP(2,1/SEARCH(danh_muc_ma,chuoi_can_xet),danh_muc_ma)
 
Hi cả nhà,

Cả nhà giúp em dùng hàm để tách dãy ký tự trong 1 chuỗi với.
VD: Áo thun bé gái tay ngắn G017001 (18-24M, Cam) -> tách thành G017001
VD: Áo thun bé trai tay ngắn B116021 (6-9M, Vàng) -> tách thành B116021

Em cảm ơn cả nhà nhiều ạ..
Nếu không biết hay không rành về các hàm, bạn có thể gởi file và mô tả yêu cầu trong file, lúc đó bạn sẽ nhận được kết quả như mong muốn
 
Hi cả nhà,

Cả nhà giúp em dùng hàm để tách dãy ký tự trong 1 chuỗi với.
VD: Áo thun bé gái tay ngắn G017001 (18-24M, Cam) -> tách thành G017001
VD: Áo thun bé trai tay ngắn B116021 (6-9M, Vàng) -> tách thành B116021

Em cảm ơn cả nhà nhiều ạ..
Hi cả nhà,

Cả nhà giúp em dùng hàm để tách dãy ký tự trong 1 chuỗi với.
VD: Áo thun bé gái tay ngắn G017001 (18-24M, Cam) -> tách thành G017001
VD: Áo thun bé trai tay ngắn B116021 (6-9M, Vàng) -> tách thành B116021

Em cảm ơn cả nhà nhiều ạ..
Giả sử dữ liệu của bạn có trong cột A, bắt đầu từ A1 thì:
PHP:
Sub abc()
    Dim a, i
    For i = 1 To Range("A" & Rows.Count).End(3).Row
        Set a = Range("A" & i)
        Range("F" & i) = Split(a, " ")(7)
     Next i
End Sub
 
Hi cả nhà,

Cả nhà giúp em dùng hàm để tách dãy ký tự trong 1 chuỗi với.
VD: Áo thun bé gái tay ngắn G017001 (18-24M, Cam) -> tách thành G017001
VD: Áo thun bé trai tay ngắn B116021 (6-9M, Vàng) -> tách thành B116021

Em cảm ơn cả nhà nhiều ạ..
Làm vầy:
Mã:
=MID(A1,FIND("(",A1)-8,7)
Hên thì trúng, xui thì.. trật!
 
Giả sử dữ liệu của bạn có trong cột A, bắt đầu từ A1 thì:
PHP:
Sub abc()
    Dim a, i
    For i = 1 To Range("A" & Rows.Count).End(3).Row
        Set a = Range("A" & i)
        Range("F" & i) = Split(a, " ")(7)
     Next i
End Sub
Cái (7) của anh là hơi mạo hiểm. Nhỡ nó phát sinh như dưới đây thì sai, theo em ý tưởng như bài #2 có lý, có danh sách mã, rồi tách từ danh mục mã đó lấy mã trong cụm ký tự, tất nhiên chỉ là đoán thôi, không trúng ta làm lại :D

Áo thun kẻ bé gái tay ngắn G017001 (18-24M, Cam)
 
Chắc không ai đi tách cái mã hàng đó cả, bởi chắc đã có bảng mã đó rồi. Khi đó, người ta làm như vầy:
=LOOKUP(2,1/SEARCH(danh_muc_ma,chuoi_can_xet),danh_muc_ma)
E cảm ơn ạ.. Do cái file của em khách gửi cho phần tên hàng và mã hàng chung với nhau nên giờ e phải tách ra để tiện theo dõi.
 
Hi cả nhà,

Cả nhà giúp em dùng hàm để tách dãy ký tự trong 1 chuỗi với.
VD: Áo thun bé gái tay ngắn G017001 (18-24M, Cam) -> tách thành G017001
VD: Áo thun bé trai tay ngắn B116021 (6-9M, Vàng) -> tách thành B116021

Em cảm ơn cả nhà nhiều ạ..
Bài này dùng REG có vẻ hợp lý:
PHP:
Function tach(text As String)
With CreateObject("vbscript.regexp")
    .Global = True: .Pattern = "^.*(\b[a-zA-Z]+\d{5,}).*$"
    tach = .Replace(text, "$1")
End With
End Function
Giả sử dữ liệu bạn tại cột A, bạn dùng công thúc: B1 =tach(A1) rồi fill xuông!!
 
Bài này dùng REG có vẻ hợp lý:
PHP:
Function tach(text As String)
With CreateObject("vbscript.regexp")
    .Global = True: .Pattern = "^.*(\b[a-zA-Z]+\d{5,}).*$"
    tach = .Replace(text, "$1")
End With
End Function
Giả sử dữ liệu bạn tại cột A, bạn dùng công thúc: B1 =tach(A1) rồi fill xuông!!
Nếu bạn rảnh, bạn có thể phân tích giúp tôi dòng:
PHP:
.Pattern = "^.*(\b[a-zA-Z]+\d{5,}).*$"
và dòng có ký tự
PHP:
"$1"
Cảm ơn bạn eke_rula.
 
Nếu bạn rảnh, bạn có thể phân tích giúp tôi dòng:
PHP:
.Pattern = "^.*(\b[a-zA-Z]+\d{5,}).*$"
và dòng có ký tự
PHP:
"$1"
Cảm ơn bạn eke_rula.
Ví dụ, em xét đoạn text "Áo thun bé gái tay ngắn G017001 (18-24M, Cam)"
PHP:
Pattern = "^.*(\b[a-zA-Z]+\d{5,}).*$"
Em giải thích từng đoạn đoạn trong pattern
[a-zA-Z] là một kí tự bất kì từ a->z hoặc A-Z có thể là a,b,C,G...
[a-zA-Z] + là chuỗi kí tự đó nhiều hơn hoặc bằng 1 kí tự có thể là: B, aC, bDF, dasKJK...
\d là kí tự phải là số (0-9)
\d{5,} yêu cầu số này là số có 5 chữ số trờ lên
Tức là đoạn \b[a-zA-Z]+\d{5,} yêu cầu là đoạn đầu phải là các kí tự anpha có ít nhất là một kí tự và đoạn sau phải là chuỗi số có ít nhất 5 kí tự
\b ở đây vị trí của tập [a-zA-Z] và không phải tập [a-zA-Z], trong trường hợp này là khoảng trắng, có thể thay \b thành \s hoặc " " đều được.
.* có nghĩ là một chuỗi bất kì có ít nhất 0 kí tự, dấu ^ là yêu cầu bắt buộc xét chuỗi từ đầu chuỗi, dấu $ là yêu cầu bắt buộc phãi xét đến cuối chuỗi.
Trong đây em có sử dụng (...) , khi mà sử dụng dấu (..) thì reg sẽ tự động lưu những gì trong dấu ngoặc đó vào bộ nhớ submatches (trừ một số trường hợp như (?=)(?:)(?!)....). "$1" tức là những gì trong dấu ngoặc thứ nhất đã được lưu.
Trong cái pattern trên thì em chỉ sữ dụng có 1 (...) duy nhất nên vị trí lưu của nó là số 1 (submatches(0)).
Đoạn text này "Áo thun bé gái tay ngắn G017001 (18-24M, Cam)" khi so với paterrn "^.*(\b[a-zA-Z]+\d{5,}).*$" thì có thể phân tích như vây
Đoạn "Áo thun bé gái tay ngắn " sẽ là
^.*
Đoạn "G017001" sẽ là (\b[a-zA-Z]+\d{5,})., vì dùng dấu () nên G017001 sẽ được lưu vào submatches với vị trí số 1
Đoạn (18-24M, Cam) sẽ là
.*$
Tức là đoạn phù hợp với paterrn cũng chính là chuỗi "Áo thun bé gái tay ngắn G017001 (18-24M, Cam)" và $1 là "G017001"
Khi replace(text,"S1") tức lả chuyển chuỗi "Áo thun bé gái tay ngắn G017001 (18-24M, Cam)" thành "G017001".
Hi vọng anh hiểu!!!
 
Lần chỉnh sửa cuối:
Ví dụ, em xét đoạn text "Áo thun bé gái tay ngắn G017001 (18-24M, Cam)"
PHP:
Pattern = "^.*(\b[a-zA-Z]+\d{5,}).*$"
Em giải thích từng đoạn đoạn trong pattern
[a-zA-Z] là một kí tự bất kì từ a->z hoặc A-Z có thể là a,b,C,G...
[a-zA-Z] + là chuỗi kí tự đó nhiều hơn hoặc bằng 1 kí tự có thể là: B, aC, bDF, dasKJK...
\d là kí tự phải là số (0-9)
\d{5,} yêu cầu số này là số có 5 chữ số trờ lên
Tức là đoạn \b[a-zA-Z]+\d{5,} yêu cầu là đoạn đầu phải là các kí tự anpha có ít nhất là một kí tự và đoạn sau phải là chuỗi số có ít nhất 5 kí tự
\b ở đây vị trí của tập [a-zA-Z] và không phải tập [a-zA-Z], trong trường hợp này là khoảng trắng, có thể thay \b thành \s hoặc " " đều được.
.* có nghĩ là một chuỗi bất kì có ít nhất 0 kí tự, dấu ^ là yêu cầu bắt buộc xét chuỗi từ đầu chuỗi, dấu $ là yêu cầu bắt buộc phãi xét đến cuối chuỗi.
Trong đây em có sử dụng (...) , khi mà sử dụng dấu (..) thì reg sẽ tự động lưu những gì trong dấu ngoặc đó vào bộ nhớ submatches (trừ một số trường hợp như (?=)(?:)(?!)....). "$1" tức là những gì trong dấu ngoặc thứ nhất đã được lưu.
Trong cái pattern trên thì em chỉ sữ dụng có 1 (...) duy nhất nên vị trí lưu của nó là số 1 (submatches(0)).
Đoạn text này "Áo thun bé gái tay ngắn G017001 (18-24M, Cam)" khi so với paterrn "^.*(\b[a-zA-Z]+\d{5,}).*$" thì có thể phân tích như vây
Đoạn "Áo thun bé gái tay ngắn " sẽ là
^.*
Đoạn "G017001" sẽ là (\b[a-zA-Z]+\d{5,})., vì dùng dấu () nên G017001 sẽ được lưu vào submatches với vị trí số 1
Đoạn (18-24M, Cam) sẽ là
.*$
Tức là đoạn phù hợp với paterrn cũng chính là chuỗi "Áo thun bé gái tay ngắn G017001 (18-24M, Cam)" và $1 là "G017001"
Khi replace(text,"S1") tức lả chuyển chuỗi "Áo thun bé gái tay ngắn G017001 (18-24M, Cam)" thành "G017001".
Hi vọng anh hiểu!!!
Cảm ơn bạn nhiều.
 
Web KT

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

Back
Top Bottom