2017-12-21 1 views
2

내가 VBA에서 다음과 같은 기능을 가지고 있습니다 :# VALUE! 명명 된 범위와 VBA 기능에 오류 VLOOKUP

Function weightedAverage(x0, y0, x1, y1, x) 
    weightedAverage = y0 + (x - x0) * (y1 - y0)/(x1 - x0) 
End Function 

Function interpolateLookup(lookupVal As Range, lookupRange As Range, colID As Integer) As Double 
    step = 0.01 

    x0 = Application.Round(lookupVal.Value, 3) 
    y0 = Application.VLookup(x0, lookupRange, colID, True) 

    x1 = Application.Round(lookupVal.Value, 3) + step 
    y1 = Application.VLookup(x1, lookupRange, colID, False) 

    x = lookupVal.Value 

    interpolateLookup = weightedAverage(x0, y0, x1, y1, x) 
End Function 

여기서 문제는 내 interpolateLookup 함수는 # VALUE를 반환한다는 것입니다! 다음 입력을 전달하면 오류가 발생합니다.

=interpolateLookup(E5,K3:O803,5) 

왜?

+0

코드를 살펴 보셨습니까? 나의 첫 번째 생각은'y0' 또는'y1' 중 하나가 에러 값을 반환하는 것입니다. – Rory

+0

옙 ... 알겠습니다. y1이 값 오류를 반환하고 있습니다 ... –

+0

당신은 ** 정확한 ** 일치를 찾으려고 했습니까? – Rory

답변

0

진짜 문제는 내 머리 속에 있습니다. 찾을 수 내 조회에 키의 정밀도를 활용하여 솔루션 :

Function interpolateLookup(lookupVal As Range, lookupRange As Range, colID As Integer) As Double 
    step = 0.01 

    x0 = Application.Round(lookupVal.Value, 2) 
    y0 = Application.VLookup(x0, lookupRange, colID, False) 

    x1 = Application.Round(lookupVal.Value, 2) + step 
    y1 = Application.VLookup(x1, lookupRange, colID, False) 

    x = lookupVal.Value 

    interpolateLookup = Application.Round(weightedAverage(x0, y0, x1, y1, x), 1) 
End Function 

내 lookupVal는 3 자리의 정밀도를 가지고 내 검색 키는 2 자리 정밀하다, 따라서 내가 알고이 개 자리에 내 lookupVal 둥근 테이블에서 정확하게 일치하는 것을 보게 될 것이며 내 보간을위한 저 대역이 될 것임을 알게 될 것입니다.

의견을 보내 주셔서 감사합니다.