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
dùng công thức mảng nàyxin 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.
=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))
tạm giai thích n hư saugử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
Ngắn hơn 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.
=RIGHT(D5,LEN(D5)-MATCH(1,-MID(D5,ROW($1:$99),1)))
=RIGHT(D5,LEN(D5)-LOOKUP(1,-MID(D5,ROW($1:$99),1),ROW($1:$99)))
Giả sử bạn có chuỗi SDFG658SR tại ô A1.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
Vầy còn ngắn hơn:Ngắn hơn nè :
Nếu kết thúc bằng Ctrl+Shift+EnterPHP:=RIGHT(D5,LEN(D5)-MATCH(1,-MID(D5,ROW($1:$99),1)))
Hoặc :
Kết thúc với Enter nhé!PHP:=RIGHT(D5,LEN(D5)-LOOKUP(1,-MID(D5,ROW($1:$99),1),ROW($1:$99)))
=REPLACE(D5,1,MATCH(1,-MID(D5,ROW($1:$99),1)),"")
Cảm ơn sư phụ, bao giờ sư phụ cũng là người đưa ra giải pháp ngắn nhất, he he!Vầy còn ngắn hơn:
Ẹc... Ẹc...PHP:=REPLACE(D5,1,MATCH(1,-MID(D5,ROW($1:$99),1)),"")
DL=Sheet1!$D5
DK=IF(ISNUMBER(1*MID(DL;ROW(INDIRECT("1:"&LEN(DL)));1));ROW(INDIRECT("1:"&LEN(DL)));"")
=MID(DL;MAX(DK)+1;LEN(DL))
đú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 ẹcVầy còn ngắn hơn:Ẹc... Ẹc...PHP:=REPLACE(D5,1,MATCH(1,-MID(D5,ROW($1:$99),1)),"")
-MID(D5,ROW($1:$99),1)
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.
Dữ liệu cần tách tại A1 :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
=LOOKUP(99^99,--MID(A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A1&"0123456789")),ROW(INDIRECT("1:"&LEN(A1)))))
=REPLACE(D5,1,MATCH(1,-MID(D5,ROW($1:$99),1)),"")
MID(D5,MATCH(1,-MID(D5,ROW(INDIRECT("1:"&LEN(D5))),1))+1,LEN(D5))
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.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.
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
Hihi, bài này viết code thì đơn giản thôi Còi nhỉ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 :
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!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
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
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ứ???Em thắc mắc thành phần MATCH(1,-MID(D5,ROW($1:$99),1)) nó là 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ả
=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ả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, VBAVBA 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!
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é.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ể.
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 đó)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.
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é.
Trường hợp này bạn dùng công thức này sẽ gọn hơn nè.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
=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 đó)
=LOOKUP(1;-MID(D5;ROW($1:$99);1))
=-MATCH(1;-MID(D5;ROW($1:$99);1))
=LOOKUP(9^99,--LEFT(A1,ROW(1:99)))
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)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).
Vầy còn ngắn hơn:
Ẹc... Ẹc...PHP:=REPLACE(D5,1,MATCH(1,-MID(D5,ROW($1:$99),1)),"")
Sao em thử vào file nó lại báo Value 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: 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.
Bạn mới hỏi tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?75486-Xin-ch%E1%BB%89-d%C3%B9m-Excel-t%C3%A1ch-s%E1%BB%91-ra-kh%E1%BB%8Fi-chu%E1%BB%91i-d%C3%B9ng-h%C3%A0m-g%C3%AC
Và tôi thấy trả lời bằng công thức ở bài 12 là đúng rồi còn gì
Đú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.Đú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.
=RIGHT(D5,LEN(D5)-LOOKUP(1,-MID(D5,ROW($1:$99),1),ROW($1:$99)))
-LOOKUP(1,-MID(D5,ROW($1:$99),1),ROW($1:$99)
Nó ở chỗ này nè:dùng hàm gì để đánh dấu vị trí của ký tự số đầu tiên?
[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]