Tách ký tự trong chuỗi

Liên hệ QC

mhung12005

Thành viên chậm chạm
Tham gia
20/7/11
Bài viết
1,598
Được thích
1,261
Nghề nghiệp
Đâu có việc thì làm
Xin chào các anh chị !

Em có bài toán (như trong file đính kèm) vượt quá khả năng. Em muốn nhờ các anh chi giúp đỡ giải hoặc đưa ra giải pháp giúp em.
Em xin chân thành cảm ơn.
 

File đính kèm

  • test.xls
    23.5 KB · Đọc: 454
xin chào các anh chị !

Em có bài toán (như trong file đính kèm) vượt quá khả năng. Em muốn nhờ các anh chi giúp đỡ giải hoặc đưa ra giải pháp giúp em.
Em xin chân thành cảm ơn.
dùng công thức mảng này
PHP:
=mid($d5,large(if(isnumber(--mid($d5,row(indirect("1:"&len($d5))),1)),row(indirect("1:"&len($d5))),""),1)+1,len($d5))
 
dùng công thức mảng này
PHP:
=mid($d5,large(if(isnumber(--mid($d5,row(indirect("1:"&len($d5))),1)),row(indirect("1:"&len($d5))),""),1)+1,len($d5))

Gửi bạn Lê Duy Thương !

Thật sự xin bái phục. Mình lại làm phiền bạn lần nữa. Bạn có thể giải thích cho mình hiểu mấu chốt của vấn đề là gì không ?
Hoặc giải thích công thức của bạn.

Chân thành cảm ơn bạn.
 
Lần chỉnh sửa cuối:
gửi bạn lê duy thương !

Thật sự xin bái phục. Mình lại làm phiền bạn lần nữa. Bạn có thể giải thích cho mình hiểu mấu chốt của vấn đề là gì không ?
Hoặc giải thích công thức của bạn.

Chân thành cảm ơn bạn.
tạm giai thích n hư sau
1 dùng hàm if kết hợp với isnumber và mid để xét từng ký tự trong chuỗi từ trái qua phải xem ký tự nào là số thì gán cho nó là vị trí thứ tự của ký tự số đó . Ký tự nào ko phải là số thì thay = "".
2- dùng hàm large để lấy vị trí sau cùng của ký tự số.
3-dùng lại hàm mid để lấy những ký tự đứng sau ký tự số sau cùng
do tôi không có kỹ năng sư phạm như lão sư phụ chết tiệt nên giải thích cũng khó hiểu.để hiểu thêm bạn nên học thuộc những hàm mà tôi đã kết hợp thì sẽ dễ hiểu hơn
chúc bạn nhanh chóng thành công
 
tạm giai thích n hư sau
1 dùng hàm if kết hợp với isnumber và mid để xét từng ký tự trong chuỗi từ trái qua phải xem ký tự nào là số thì gán cho nó là vị trí thứ tự của ký tự số đó . Ký tự nào ko phải là số thì thay = "".
2- dùng hàm large để lấy vị trí sau cùng của ký tự số.
3-dùng lại hàm mid để lấy những ký tự đứng sau ký tự số sau cùng
do tôi không có kỹ năng sư phạm như lão sư phụ chết tiệt nên giải thích cũng khó hiểu.để hiểu thêm bạn nên học thuộc những hàm mà tôi đã kết hợp thì sẽ dễ hiểu hơn
chúc bạn nhanh chóng thành công

Xin cảm ơn bạn !

Các hàm mà bạn đã dùng thực ra mình cũng biết dùng nó (chỉ dùng đơn lẻ) nhưng cách sử dụng trên dữ liệu mảng thì mình không rành lắm. Xin hỏi bạn có phương pháp gì để có thể học cách sử dụng mảng nhanh và chính xác không. Xin bạn chia sẻ. Xin cảm ơn.
 
Xin cảm ơn bạn !

Các hàm mà bạn đã dùng thực ra mình cũng biết dùng nó (chỉ dùng đơn lẻ) nhưng cách sử dụng trên dữ liệu mảng thì mình không rành lắm. Xin hỏi bạn có phương pháp gì để có thể học cách sử dụng mảng nhanh và chính xác không. Xin bạn chia sẻ. Xin cảm ơn.
Ngắn hơn nè :
PHP:
=RIGHT(D5,LEN(D5)-MATCH(1,-MID(D5,ROW($1:$99),1)))
Nếu kết thúc bằng Ctrl+Shift+Enter
Hoặc :
PHP:
=RIGHT(D5,LEN(D5)-LOOKUP(1,-MID(D5,ROW($1:$99),1),ROW($1:$99)))
Kết thúc với Enter nhé!
 
