Tách ký tự trong chuỗi

Liên hệ QC
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!
Hihi, bài này viết code thì đơn giản thôi Còi nhỉ
Nhưng đề phòng bạn í muốn thêm cụm số thứ 3, rồi thứ 4 .......thứ 100 thì rào trước luôn cho bạn í khỏi hỏi
Mã:
Public Function LaySo(Cll As Range, ThuTu As Integer) As Variant
    Dim CoRe, Tach, Kq
    Set CoRe = CreateObject("VBScript.RegExp")
        With CoRe
            .Global = True
            .Pattern = "[\D]"
            Kq = Application.WorksheetFunction.Trim(.Replace(Cll, " "))
        End With
    Tach = Split(Kq)
    If ThuTu - 1 > UBound(Tach) Then
        LaySo = "Làm dech gì có so này"
    Else
        LaySo = Tach(ThuTu - 1)
    End If
End Function
Cú pháp: =Layso(Cell muốn lấy,thứ tự cụm muón lấy)
+-+-+-+Híc+-+-+-+
 

File đính kèm

  • LayCumSo.xls
    26 KB · Đọc: 28
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ả
Bạn đừng nhìn thành phần của hàm Match mà phải nhìn cái đối số của hàm MID(...) kìa, so sánh nó với cú pháp của hàm MID(....) đơn giản mà bạn đã từng biết. Trong trường hợp này kết quả mà MID trả về không phải là 1 kết quả mà là một mảng kết quả vì thế mà phải dùng Công thức mảng. Giải thích đến đây chắc bạn đã hiểu vì sao phải bấm tổ hợp phím Ctrl+shift+Enter rồi chứ???
Thanks!
 
Lần chỉnh sửa cuối:
Em cảm ơn chị, sở dĩ em thắc mắc vậy do 1 phần em chưa hiểu hết về mảng, một phần em thấy công thức của chị
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)))))

cũng tương tự như trường hợp trên, nhưng tại sao lại không cần bấm phím Ctrl+Shift+Enter

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!
Cảm ơn chị đã động viên, em mới tập VBA làm sao dám so sánh cùng chị được, em thấy chị kiến thức rất sâu, nhiệt tình chỉ bảo các thành viên mới bước vào nghiên cứu Excel, VBA

Tuy mới học nhưng em thấy rất thích môn này; được mọi người, đặc biệt là thày Ndu đã nhiệt tình giúp đỡ để em có được những kiến thức vô cùng quý giá, em thực sự biết ơn các anh chị, các thày. Thời gian tới cơ quan cử em thi công, ra công trường chắc em phải chấp nhận gián đoạn học GPE một thời gian, tuy vậy em sẽ cố gắng học tập khi có thể.
 
Lần chỉnh sửa cuối:
Em cảm ơn chị, sở dĩ em thắc mắc vậy do 1 phần em chưa hiểu hết về mảng, một phần em thấy công thức của chị
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)))))

cũng tương tự như trường hợp trên, nhưng tại sao lại không cần bấm phím Ctrl+Shift+Enter

Cảm ơn chị đã động viên, em mới tập VBA làm sao dám so sánh cùng chị được, em thấy chị kiến thức rất sâu, nhiệt tình chỉ bảo các thành viên mới bước vào nghiên cứu Excel, VBA

Tuy mới học nhưng em thấy rất thích môn này; được mọi người, đặc biệt là thày Ndu đã nhiệt tình giúp đỡ để em có được những kiến thức vô cùng quý giá, em thực sự biết ơn các anh chị, các thày. Thời gian tới cơ quan cử em thi công, ra công trường chắc em phải chấp nhận gián đoạn học GPE một thời gian, tuy vậy em sẽ cố gắng học tập khi có thể.
Ui, đừng gọi tôi là chị, tổn thọ lắm,hiiiiiiiii. cái này hem tương tự nhé, tìm hiểu về hàm Lookup chắc bạn chưa đọc chỗ này, đọc xong nhìn lại với các đối trong hàm Lookup mà tôi viết ở trên nhé.
b. Dạng Mảng: LOOKUP(lookup_value,array)

- Lookup_value: là giá trị sẽ được tìm kiếm trong mảng Array. Lookup_value có thể là một số, một chuỗi hay một tham chiếu.

