
저는 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일 필요는 없지만 모든 수식이 될 수 있습니다. 수취인/범주 열을 바꿀 수도 있습니다. 정렬 열을 변경하지 마세요.
다음을 선택하는 솔루션에 대한 보너스 포인트가장 빈번한마지막보다는 가치!
답변1
배열 수식을 사용하여 마지막으로 일치하는 레코드에서 데이터를 가져올 수 있습니다.
=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.
이는 a의 INDEX
/ 구성 과 유사하게 작동 하지만 대신에 조건문을 사용합니다 .MATCH
VLOOKUP
MAX
MATCH
ROW(...)
이는 테이블이 행 1에서 시작한다고 가정합니다. 데이터가 다른 행에서 시작하는 경우 맨 위 행과 1 사이의 차이를 빼서 부분을 조정해야 합니다 .
답변2
(정렬된 데이터에 대해서는 별도의 질문으로 답변하지 않습니다.)
데이터의 경우~이었다정렬된 경우 Excel에서 공식적으로 "대략적인 일치 항목 검색"으로 설명되는 인수 (또는 기본값이므로 생략) VLOOKUP
와 함께 사용할 수 있습니다 .range_lookup
TRUE
즉, 정렬된 데이터의 경우:
- 마지막 인수를 설정하여
FALSE
다음을 반환합니다.첫 번째가치, 그리고 - 마지막 인수를 설정하여
TRUE
다음을 반환합니다.마지막값.
이는 대부분 문서화되지 않고 모호하지만 VisiCalc(1979)로 거슬러 올라가며 현재는 적어도 Microsoft Excel, LibreOffice Calc 및 Google Sheets에 적용됩니다. 이는 궁극적으로 네 번째 매개변수가 없을 때 LOOKUP
VisiCalc(그리고 이후 VLOOKUP
및 ) 의 초기 구현 때문입니다 . HLOOKUP
값은 다음에 의해 발견됩니다.이진 검색, 포괄적인 왼쪽 경계와 배타적인 오른쪽 경계(일반적이고 우아한 구현)를 사용하면 이 동작이 발생합니다.
기술적으로 이것은 후보 간격으로 검색을 시작한다는 것을 의미합니다. 여기서 는 배열의 길이이고 루프 불변 조건은 다음과 같습니다 [0, n)
( 왼쪽 경계는 <= 대상이고 오른쪽 경계는 끝 이후에 시작됩니다). > 대상을 확인하려면 이전에 끝점에서 값을 확인하거나 이후에 결과를 확인하고 이 불변성을 유지하는 쪽을 연속적으로 이등분하고 선택합니다. 한 쪽을 제외하면 1개의 항이 있는 간격에 도달할 때 까지 그런 다음 알고리즘은 를 반환합니다 . 이는 정확히 일치할 필요는 없습니다(!). 아래에서 가장 가까운 일치일 뿐입니다. 중복된 일치 항목이 있는 경우 결과가 반환됩니다.n
A[imin] <= key && key < A[imax]
[k, k+1)
k
마지막다음 값이 필요하므로 일치합니다.보다 큰키(또는 배열의 끝)보다. 중복되는 경우 필요합니다.일부행동이며 이는 합리적이고 구현하기 쉽습니다.
이 동작은 이전 Microsoft 기술 자료 문서(강조 추가): "XL: 배열에서 첫 번째 또는 마지막 일치 항목을 반환하는 방법"(Q214069):
LOOKUP() 함수를 사용하면 정렬된 데이터 배열 내에서 값을 검색하고 다른 배열 내 해당 위치에 포함된 해당 값을 반환할 수 있습니다. 배열 내에서 조회 값이 반복되는 경우마지막으로 일치하는 항목을 반환합니다.. 이 동작은 VLOOKUP(), HLOOKUP() 및 LOOKUP() 함수에 적용됩니다.
일부 스프레드시트에 대한 공식 문서는 다음과 같습니다. 둘 다 "마지막 일치" 동작이 명시되어 있지 않지만 Google 스프레드시트 문서에는 암시되어 있습니다.
-
진실테이블의 첫 번째 열이 숫자 또는 알파벳순으로 정렬되어 있다고 가정하고 다음을 검색합니다.가장 가까운 값.
-
is_sorted
이거나TRUE
생략된 경우가장 가까운 일치(작거나 같음검색 키에)가 반환됩니다.
답변3
검색 배열의 값이 순차적인 경우(즉, 최신 날짜와 같이 가장 큰 값을 찾는 경우) INDIRECT 함수를 사용할 필요조차 없습니다. 다음의 간단한 코드를 사용해 보세요.
=MAX(IF($A$1:$A$20="c",$B$1:$B$20,)
다시 CTRL + SHIFT + ENTER를 사용하여 수식을 입력하세요.
답변4
나는 가장 빈번한 값으로 이동했습니다. 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+시프트+엔터