VLOOKUP이 * last * 일치를 반환하도록하는 방법은 무엇입니까?


12

VLOOKUP을 사용하는 데 익숙하지만 이번에는 어려움이 있습니다. 첫 번째 일치 값은 원하지 않지만 마지막 값은 원하지 않습니다 . 어떻게? (저는 LibreOffice Calc로 작업하고 있지만 MS Excel 솔루션도 똑같이 유용합니다.)

그 이유는 수천 개의 행이있는 두 개의 텍스트 열이 있기 때문입니다. 하나는 거래 수취인 (Amazon, Ebay, 고용주, ​​식료품 점 등)의 목록이고 다른 하나는 지출 범주 (임금, 세금, 가구, 임대료 등). 일부 거래는 매번 동일한 지출 범주를 가지지 않으며 가장 최근에 사용한 거래를 원합니다. 목록은 열 (실제 날짜별로)별로 정렬되지 않으며 정렬 순서를 변경하고 싶지 않습니다.

내가 가지고있는 것 (오류 처리 제외)은 일반적인 "첫 번째 일치"공식입니다.

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

이와 같은 솔루션을 보았지만 #DIV/0!오류가 발생합니다.

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

솔루션은 VLOOKUP 일 필요는없는 수식 일 수 있습니다. 수취인 / 카테고리 열을 바꿀 수도 있습니다. 정렬 열을 변경하지 마십시오.


마지막이 아닌 가장 빈번한 가치 를 선택하는 솔루션에 대한 보너스 포인트 !

답변:


3

배열 수식을 사용하여 마지막 일치 레코드에서 데이터를 가져올 수 있습니다.

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

Ctrl+ Shift+를 사용하여 공식을 입력하십시오 Enter.

이것은 INDEX/의 MATCH구조 처럼 작동 VLOOKUP하지만 MAX대신 조건을 사용합니다 MATCH.

이는 테이블이 행 1에서 시작한다고 가정합니다. 데이터가 다른 행에서 시작하는 ROW(...)경우 맨 위 행과 1 사이의 차이를 빼서 부분 을 조정해야합니다 .


나는 그 문자 "c"에 대해 혼란스러워한다. 나는 평가가 항상 거짓이라고 생각할 것이다. 그래서 실제로 무엇을 하는가?
Torben Gundtofte-Bruun

귀하의 제안을 테스트했으며 배열 수식으로 수락되었는지 확인했습니다. Col A가 수취인이고 B가 범주라고 가정합니다. 불행히도, LibreOffice는 "잘못된 인수 : 함수 인수가 유효하지 않습니다. 예를 들어, SQRT () 함수의 음수는 IMSQRT ()를 사용하십시오"로 번역되는 "ERR : 502"를 반환합니다. LibreOffice에 해당 이름의 모든 함수가 있는지 확인했지만 LibreOffice의 IF배열을 처리 할 수 없는지 궁금합니다 .
Torben Gundtofte-Bruun

죄송합니다. 문자 "c"는 일치시키고 자하는 수취인 이름입니다. 그것은 내가 가지고 노는 샘플 데이터의 유물이었습니다. 귀하의 시트에서 셀 참조로 대체 될 것이라고 가정합니다.
Excellll

@ TorbenGundtofte-Bruun 사용중인 수식을 공유 하시겠습니까? 가능한 경우 문제를 해결할 수 있습니다. 또한 항상 수식을 단계별로 사용하여 수식의 Evaluate Formula어느 부분에서 오류가 발생하는지 확인할 수 있습니다. 이 기능은 Excel에 존재하며 LibreOffice Calc에 동일한 기능이없는 경우 놀랍습니다.
Excellll

내 원래 공식은 간단하기 때문에 =VLOOKUP(J1061;$J$2:$K$9999;2;0)col J에 수취인이 있고 col K가 범주에 포함 된 경우 적절하지 않습니다 . 예상대로 첫 번째 일치를 반환합니다.
Torben Gundtofte-Bruun

2

(여기서 정렬 된 데이터에 대한 별도의 질문은 없습니다.)

데이터 정렬 된 경우 Excel에서 공식적으로 "근사 일치 검색"으로 설명되는 인수 (또는 기본값이므로 생략) VLOOKUP와 함께 사용할 수 있습니다 .range_lookupTRUE

즉, 정렬 된 데이터의 경우 :

  • 마지막 인수를 설정하여 첫 번째 값 을 FALSE반환 하고
  • 마지막 인수 설정 TRUE반환 마지막 값입니다.

