2017-08-15 163 views
1

這裏對應的價值是什麼,我試圖完成,我有兩個表:多列查找並返回下一列(最接近的數值)

參考表: Click to see the image

Code  Length  Width  Height 

A   78   48  25  
B   78   48  34 
C   12   7.4  5 
D   12   15   5 
E   12   15  7.5 
F   12   15   9 
G   24   15   5 
H   24   15   7 

解決方案圖:

Click to see solution example

Length Width Height Returning Code Match_L Match_W Match_H 

10  6  8   C    12  7.4  5 

在列的公式「返回代碼」應該尋找在相應的參考手冊中所述的最接近的值,即,長度< - >長度,寬度< - >寬度,高度< - >高度和從相應的行中返回匹配的「代碼」。

如果我希望在值相等的情況下匹配它,本來會更簡單,但在我的情況下,它將在每個相應列中查找最接近的值(或者更大或更小),並返回匹配的「代碼「和Match_L,Match_W,Match_H列中的值。

任何幫助或指針,高度讚賞!

+0

你已經嘗試過什麼,並且哪裏失敗?你在找VBA的解決方案嗎?如果是的話,你已經有了什麼代碼?兩個方向的差異是否平等對待,就像絕對差異一樣,或​​者甚至可以相互影響? – Luuklag

+0

您有兩張工作表,在這張工作表中,您將輸入'ReturningCode',其餘值將自動從另一張工作表填充。這樣對嗎?請多說明一下,輸入是什麼以及預期的輸出是什麼。 –

+0

@MIdrees我將輸入長度,寬度和高度,它應該返回「代碼」。在這個例子中,我輸入了L = 10,W = 6,H = 8,並且最接近的匹配值在「C」中,L = 12,= 7.4,H = 5。所有三個值都應該匹配! –

回答

0

以下VBA將做到這一點工作。

Sub LookupNearestValue() 

    Dim ws As Worksheet: Set ws = Worksheets("Sheet1") 
    Dim LastRow As Long: LastRow = ws.UsedRange.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 
    Dim i As Long, RowCounter As Long: RowCounter = 2 

    Dim tRowCounter As Long 
    Dim tValue As Long 
    Dim tempValue As Long 

    Dim tLength As Long, tWidth As Long, tHeight As Long 
    Dim tempLength As Long, tempWidth As Long, tempHeight As Long 

    tLength = ws.Cells(2, 6) 
    tWidth = ws.Cells(2, 7).Value 
    tHeight = ws.Cells(2, 8).Value 

    With ws 
     For i = 2 To LastRow 

      tempLength = ws.Cells(RowCounter, 2) 
      tempWidth = ws.Cells(RowCounter, 3).Value 
      tempHeight = ws.Cells(RowCounter, 4).Value 

      tempValue = Abs(tLength - tempLength) + Abs(tWidth - tempWidth) + Abs(tHeight - tempHeight) 

      If RowCounter = 2 Then 
       tValue = tempValue 
       tRowCounter = RowCounter 
      ElseIf RowCounter > 2 And tempValue < tValue Then 
       tValue = tempValue 
       tRowCounter = RowCounter 
      End If 

      RowCounter = RowCounter + 1 
     Next i 

     ws.Cells(2, 9) = ws.Cells(tRowCounter, 1) 
     ws.Cells(2, 10) = ws.Cells(tRowCounter, 2) 
     ws.Cells(2, 11) = ws.Cells(tRowCounter, 3).Value 
     ws.Cells(2, 12) = ws.Cells(tRowCounter, 4).Value 


    End With 

End Sub 

爲了讓這個宏的工作,你需要根據這些列安排對錶中的數據:

enter image description here

在我的表,我已經安裝上運行值的變化情況下,本宏在H2單元格中。

+0

謝謝@M_Idrees這有助於很多! –

+0

歡迎,很高興幫助。 –

1

假設僅存在用於輸入所需的長度,在其最大寬度和高度,並且因此只有一個返回值的單個的地方:

在參考表中E添加三個多列到G:length_difwidth_difheight_dif

這些列的公式將在單元格E2中:=ABS(B2-SolutionSheet!A$2)然後將其展開爲G2並將其繪製到解決方案表的末尾。

在參考表添加另一列在H:dif_abs用公式:=Sum(E2:G2)

然後返回你的價值在D2單元格中添加以下公式置於SolutionSheet:=Index(ReferenceSheet!$A$2:$H$9;MATCH(Min(ReferenceSheet!$H$2:$H$9);ReferenceSheet!$H$2:$H$9);1)

相關問題