- Array: là vùng tìm kiếm, có thể là một vùng nhiều ô hay một mảng. Giá trị chứa trong array có thể là số, chuỗi, giá trị logic..

Lưu ý:

  • Nếu như không tìm thấy Lookup_value trong vùng dò tìm, hàm sẽ lấy giá trị lớn nhất có trong vùng dò tìm (Lookup_vector) mà có giá trị nhỏ hơn hoặc bằng giá trị dò tìm Lookup_vector.
  • Nếu Lookup_value nhỏ hơn giá trị nhỏ nhất trong cột hoặc hàng đầu tiên trong array thì hàm sẽ báo lỗi #NA!.
  • Hàm lookup dạng mảng gần giống với Hàm Hlookup và Vlookup. Điểm khác biệt là hàm Vlookup hay hàm Hlookup tìm kiếm trên dòng (hoặc cột) đầu tiên, còn hàm Lookup thì tim kiếm tùy thuộc vào kích thước của mảng. Nếu mảng (array) có số cột nhiều hơn số dòng thì hàm sẽ tìm trên dòng đầu tiên của mảng, và ngược lại. Nếu mảng có số cột bằng số dòng thì hàm sẽ tìm trên cột đầu tiên của mảng.
  • Hàm lookup luôn trả về giá trị ở cột hoặc dòng cuối cùng trong mảng.
  • Các giá trị ở dòng hoặc cột đầu tiên trong mảng phải được sắp xếp theo thứ tự tăng dần, nếu không kết quả trả về nhiều khi không chính xác.
Trong trường hợp này hàm Lookup hoạt động dạng mảng (bản thân nó là hàm mảng rùi nên k cần Ctrl+Shift+Enter nữa giống khi bạn sử dụng Sumproduct đó)
Còn trong ví dụ trên vì sao Lookup lại trả về giá trị cuối cùng của mảng kết quả do MID mang lại (tôi chỉ dùng 99^99 chứ chưa dùng đến s 9.99999999999999E+307 vì trong trường hợp này k cần thiết) thì có lẽ bạn thừa hiểu vì tôi thấy bạn rất chăm đọc bài của sư phụ ndu mà, he he he!
 
Lần chỉnh sửa cuối:
Ui, đừng gọi tôi là chị, tổn thọ lắm,hiiiiiiiii. cái này hem tương tự nhé, tìm hiểu về hàm Lookup chắc bạn chưa đọc chỗ này, đọc xong nhìn lại với các đối trong hàm Lookup mà tôi viết ở trên nhé.

Nếu được như vậy thì mình tạm xưng hô là bạn cho tiện nhé, tại mình ra trường chưa lâu, với lại xem hồ sơ của hoamattroicoi không có thông tin về ngày tháng năm sinh mà.

Mình có đọc một số bài của bạn, mình thấy bạn có sở trường sử dụng lookup, choose... rất hay, trước tết mình chỉ biết sơ sơ một số hàm đơn giản, mới tiếp cận một số hàm mảng nên chưa hiểu được nhiều.

Đọc bài của bạn mình học được rất nhiều, cảm ơn bạn rất nhiều.
 
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
Trường hợp này bạn dùng công thức này sẽ gọn hơn nè.
Mã:
=LOOKUP(9^99,--LEFT(A1,ROW(1:99)))
 
Trong trường hợp này hàm Lookup hoạt động dạng mảng (bản thân nó là hàm mảng rùi nên k cần Ctrl+Shift+Enter nữa giống khi bạn sử dụng Sumproduct đó)

Mình xin hỏi chút nữa, chỗ này mình vẫn chưa rành lắm

So sánh 2 công thức:

*
PHP:
=LOOKUP(1;-MID(D5;ROW($1:$99);1))
không cần Ctrl+Shift+Enter -->cái này đã giải thích ở trên

* công thức này cũng gần giống công thức trên

PHP:
=-MATCH(1;-MID(D5;ROW($1:$99);1))
tại sao lại cần Ctrl+Shift+Enter

(Nếu vậy nghĩa là Lookup là hàm mảng, còn Match thì không phải là hàm mảng?)

-----------
Thắc mắc: Tuy vậy khi nhìn lại cú pháp của 2 hàm này thì chúng đều là Array mà.
 
Lần chỉnh sửa cuối:
PHP:
=LOOKUP(9^99,--LEFT(A1,ROW(1:99)))

