Làm cách nào để có được VLOOKUP để trả lại trận đấu * cuối *?


11

Tôi đã từng làm việc với VLOOKUP nhưng lần này tôi gặp một thử thách. Tôi không muốn giá trị khớp đầu tiên, nhưng cuối cùng. Làm sao? (Tôi đang làm việc với LibreOffice Calc nhưng một giải pháp MS Excel phải hữu ích như nhau.)

Lý do là tôi có hai cột văn bản với hàng ngàn hàng, giả sử một là danh sách những người được trả tiền giao dịch (Amazon, Ebay, chủ nhân, cửa hàng tạp hóa, v.v.) và cái kia là danh sách các danh mục chi tiêu (tiền lương, thuế, hộ gia đình, tiền thuê, vv). Một số giao dịch không có cùng loại chi tiêu mỗi lần và tôi muốn lấy loại được sử dụng gần đây nhất. Lưu ý rằng danh sách được sắp xếp theo không cột (thực tế theo ngày) và tôi không muốn thay đổi thứ tự sắp xếp.

Những gì tôi có (không bao gồm xử lý lỗi) là công thức "khớp đầu tiên" thông thường:

=VLOOKUP( 
[payee field] , [payee+category range] , [index of category column] , 
0 )

Tôi đã thấy các giải pháp như thế này, nhưng tôi gặp #DIV/0!lỗi:

=LOOKUP(2 , 1/( [payee range] = [search value] ) , [category range] )

Giải pháp có thể là bất kỳ công thức nào, không nhất thiết phải là VLOOKUP. Tôi cũng có thể trao đổi các cột thanh toán / danh mục xung quanh. Chỉ cần không thay đổi trong cột sắp xếp, xin vui lòng.


Điểm thưởng cho một giải pháp chọn giá trị thường xuyên nhất thay vì cuối cùng!

Câu trả lời:


3

Bạn có thể sử dụng một công thức mảng để lấy dữ liệu từ bản ghi khớp cuối cùng.

=INDEX(IF($A$1:$A$20="c",$B$1:$B$20),MAX(IF($A$1:$A$20="c",ROW($A$1:$A$20))))

Nhập công thức bằng Ctrl+ Shift+ Enter.

Điều này hoạt động như INDEX/ MATCHxây dựng của một VLOOKUP, nhưng với một điều kiện MAXđược sử dụng thay vì MATCH.

Lưu ý rằng điều này giả định rằng bảng của bạn bắt đầu ở hàng 1. Nếu dữ liệu của bạn bắt đầu ở một hàng khác, bạn sẽ cần điều chỉnh ROW(...)phần bằng cách trừ đi sự khác biệt giữa hàng trên cùng và 1.


Tôi bối rối về chữ "c" theo nghĩa đen đó - Tôi nghĩ rằng đánh giá luôn sai, vậy nó thực sự làm gì?
Torben Gundtofte-Bruun 11/07/14

Tôi đã kiểm tra đề xuất của bạn (và kiểm tra xem nó có được chấp nhận như một công thức mảng không). Tôi giả sử Col A là người được trả tiền và B là loại, phải không? Thật không may, LibreScript trả về "ERR: 502", dịch thành "Đối số không hợp lệ: Đối số hàm không hợp lệ. Ví dụ: số âm cho hàm SQRT (), vì vậy, vui lòng sử dụng IMSQRT ()". Tôi đã kiểm tra rằng tất cả các hàm tồn tại với tên đó trong LibreOffice, nhưng tôi tự hỏi liệu LibreOffice IFkhông thể xử lý các mảng.
Torben Gundtofte-Bruun 11/07/14

Xin lỗi, chữ "c" theo nghĩa đen chỉ là tên người nhận thanh toán bạn muốn khớp. Đó là một di tích từ dữ liệu mẫu của tôi mà tôi đang chơi. Tôi giả sử rằng nó sẽ được thay thế bằng một tham chiếu ô trong trang tính của bạn.
Xuất sắc