이것은 문서화되지 않았고 모호하지만 VisiCalc (1979)로 거슬러 올라가며 오늘날 Microsoft Excel, LibreOffice Calc 및 Google Sheets에서 유지됩니다. 궁극적으로 LOOKUPVisiCalc 의 초기 구현 (및 그 이후 VLOOKUPHLOOKUP) 으로 인해 네 번째 매개 변수가 없었습니다. 값은 포괄적 인 왼쪽 경계 및 독점 오른쪽 경계 (공통적이고 우아한 구현)를 사용하여 이진 검색 으로 확인되며이 동작이 발생합니다.

하나는 후보 구간과, 검색 시작한다는 기술적 이러한 수단 [0, n), n어레이의 길이를 루프 불변 조건 즉 A[imin] <= key && key < A[imax](<= 대상, 종료 후를 시작 결합 권리가있다 바인딩 한 채로 > 타겟; 검증하는, 하나 전의 끝점 값을 확인하거나, 검사 결과 후) 순차적 어느 쪽 보존이 불변 양분 및 선택 : 한쪽 제외하여 것이다하면, 1 개 기간과의 간격에 도달 할 때까지 [k, k+1), 상기 그런 다음 알고리즘이를 반환합니다 k. 이것은 정확히 일치 할 필요는 없습니다 (!) : 아래에서 가장 가까운 일치 일뿐입니다. 중복 일치 하는 경우 다음 값이 커야 하므로 마지막 일치 를 반환합니다.키 (또는 배열의 끝)보다. 중복의 경우 몇 가지 동작 이 필요 하며 이는 합리적이고 구현하기 쉽습니다.

이 동작은이 이전 Microsoft 기술 자료 문서 (강조 추가)에 명시 적으로 설명되어 있습니다. "XL : 배열에서 첫 번째 또는 마지막 일치 항목을 반환하는 방법"( Q214069 ) :

LOOKUP () 함수를 사용하여 정렬 된 데이터 배열 내에서 값을 검색하고 다른 배열 내 해당 위치에 포함 된 해당 값을 리턴 할 수 있습니다. 조회 값이 배열 내에서 반복 되면 마지막으로 발생한 일치를 반환합니다 . 이 동작은 VLOOKUP (), HLOOKUP () 및 LOOKUP () 함수에 해당됩니다.

일부 스프레드 시트에 대한 공식 문서는 다음과 같습니다. "마지막 일치"동작이 명시되어 있지 않지만 Google 스프레드 시트 문서에 암시되어 있습니다.

  • 마이크로 소프트 엑셀

    TRUE 는 테이블의 첫 번째 열이 숫자 또는 알파벳순으로 정렬되어 가장 가까운 값 을 검색한다고 가정합니다 .

  • Google 스프레드 시트 :

    경우 is_sorted입니다 TRUE또는 생략, 가장 가까운 일치 ( 같거나 적은 검색 키에) 반환


가장 가까운 경기 는 나를 미치게했다!
davetapley

1

검색 배열의 값이 순차적 인 경우 (즉, 최신 날짜와 같은 가장 큰 값을 찾고있는 경우) INDIRECT 함수를 사용할 필요조차 없습니다. 이 간단한 코드를 사용해보십시오 :

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

CTRL + SHIFT + ENTER를 사용하여 공식을 다시 입력하십시오.


0

나는 가장 빈번한 가치를 지녔다. 그것이 libreOffice에서 작동하는지 확실하지 않지만 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))

열 A는 수취인이되고 열 B는 범주가되고 D2는 필터링하려는 수취인입니다. 왜 위의 함수에 추가 줄 바꿈이 있는지 모르겠습니다.

마지막 셀을 찾는 내 기능은 다음과 같습니다.

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

간접적으로 반환 할 열을 지정하고 행을 직접 찾을 수 있으므로 헤더 행 수를 뺄 필요가 없습니다.

이 두 기능 모두 Ctrl + shift + enter를 사용하여 입력해야 합니다.


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

이것은 당신에게 마지막 가치를 얻을 것입니다

3 년 늦게 보너스 포인트를 받습니까?


-1

#DIV/0!다음과 같은 공식을 작성해야하기 때문에 오류 가 발생했습니다.

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

이것은 작동하고 마지막 일치를 찾을 수 있습니다.

([payee range] = [search value]) : 부울 행렬 TRUE / FALSE

IF(([payee range] = [search value]);1;"") : 의사 부울 행렬 1 / ""

=LOOKUP(2; {pseudo-boolean matrix 1/""} );[category range]): 항상 마지막 1위치로 돌아 가기


LOOKUP정렬 된 목록에서만 작동하며 comarison의 결과는 1정렬되지 않은 방식으로 s 및 공백 목록을 생성 하므로 올바른 결과를 얻지 못합니다.
Máté Juhász
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.