Công thức này hình như chỉ đúng với trường hợp đầu thôi (123aab123bv ---> cho kết quả là 123), trường hợp thứ 2,3 (ví dụ a1232ss12 --> 1232) em thấy báo lỗi #N/A anh ah?
 
Mình vừa đọc Topic http://www.giaiphapexcel.com/forum/showthread.php?51717-Hỏi-về-Ctrl-shift-Enter này của bạn hoamattroicoi thấy bạn hiểu về cái này rất rõ,

Mình cũng đã hình dung phần nào về khái niệm mảng, nhưng vẫn chưa hiểu thấu đáo tại sao người ta gọi Lookup là công thức mảng trong khi đó Match lại không phải

Rất mong nhận được sự giúp đỡ của bạn, xin giải thích thêm để mình hiểu hơn về thắc mắc của mình tại bài số 27 ở trên (cùng trong Topic này).
 
Mình cũng đã hình dung phần nào về khái niệm mảng, nhưng vẫn chưa hiểu thấu đáo tại sao người ta gọi Lookup là công thức mảng trong khi đó Match lại không phải

Rất mong nhận được sự giúp đỡ của bạn, xin giải thích thêm để mình hiểu hơn về thắc mắc của mình tại bài số 27 ở trên (cùng trong Topic này).
Tại vì khi viết hàm LOOKUP, bác Bill đã tính trước cho nó hoạt động trên mảng và không cần phải Ctrl + Shift + Enter (dù đối số của nó có là mảng đi nữa)
Còn các hàm MATCH, MID người ta đã tính trước các đối số của nó phải như vầy... như vầy... giờ nếu ta "chế" ra để các đối số của nó là mảng thì ta buộc phải Ctrl + Shift + Enter (để hàm nhận biết và hoạt động với mảng)
Nói chung bạn có thể để ý điều này:
- Hàm nào trả về 1 kết quả duy nhất thì Enter bình thường (như MATCH, MID, VLOOKUP...)
- Hàm nào trả về nhiều kết quả thì phải Ctrl + Shift + Enter (như TRANSPOSE...)
- Hàm nào mà đối số của nó là 1 cell hoặc 1 giá trị mà ta cố tình biến đối số ấy thành nhiều giá trị (tức 1 mảng) thì phải Ctrl + Shif + Enter, ví dụ với hàm Match(Trị tìm, Bảng tìm, kiêu tìm)
a) Nếu trị tìm là 1 giá trị đơn thì ta Enter bình thường
b) Nếu ta "chế" để trị tìm là 1 mảng (chẳng hạn MATCH(C1:C10, C1:C10,0)...) thì ta phải Ctrl + Shift + Enter
-----------------
Trên đây chỉ là 1 vài ví dụ minh họa cho bạn hiểu thêm, không phải tổng quát cho mọi trường hợp... Dù sao thì nó vẫn liên quan đến giải thuật, cách viết code bên trong "nội tạng" của từng hàm mà bác Bill xây dựng, ta cũng chả biết ông Bill đã làm quái gì bên trong hàm của ổng nên cái gì ổng cho thì xài, ổng quy định thì theo thôi
Ẹc... Ẹc...
 
Em nghĩ rồi, thôi Bác Bill cho thế nào ta xài thế vậy, dùng nhiều có khi tự nhiên lại hiểu ra vấn đề hôm nay thắc mắc thày ah.

Thực ra, em cũng biết mảng nó có hạn chế trong việc xử lý dữ liệu lớn, em cố đi sâu hơn 1 chút về công thức chủ yếu để phần nào chủ động hơn trong công việc, khi nào nên dùng nó khi nào không nên dùng (nhiều khi chỉ biết những hàm đơn giản khó giải quyết được tình huống thực tế mà nó không phức tạp đến mức phải dùng VBA), quan trọng nhất là em có dịp học được một số thuật toán trên diễn đàn để sau này nghiên cứu VBA.

Thời gian vừa rồi em học được ở thày cách sử dụng công cụ có sẵn trong Excel, nó giúp em làm việc rất hiệu quả trong việc làm các Báo cáo như Consolidate, PivotTable,...đặc biệt là cách sử dụng Advanced Filter (cái này quá hay mà trước kia em không nghĩ nó giải quyết được nhiều vấn đề như vậy). Các kiến thức VBA, mảng em học đến giờ vẫn dừng ở mức nghiên cứu, học tập thôi, chứ thú thực em chưa từng dùng để giải quyết công việc thực tế, có chăng là thi thoảng em Test lại theo các cách khác nhau để kiểm tra kết quả thôi ah.

