Lớp học GPE tháng 10 - TPHCM: Conditional Formatting và Data Validation (tối 4, 6/10) | Excel cơ bản (tối 9, 11, 13/10) |
Thuần thục các hàm dò tìm (tối 10, 12/10) | Tất tần tật về PivotTable (tối 16, 18, 20/10) |
Tất tần tật về Filter và Advanced Filter (tối 23, 25/10) | Name động và biểu đồ (tối 24, 26, 28/10)

Đăng ký học Khởi đầu cùng Google Spreadsheet - 2 chủ nhật 1 và 8/10 - TPHCM

Đăng ký học Xây dựng ứng dụng Form bằng VBA - 2 chủ nhật 15 và 22/10 - TPHCM

VLOOKUP nâng cao (hàm tự tạo)

Thảo luận trong 'Lập Trình với Excel' bắt đầu bởi AndOrNot, 24 Tháng tư 2013.

  1. AndOrNot

    AndOrNot Thành viên chính thức

    Chào các bác!

    Em có 1 file muốn xây dựng 1 hàm tự tạo tương tự như VLOOKUP (sẵn có trong Excel), đặc điểm của hàm tự tạo này sẽ nâng cao hơn áp dụng cho việc tìm kiếm ngược về cột bên trái.

    Chi tiết em gửi trong file đính kèm.

    Các bác bớt chút thời gian xem qua và giúp đỡ!
     

    Các file đính kèm:

  2. nghiaphuc

    nghiaphuc Hoàng Nghĩa Phúc Staff Member

    Bạn tham khảo topic này xem có đúng ý bạn không: Dò tìm nâng cao với hàm VlookupD
     
  3. quanghai1969

    quanghai1969 Thành viên gạo cội

    hàm excel có sẵn rồi viết code làm chi
    =INDEX($B$5:$B$10,MATCH(H14,$C$5:$C$10,0),0)
    Nếu code thì đại loại thế này, bạn nghiên cứu thử nha
    PHP:
    Function vlookupLeft(dk As Stringvung As Rangecot As Long)
    Dim tim
    Set tim 
    vung.Find(dk, , , 1)
    If 
    Not vung Is Nothing Then
       vlookupLeft 
    tim.Offset(, -cot)
    End If
    End Function
    cú pháp thế này
    =vlookupLeft(H14,C5:C10,1)
     
    Lần chỉnh sửa cuối: 24 Tháng tư 2013
  4. nghiaphuc

    nghiaphuc Hoàng Nghĩa Phúc Staff Member

    Thêm một tham khảo cho bạn:
    [GPECODE=vb]Function MVlookup(LVal As Variant, Rng As Range, Col1 As Long, Col2 As Long) As Variant
    Dim Rng1 As Range, Tem As Range
    Set Rng1 = Rng.Offset(, Col1 - 1).Resize(, 1)
    Set Tem = Rng1.Find(LVal, LookIn:=xlValues, lookat:=xlWhole)
    If Tem Is Nothing Then
    MVlookup = "#N/A"
    Else
    MVlookup = Tem.Offset(, Col2 - Col1)
    End If
    End Function[/GPECODE]
    Cú pháp: MVlookup(Trị dò, Vùng, Cột tìm kiếm, Cột chứa kết quả)

    Bạn tham khảo trong file nhé.
     

    Các file đính kèm:

  5. ndu96081631

    ndu96081631 Ăn cùng GPE, Ở cùng GPE, Sống cùng GPE Staff Member Super Moderator

    Đừng nói là dò ngược, thậm chí dò theo nhiều điều kiện cũng mần tuốt. Đó là LOOKUP
    Công thức tại I14:
    Mã:
    =LOOKUP(2,1/($C$5:$C$10=$H14),$E$5:$E$10)
    Công thức tại J14:
    Mã:
    =LOOKUP(2,1/($C$5:$C$10=$H14),$B$5:$B$10)
    Khỏi cần hàm tự tạo, một hàm LOOKUP duy nhất
    --------------
    Còn việc "chế" ra hàm gần giống như VLOOKUP thì thôi... hãy quên đi. Làm được giống như nó cũng là chuyện không thể nào chứ đừng nói là NÂNG CAO:
    - VLOOKUP có khả năng hoạt động trên Range lẩn Array
    - VLOOKUP có khả năng dò tìm chính xác và dò tương đối (ta muốn vậy cũng hơi mệt)
    - VLOOKUP có khả năng dò tìm từ nguồn của file khác (cái này ta muốn cũng e rằng không được)
    vân vân...
     
    Lần chỉnh sửa cuối: 25 Tháng tư 2013
  6. AndOrNot

    AndOrNot Thành viên chính thức

    Cảm ơn bác! Đúng ý của em rồi
     
  7. ChanhTQ@

    ChanhTQ@ Thành viên già cỗi.

    Hàm LOOKUP() chưa thể trả về hơn 1 giá trị!

    Hay tác giả topic đi theo hướng này có nghĩa hơn.

    Trên diễn đàn cũng đã có chứ không fải không!

    Nhưng bạn thử viết trước khi tìm xem sao?

    Chúc thành công!
     
  8. AndOrNot

    AndOrNot Thành viên chính thức

    Cảm ơn thầy, bây giờ em mới biết cái hàm này có sẵn trong Excel.
     
  9. ndu96081631

    ndu96081631 Ăn cùng GPE, Ở cùng GPE, Sống cùng GPE Staff Member Super Moderator

    Có khi nào bạn có nhu cầu tìm kết quả ở CỘT 1, theo điều kiện CỘT 3 > 10 và <20 không ta?
    Hoặc giả dò tìm kết quả ở CỘT 1, theo điều kiện CỘT 4 có ký tự đầu là "T"CỘT 3 > 100
    Đây là những nhu cầu dò tìm rất bình thường
    khi ấy code sẽ viết thế nào để bảo đảm tính TỔNG QUÁT của nhu cầu (mà ta chưa lường trước)?
    Ẹc... Ẹc...
    --------------
    Góp ý với bạn: Không phải cái gì dùng VBA cũng ngon lành cả đâu (vì nếu thế thì bác Bill tốn công xây dựng hàm Excel để làm gì)
    Cái gì có thể giải quyết bằng công thức ở mức đơn giản thì cứ xài... VBA chỉ nên dùng trong trường hợp ta chắc chắn rẳng không còn cách nào khác và nó là giải pháp tốt nhất
    --------------------------
    LOOKUP là hàm mảng mà sư phụ. Sao lại không thể trả về hơn 1 giá trị chứ
     
    Lần chỉnh sửa cuối: 25 Tháng tư 2013
  10. hungpecc1

    hungpecc1 .Add 1/heart, "GPE"

    Theo em dùng hàm tự tạo trên worksheet thì nên sửa câu lệnh :
    PHP:
    MVlookup "#N/A"
    Thành
    PHP:
    MVlookup CVErr(xlErrNA)
     
  11. nghiaphuc

    nghiaphuc Hoàng Nghĩa Phúc Staff Member

    Cảm ơn bạn, thực ra thì hôm qua tôi đã tìm rồi nhưng không biết cái #N/A ấy trong VBA nó là cái gì, trên Excel thì nó là hàm NA, còn trong VBA thì không tìm ra, tôi cũng đã thử tìm nó trong một đám WorksheetFunction rồi nhưng không thấy nên đành chịu.
    Cảm ơn bạn!
     
    Lần chỉnh sửa cuối: 25 Tháng tư 2013

Chia sẻ trang này