Trích xuất giá trị trong trường hợp có sự xuất hiện "cụm từ tìm kiếm " nhiều lần

Liên hệ QC

phamvandunghp84

Thành viên thường trực
Tham gia
5/3/20
Bài viết
241
Được thích
12
Mình dùng hàm INDEX(A:A;MATCH... để trích lấy giá trị theo từ khóa trong cột nếu chỉ có một lần xuất hiện của từ khóa thì ok, nhưng trong trường hợp trong cột xuất hiện nhiều từ khóa thì mình không biết phải làm thế nào. Mình muốn lấy giá trị xuất hiện sau từ khóa thứ 2, Nhờ các bạn giúp mình viết công thức để lấy được giá trị thứ 2. Cảm ơn các bạn !
Trong file này mình muốn lấy được số 12, liên quan tới cụm từ cần tìm kiếm là gt4. nếu chỉ có gt4 xuất hiện 1 lần thì mình tìm bằng công thức INDEX(A:A;MATCH được, nhưng đôi khi gt4 lại xuất hiện 2 lần thì phải làm như thế nào?
 

File đính kèm

  • tìm giá trị thứ 2.xlsx
    10.5 KB · Đọc: 11
Mình dùng hàm INDEX(A:A;MATCH... để trích lấy giá trị theo từ khóa trong cột nếu chỉ có một lần xuất hiện của từ khóa thì ok, nhưng trong trường hợp trong cột xuất hiện nhiều từ khóa thì mình không biết phải làm thế nào. Mình muốn lấy giá trị xuất hiện sau từ khóa thứ 2, Nhờ các bạn giúp mình viết công thức để lấy được giá trị thứ 2. Cảm ơn các bạn !
Trong file này mình muốn lấy được số 12, liên quan tới cụm từ cần tìm kiếm là gt4. nếu chỉ có gt4 xuất hiện 1 lần thì mình tìm bằng công thức INDEX(A:A;MATCH được, nhưng đôi khi gt4 lại xuất hiện 2 lần thì phải làm như thế nào?
+ Phải xác định:
- Trong cột A có chứa từ khóa và giá trị muốn lấy
- Từ khóa luôn là Text, Giá trị luôn là Number?
- Trong cột có thể có những cells rỗng?
+ Đưa file giống thật thì nhanh có đáp án thật.
 
Upvote 0
Chắc bạn nên thử hàm này:
PHP:
Function TimGT(Rng As Range, TriTim As String, TT As Integer)
Dim sRng As Range, Cls As Range
Dim W As Integer

Set sRng = Rng.Find(TriTim, , xlFormulas, xlWhole)
If sRng Is Nothing Then
    TimGT = "Nothing"
Else
    MsgBox "Yes"
    For Each Cls In sRng.Resize(Rng.Rows.Count)
        If Cls.Value = TriTim Then W = W + 1
        If IsNumeric(Cls.Value) And Cls.Value > 0 And W = TT Then
            TimGT = Cls.Value:          Exit Function
        End If
    Next Cls
End If
End Function

Cú pháp sẽ phải là =TimGT(A3:A19, E2, E4)
Chúc bạn vui & thành công!
 
Lần chỉnh sửa cuối:
Upvote 0
Chắc bạn nên thử hàm này:
PHP:
Function TimGT(Rng As Range, TriTim As String, TT As Integer)
Dim sRng As Range, Cls As Range
Dim W As Integer

Set sRng = Rng.Find(TriTim, , xlFormulas, xlWhole)
If sRng Is Nothing Then
    TimGT = "Nothing"
Else
    MsgBox "Yes"
    For Each Cls In sRng.Resize(Rng.Rows.Count)
        If Cls.Value = TriTim Then W = W + 1
        If IsNumeric(Cls.Value) And Cls.Value > 0 And W = TT Then
            TimGT = Cls.Value:          Exit Function
        End If
    Next Cls
End If
End Function

Cú pháp sẽ phải là =TimGT(A3:A19, E2, E4)
Chúc bạn vui & thành công!
Anh SA_DQ cho e tham gia chút nhé. Tại sao trong câu lệnh For Each Cls In sRng.Resize(Rng.Rows.Count) thì Cls lại bắt đầu từ giá trị gt4 (giá trị của ô A5) mà không phải là gt2(giá trị của ô A3). Em cám ơn trước nha.
 
Upvote 0
Chắc bạn nên thử hàm này:
PHP:
Function TimGT(Rng As Range, TriTim As String, TT As Integer)
Dim sRng As Range, Cls As Range
Dim W As Integer

Set sRng = Rng.Find(TriTim, , xlFormulas, xlWhole)
If sRng Is Nothing Then
    TimGT = "Nothing"
Else
    MsgBox "Yes"
    For Each Cls In sRng.Resize(Rng.Rows.Count)
        If Cls.Value = TriTim Then W = W + 1
        If IsNumeric(Cls.Value) And Cls.Value > 0 And W = TT Then
            TimGT = Cls.Value:          Exit Function
        End If
    Next Cls
End If
End Function

Cú pháp sẽ phải là =TimGT(A3:A19, E2, E4)
Chúc bạn vui & thành công!
Bạn ơi cho mình hỏi có cách nào không cần dùng tới VBA không bạn? ví dụ như có thể dùng sẵn công thức nào đó của Excel, như INDEX, MATCH, hay Vlook nào đó?
 
Upvote 0
Upvote 0
Bạn ơi cho mình hỏi có cách nào không cần dùng tới VBA không bạn? ví dụ như có thể dùng sẵn công thức nào đó của Excel, như INDEX, MATCH, hay Vlook nào đó?
Bạn thử đưa một phần dữ liệu thực xem sao, biết đâu có thành viên nào đó giúp được bạn.
 
Upvote 0
Bạn thử đưa một phần dữ liệu thực xem sao, biết đâu có thành viên nào đó giúp được bạn.
Mình gửi bạn file đính kèm bạn xem giúp nhé.
mình mô tả cụ thể lại như sau;

một cột dữ liệu ngẫu nhiên. chỉ có 2 yếu tố để nhận biết:
thứ nhất là từ khóa liên quan là cụm ký tự "gt4", từ khóa gt4 này luôn xuất hiện ở lần thứ 2.
thứ hai là khoảng cách từ hàng "gt4" này tới giá trị cần lấy luôn luôn là 5 hàng.
Bài đã được tự động gộp:

Chắc bạn nên thử hàm này:
PHP:
Function TimGT(Rng As Range, TriTim As String, TT As Integer)
Dim sRng As Range, Cls As Range
Dim W As Integer

Set sRng = Rng.Find(TriTim, , xlFormulas, xlWhole)
If sRng Is Nothing Then
    TimGT = "Nothing"
Else
    MsgBox "Yes"
    For Each Cls In sRng.Resize(Rng.Rows.Count)
        If Cls.Value = TriTim Then W = W + 1
        If IsNumeric(Cls.Value) And Cls.Value > 0 And W = TT Then
            TimGT = Cls.Value:          Exit Function
        End If
    Next Cls
End If
End Function

Cú pháp sẽ phải là =TimGT(A3:A19, E2, E4)
Chúc bạn vui & thành công!
Bạn ơi cho mình hỏi ngoài điều kiện Cls.Value > 0, mình muốn bổ xung thêm điều kiện là khoảng cách tính từ hàng chứa cụm từ khóa liên quan "gt4" này tới chỗ cần lấy giá trị là 5 hàng. thì phải viết lại hàm của bạn như nào? Cảm ơn bạn !
 

File đính kèm

  • tìm giá trị thứ 2.xlsm
    16.9 KB · Đọc: 3
  • tìm giá trị thứ 2.xlsm
    16.9 KB · Đọc: 3
Upvote 0
Anh SA_DQ cho e tham gia chút nhé. Tại sao trong câu lệnh For Each Cls In sRng.Resize(Rng.Rows.Count) thì Cls lại bắt đầu từ giá trị gt4 (giá trị của ô A5) mà không phải là gt2(giá trị của ô A3). Em cám ơn trước nha.
Vấn đề là nếu không xài phương thức FIND() thì phải xài vòng lặp; & như vậy sẽ lâu hơn cho dù có phát hiện hay phát hiện cụm từ cần tìm
Cụm từ cần tìm nhất là nằm gần cuối cột dữ liệu cần tìm thì FIND() nhanh hơn so với vòng lặp.
Như vậy FIND() là con dao bén hơn vòng lặp; Nhưng chớ vận dụng FINDNEXT() trong hàm (Function), vì sẽ bị đứt tay ngay đó!
$$$$@
Bạn ơi cho mình hỏi ngoài điều kiện Cls.Value > 0, mình muốn bổ xung thêm điều kiện là khoảng cách tính từ hàng chứa cụm từ khóa liên quan "gt4" này tới chỗ cần lấy giá trị là 5 hàng. thì phải viết lại hàm của bạn như nào?
Cũng không nhất thiết phải quan tâm đến 5 dòng/hàng này vì nhanh hơn chút nhưng đầy nguy cơ sẽ là nhanh nhẩu đoản!

Như trong file của bạn ở #1 bạn đã đề cặp: Có thể không phải lúc nào cũng tìm đến khi gặp chuỗi cần tìm lần thứ 2; Có thể lần thứ nhất hay lần 3, 4,. . . khác nữa thì sao? & lúc đó dòng số liệu cần lấy có luôn là phía dưới cách 5 dòng hay không?

Bạn ơi cho mình hỏi có cách nào không cần dùng tới VBA không bạn? ví dụ như có thể dùng sẵn công thức nào đó của Excel, như INDEX, MATCH, hay Vlook nào đó?
Muốn vậy, bài của bạn chưa đúng trong ngăn theo qui định; Đó phải là "Khu vực đăng bài chung": https://www.giaiphapexcel.com/diendan/forums/những-vấn-đề-chung.3/
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn ơi cho mình hỏi có cách nào không cần dùng tới VBA không bạn? ví dụ như có thể dùng sẵn công thức nào đó của Excel, như INDEX, MATCH, hay Vlook nào đó?
Thử:
Mã:
E3=OFFSET(A1,LOOKUP(2,1/(E2=A3:A1000),ROW(A3:A1000))+E4-1,)
E4=MATCH("*",INDEX(1/OFFSET(A1:A1000,LOOKUP(2,1/(E2=A3:A1000),ROW(A3:A1000)),)&"",),)
Enter.

Thân
 

File đính kèm

  • tìm giá trị thứ 2.xlsx
    13.7 KB · Đọc: 11
Lần chỉnh sửa cuối:
Upvote 0
Thử:
Mã:
E3=OFFSET(A1,LOOKUP(2,1/(E2=A3:A1000),ROW(A3:A1000))+E4-1,)
E4=MATCH("*",INDEX(1/OFFSET(A1:A1000,LOOKUP(2,1/(E2=A3:A1000),ROW(A3:A1000)),)&"",),)
Enter.

Thân

Bạn ơi mình dùng excel 2007 hình như có gì đó k hỗ trợ? Bạn có thể viết lại công thức trên theo excel 2007 thì viết như nào bạn giúp mình nhé!
_xlfn.AGGREGATE
 
Upvote 0
Web KT

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

Back
Top Bottom