Xin cảm ơn bạn !
Các hàm mà bạn đã dùng thực ra mình cũng biết dùng nó (chỉ dùng đơn lẻ) nhưng cách sử dụng trên dữ liệu mảng thì mình không rành lắm. Xin hỏi bạn có phương pháp gì để có thể học cách sử dụng mảng nhanh và chính xác không. Xin bạn chia sẻ. Xin cảm ơn.
Giả sử bạn có chuỗi SDFG658SR tại ô A1.
Muốn tách SR ra thì bạn phải xác định giá trị số cuối cùng trong chuỗi.
Muốn vậy bạn phải tạo mảng chứa từng ký tự trong chuỗi.
Thử làm thủ công:
MID(A1,1,1)= "S"
MID(A1,2,1)= "D"
MID(A1,3,1)= "F"
...
MID(A1,9,1)= "R"
Bạn sẽ thấy các con số màu đỏ tuân theo quy luật: dãy số nguyên từ 1 tới LEN(A1) = ROW(INDIRECT("1:"&LEN(A1)))
Như vậy, MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1) = MID(A1,{1,2,3,...,9},1)= "S","D","F","G","6","5","8","S","R" (gọi tắt là "Chuỗi")
ISNUMBER(--"Chuỗi") = FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE (Hai dấu trừ để biến Text thành giá trị số)
So sánh với ROW(INDIRECT("1:"&LEN(A1))) = {1,2,3,4,5,6,7,8,9}, để gán thứ tự cho các giá trị số:
IF(ISNUMBER(--"Chuỗi")),ROW(INDIRECT("1:"&LEN(A1))),"") = {"","","","",5,6,7,"",""}
Dùng MAX hoặc LARGE để lấy số 7 là vị trí của số cuối cùng, +1 có vị trí ký tự kế tiếp.
Dùng MID sẽ ra được chuỗi ký tự phía sau
 
Giả sử bạn có chuỗi SDFG658SR tại ô A1.
Muốn tách SR ra thì bạn phải xác định giá trị số cuối cùng trong chuỗi.
Muốn vậy bạn phải tạo mảng chứa từng ký tự trong chuỗi.
Thử làm thủ công:
MID(A1,1,1)= "S"
MID(A1,2,1)= "D"
MID(A1,3,1)= "F"
...
MID(A1,9,1)= "R"
Bạn sẽ thấy các con số màu đỏ tuân theo quy luật: dãy số nguyên từ 1 tới LEN(A1) = ROW(INDIRECT("1:"&LEN(A1)))
Như vậy, MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1) = MID(A1,{1,2,3,...,9},1)= "S","D","F","G","6","5","8","S","R" (gọi tắt là "Chuỗi")
ISNUMBER(--"Chuỗi") = FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE (Hai dấu trừ để biến Text thành giá trị số)
So sánh với ROW(INDIRECT("1:"&LEN(A1))) = {1,2,3,4,5,6,7,8,9}, để gán thứ tự cho các giá trị số:
IF(ISNUMBER(--"Chuỗi")),ROW(INDIRECT("1:"&LEN(A1))),"") = {"","","","",5,6,7,"",""}
Dùng MAX hoặc LARGE để lấy số 7 là vị trí của số cuối cùng, +1 có vị trí ký tự kế tiếp.
Dùng MID sẽ ra được chuỗi ký tự phía sau

bebo giải thích rất ok hôm nào offline phải làm vài ve với bebo
ẹc ẹc
 
Ngắn hơn nè :
PHP:
=RIGHT(D5,LEN(D5)-MATCH(1,-MID(D5,ROW($1:$99),1)))
Nếu kết thúc bằng Ctrl+Shift+Enter
Hoặc :
PHP:
=RIGHT(D5,LEN(D5)-LOOKUP(1,-MID(D5,ROW($1:$99),1),ROW($1:$99)))
Kết thúc với Enter nhé!
Vầy còn ngắn hơn:
PHP:
=REPLACE(D5,1,MATCH(1,-MID(D5,ROW($1:$99),1)),"")
Ẹc... Ẹc...
 
PHP:
=REPLACE(D5,1,MATCH(1,-MID(D5,ROW($1:$99),1)),"")

Công thức của thày quả là độc đáo, hay quá.
 
Em đang tổng ôn tập về công thức, xin góp thêm cách nữa, nó không hay bằng cách của thày Ndu và mọi người, nhưng cũng là 1 giải pháp
PHP:
DL=Sheet1!$D5
PHP:
DK=IF(ISNUMBER(1*MID(DL;ROW(INDIRECT("1:"&LEN(DL)));1));ROW(INDIRECT("1:"&LEN(DL)));"")

Công thức tại ô E5 như sau:

PHP:
=MID(DL;MAX(DK)+1;LEN(DL))
kéo xuống các ô còn lại ra kết quả cuối cùng
----------
 

File đính kèm

  • test.xls
    24 KB · Đọc: 25
Vầy còn ngắn hơn:
PHP:
=REPLACE(D5,1,MATCH(1,-MID(D5,ROW($1:$99),1)),"")
Ẹc... Ẹc...
đúng là ngắn thậtbấy lâu nay tôi cứ đi tìm cái xa xôi mà quên đi cái gần trước mắt.NDU đúng là quái kiệt của GPE30/4--1/5 nghỉ 3 ngày chắc phải ốp la thôi anh Tuấn nhỉẹc ẹc
 
Công thức sư phụ hay quá, độc đáo nhất là thêm dấu - vào trước hàm Mid (-1*Mid)

PHP:
-MID(D5,ROW($1:$99),1)