@ TorbenGundtofte-Bruun Care để chia sẻ công thức bạn đang sử dụng? Tôi có thể khắc phục sự cố nếu tôi có thể nhìn thấy nó. Ngoài ra, bạn luôn có thể thử chuyển qua công thức Evaluate Formulađể xem phần nào của công thức đang tạo ra lỗi. Tính năng này tồn tại trong Excel và tôi rất ngạc nhiên nếu LibreOffice Calc không có tính năng tương tự.
Xuất sắc

Công thức ban đầu của tôi rất đơn giản, đó là lý do tại sao nó không đầy đủ :-) =VLOOKUP(J1061;$J$2:$K$9999;2;0)trong đó col J chứa các khoản thanh toán và col K các danh mục. Nó trả về trận đấu đầu tiên như mong đợi.
Torben Gundtofte-Bruun

2

(Trả lời ở đây vì không có câu hỏi riêng cho dữ liệu được sắp xếp.)

Nếu dữ liệu đã được sắp xếp, bạn có thể sử dụng VLOOKUPvới range_lookupđối số TRUE(hoặc được bỏ qua, vì đó là mặc định), được mô tả chính thức cho Excel là "tìm kiếm kết quả gần đúng".

Nói cách khác, đối với dữ liệu được sắp xếp:

  • thiết lập đối số cuối cùng để FALSEtrả về giá trị đầu tiên
  • thiết lập đối số cuối cùng để TRUEtrả về giá trị cuối cùng .

Điều này phần lớn không có giấy tờ và tối nghĩa, nhưng có từ VisiCalc (1979) và ngày nay có ít nhất là trong Microsoft Excel, LibreOffice Calc và Google Sheets. Cuối cùng là do việc triển khai ban đầu LOOKUPtrong VisiCalc (và từ đó VLOOKUPHLOOKUP), khi không có tham số thứ tư. Giá trị được tìm thấy bằng tìm kiếm nhị phân , sử dụng ràng buộc bên trái và ràng buộc phải độc quyền (một triển khai phổ biến và thanh lịch), dẫn đến hành vi này.

Về mặt kỹ thuật, điều này có nghĩa là người ta bắt đầu tìm kiếm với khoảng thời gian ứng cử viên [0, n), trong đó nđộ dài của mảng và điều kiện bất biến vòng lặp là A[imin] <= key && key < A[imax](giới hạn bên trái là <= mục tiêu, giới hạn bên phải, bắt đầu một sau khi kết thúc, là > mục tiêu; để xác thực, kiểm tra các giá trị tại các điểm cuối trước hoặc kiểm tra kết quả sau) và liên tiếp chia đôi và chọn bất kỳ bên nào bảo tồn bất biến này: bằng cách loại trừ một bên sẽ, cho đến khi bạn đạt được một khoảng thời gian với 1 điều khoản [k, k+1)và thuật toán sau đó trả về k. Đây không phải là một trận đấu chính xác (!): Đây chỉ là trận đấu gần nhất từ ​​bên dưới. Trong trường hợp trùng khớp, kết quả này sẽ trả về kết quả khớp cuối cùng , vì nó yêu cầu giá trị tiếp theo phải lớn hơnhơn khóa (hoặc cuối mảng). Trong trường hợp trùng lặp, bạn cần một số hành vi, và điều này là hợp lý và dễ thực hiện.

Hành vi này được nêu rõ ràng trong bài viết Cơ sở tri thức Microsoft cũ này (nhấn mạnh thêm): "XL: Cách trả lại kết quả đầu tiên hoặc cuối cùng trong một mảng" ( Q214069 ):

