Tách ký tự trong chuỗi (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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

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

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

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:
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

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)
 

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

Back
Top Bottom