Một lần nữa, em xin cảm ơn thày, các anh chị rất nhiều.
 
Lần chỉnh sửa cuối:
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: a1232ss12 --> 1232
b112bbb256 --> 112

Em đang muốn ôn tập kỹ cái này bằng công thức, phiền mọi người giúp cho em trường hợp này với.
 

Đúng là em mải theo dõi chủ đề này thấy công thức hay quá nên quên mất là sáng cũng có bài hướng dẫn rồi, nhưng liệu có cách giải nào gọn sử dụng công thức trực tiếp ra luôn không hả thày?

----
(vì em thấy bài trước sử dụng Name mà hiện tại em hơi ngại cái này)
 
Đúng là em mải theo dõi chủ đề này thấy công thức hay quá nên quên mất là sáng cũng có bài hướng dẫn rồi, nhưng liệu có cách giải nào gọn sử dụng công thức trực tiếp ra luôn không hả thày?

----
(vì em thấy bài trước sử dụng Name mà hiện tại em hơi ngại cái này)

Thì tôi đã nói rồi mà, tách kiểu đó công thức sẽ rất khủng ---> Khuyên bạn nên nghiên cứu phương pháp VBA cho bài này thì hơn
 
Đúng là em mải theo dõi chủ đề này thấy công thức hay quá nên quên mất là sáng cũng có bài hướng dẫn rồi, nhưng liệu có cách giải nào gọn sử dụng công thức trực tiếp ra luôn không hả thày?

----
(vì em thấy bài trước sử dụng Name mà hiện tại em hơi ngại cái này)
Em nghĩ bài này anh nên nghiên cứu VBA đi, cái gì dễ thì mình làm anh ạ. Em kinh nghiệm rồi, công thức khủng đưa vào file chỉ phát cáu vì ngồi chờ nó update, không thực tế cho lắm.
 
Em nghĩ bài này anh nên nghiên cứu VBA đi, cái gì dễ thì mình làm anh ạ. Em kinh nghiệm rồi, công thức khủng đưa vào file chỉ phát cáu vì ngồi chờ nó update, không thực tế cho lắm.

Cảm ơn hoamattroicoi, bởi trước kia phần lớn mình chỉ sử dụng các hàm cơ bản thôi, nhiều khi đọc các công thức trên diễn đàn cứ cảm thấy kiến thức của mình thực sự thiếu nhiều, nên mình dự kiến sẽ bỏ một khoảng thời gian ngắn để nghiên cứu công thức, sau đó chuyển sang VBA sau.

Hôm qua đọc những bài đầu của Topic, thấy bài của hoamattroicoi, mình thấy thuật toán rất hay

PHP:
=RIGHT(D5,LEN(D5)-LOOKUP(1,-MID(D5,ROW($1:$99),1),ROW($1:$99)))

trong đó, đặc biệt là
PHP:
-LOOKUP(1,-MID(D5,ROW($1:$99),1),ROW($1:$99)
giúp cho việc tìm được vị trí của ký tự số cuối cùng (do tính chất của Lookup kiểu này phải sắp xếp theo thứ tự tăng dần).

Mình chỉ thắc mắc một chút là dùng hàm gì để đánh dấu vị trí của ký tự số đầu tiên?

Nếu có thể xin phiền mọi người giúp cho chút nữa?
 
Lần chỉnh sửa cuối:
dùng hàm gì để đánh dấu vị trí của ký tự số đầu tiên?
Nó ở chỗ này nè:
Mã:
[FONT=Courier New][COLOR=#0000bb]MIN[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]FIND[/COLOR][COLOR=#007700]({[/COLOR][COLOR=#0000bb]0[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]1[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]2[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]3[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]4[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]5[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]6[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]7[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]8[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]9[/COLOR][COLOR=#007700]},[/COLOR][COLOR=#0000bb]A1[/COLOR][COLOR=#007700]&[/COLOR][COLOR=#dd0000]"0123456789"[/COLOR][COLOR=#007700])[/COLOR][/FONT]
(trích dẫn từ công thức ở bài #17 topic này)
 
Web KT
Back
Top Bottom