Bạn có thể sử dụng hàm LOOKUP () để tìm kiếm một giá trị trong một mảng dữ liệu được sắp xếp và trả về giá trị tương ứng có trong vị trí đó trong một mảng khác. Nếu giá trị tra cứu được lặp lại trong mảng, nó sẽ trả về kết quả khớp cuối cùng gặp phải . Hành vi này đúng với các hàm VLOOKUP (), HLOOKUP () và LOOKUP ().

Tài liệu chính thức cho một số bảng tính theo sau; không phải là hành vi "trận đấu cuối cùng" được nêu, nhưng nó được ngụ ý trong tài liệu Google Sheets:

  • Microsoft Excel

    TRUE giả định cột đầu tiên trong bảng được sắp xếp theo số hoặc bảng chữ cái và sau đó sẽ tìm kiếm giá trị gần nhất .

  • Google Sheets :

    Nếu is_sortedđược TRUEhoặc bỏ qua, kết quả khớp gần nhất ( nhỏ hơn hoặc bằng khóa tìm kiếm) được trả về


Điều phù hợp gần nhất đã khiến tôi phát điên!
dukedave

1

Nếu các giá trị trong mảng tìm kiếm là tuần tự (nghĩa là bạn đang tìm giá trị lớn nhất, chẳng hạn như ngày mới nhất), bạn thậm chí không cần sử dụng hàm INDIRECT. Hãy thử mã đơn giản này:

=MAX(IF($A$1:$A$20="c",$B$1:$B$20,)

Một lần nữa, nhập công thức bằng CTRL + SHIFT + ENTER


0

Tôi đã có một đi ở giá trị thường xuyên nhất. Không chắc chắn nếu nó hoạt động trong libreOffice, nhưng nó dường như hoạt động trong excel

= INDEX ($ B $ 2: $ B $ 9, MATCH (MAX (- ($ A $ 2: $ A $ 9 = D2) * COUNTIFS ($ B $ 2: $ B $ 9, $ B $ 2: $ B $ 9, $ A $ 2 : $ A $ 9, D2)), - ($ A $ 2: $ A $ 9 = D2) * COUNTIFS ($ B $ 2: $ B $ 9, $ B $ 2: $ B $ 9, $ A $ 2: $ A $ 9, D2 ), 0))

Cột A sẽ là người được trả tiền, cột B sẽ là danh mục, D2 là người được trả tiền mà bạn muốn lọc theo. Tôi không chắc tại sao nó lại thêm các ngắt dòng trong chức năng trên.

Hàm của tôi để tìm ô cuối cùng sẽ như sau:

= INDIRECT ("B" & MAX (- ($ A $ 2: $ A $ 9 = D2) * ROW ($ A $ 2: $ A $ 9)))

Gián tiếp cho phép tôi chỉ định cột tôi muốn trả về và tìm hàng trực tiếp (vì vậy tôi không cần phải trừ số lượng hàng tiêu đề.

Cả hai chức năng này cần được nhập bằng Ctrl + shift + enter


0
=LOOKUP([payee field] , [payee range] , [category range])

Điều này sẽ giúp bạn có được giá trị cuối cùng

Tôi có nhận được điểm thưởng khi trễ 3 năm không?


-1

Bạn gặp #DIV/0!lỗi vì bạn nên viết công thức của bạn như sau:

=LOOKUP(2;IF(([payee range] = [search value]);1;"");[category range])

Điều này sẽ làm việc và sẽ tìm thấy trận đấu cuối cùng.

([payee range] = [search value]) : ma trận boolean TRUE / FALSE

IF(([payee range] = [search value]);1;"") : ma trận giả-boolean 1 / ""

=LOOKUP(2; {pseudo-boolean matrix 1/""} );[category range]): luôn luôn quay trở lại 1vị trí cuối cùng


LOOKUPchỉ hoạt động trên danh sách được sắp xếp, đầu ra của comarison của bạn sẽ dẫn đến một danh sách 1s và khoảng trắng theo cách không được sắp xếp, vì vậy nó sẽ không cho kết quả chính xác.
Máté Juhász
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.