--> biến tất cả chữ về #VALUE!, các số về giá trị <0

Đúng là quái kiệt thật, xin bái phục.
 
Công thức sư phụ hay quá, độc đáo nhất là thêm dấu - vào trước hàm Mid (-1*Mid)

PHP:
-MID(D5,ROW($1:$99),1)

--> biến tất cả chữ về #VALUE!, các số về giá trị <0

Đúng là quái kiệt thật, xin bái phục.

Ấy... cái dấu - thêm vào này là của con bé Còi
Tôi chỉ sửa lại chút thôi
cũng có nghĩa con bé ấy mới là...quái (NỮ QUÁI)
Ẹc... Ẹc...
 
Cho em hỏi muốn lấy khoảng số đầu tiên làm thế nào ah?

Nhân tiện chủ đề tách, em xin hỏi bài toán muốn lấy khoảng số đầu tiên thì thuật toán làm bài này như thế nào ah:

VD: 122aab123bv ---> cho kết quả là 123
a1232ss12 --> 1232
b112bbb256 --> 112
 

File đính kèm

  • Cum so dau.xls
    30.5 KB · Đọc: 18
Nhân tiện chủ đề tách, em xin hỏi bài toán muốn lấy khoảng số đầu tiên thì thuật toán làm bài này như thế nào ah:

VD: 122aab123bv ---> cho kết quả là 123
a1232ss12 --> 1232
b112bbb256 --> 112
Dữ liệu cần tách tại A1 :
PHP:
=LOOKUP(99^99,--MID(A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A1&"0123456789")),ROW(INDIRECT("1:"&LEN(A1)))))
@ndu : Sư phu ơi,kiến thức chung, em cũng học hỏi từ sư phụ và các anh chị trên diễn đàn nhiều, bảo em là ...quái em ế chống đấy, hiện tại thì đang ế cấp độ 2 rùi, bị gọi là QUÁI thế này hem bít sẽ thế nào nữa đây???hic hic!!!
 
Lần chỉnh sửa cuối:
Chị hoamattroicoi kiến thức siêu quá, công thức này chắc chỉ có các thày trên diễn đàn là làm được, chứ cỡ như em ngồi cả ngày cũng chẳng nghĩ được

Xin hỏi chị và mọi người một chút để em học hỏi, nếu em cần lấy cụm số thứ 2 thì thuật toán thay đổi thế nào?
VD: 122aab123bv ---> cho kết quả là 123
a1232ss12 --> 12
b112bbb256 --> 256
-------
Nếu được hộ cho em cả VBA nữa càng tốt ah.
 
Lần chỉnh sửa cuối:
Thưa thày trong công thức
PHP:
=REPLACE(D5,1,MATCH(1,-MID(D5,ROW($1:$99),1)),"")
hoặc em thay bằng công thức tương đương
PHP:
MID(D5,MATCH(1,-MID(D5,ROW(INDIRECT("1:"&LEN(D5))),1))+1,LEN(D5))
Em thắc mắc thành phần MATCH(1,-MID(D5,ROW($1:$99),1)) nó 1 số cụ thể rồi (chứ không phải là một mảng) thế thì tại sao lại cần Ctrl+Shift+Enter thì nó mới ra kết quả

----------------


Em ví dụ:
MATCH(1,-MID(D5,ROW($1:$99),1))=6 --->
REPLACE
(D5,1,MATCH(1,-MID(D5,ROW($1:$99),1)),"")
<=> REPLACE(D5,1,6,"") thể thì tại sao lại cần Ctrl+Shift+Enter nữa?
 
Chị hoamattroicoi kiến thức siêu quá, công thức này chắc chỉ có các thày trên diễn đàn là làm được, chứ cỡ như em ngồi cả ngày cũng chẳng nghĩ được

Xin hỏi chị và mọi người một chút để em học hỏi, nếu em cần lấy cụm số thứ 2 thì thuật toán thay đổi thế nào?
VD: 122aab123bv ---> cho kết quả là 123
a1232ss12 --> 12
b112bbb256 --> 256
-------
Nếu được hộ cho em cả VBA nữa càng tốt ah.
Ui siêu gì đâu, tôi cũng học của các sư phụ và các anh chị trên diễn đàn thôi.
Thứ 2 như thế này : 123bgbf34 = 34 và thứ 2 thế này : fgdh13562fbf12vbfbv78 = 12 khác nhau nhé.
Nếu thứ 2 giống kiểu của bạn thì tôi làm thế này với UDF :
PHP:
Function tachSOcuoi(Rng As Range)
Dim i As Integer
Dim Mys As String
Dim j As Integer
Dim x
Mys = Rng.Value
For i = Len(Mys) To 1 Step -1
    If IsNumeric(Mid(Mys, i, 1)) Then Exit For
Next
For j = i To 1 Step -1
    If IsNumeric(Mid(Mys, j, 1)) = False Then Exit For
        x = Mid(Mys, j, 1) & x
Next
    tachSOcuoi = x
End Function
VBA của tôi chắc chưa siêu bằng bạn đâu vì tôi chỉ biết viết những CODE đơn giản thôi!
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom