在Excel中,我列出了许多不同尺寸的产品,大小为“10x10 cm”,“11x11 cm”和“15x15 cm”属于产品A等。
在其他一些细胞中,我选择的是产品(产品A,产品B或产品C)和尺寸。
我希望,对于每个其他产品,确定哪个尺寸最接近所选产品:
我不知道如何解决这个问题。一种解决方案可能是从字符串中删除所有非数字字符,并在“x”的每一侧添加两个值,然后选择与所选大小的总和具有最低绝对差值的大小。
但我想这样做更容易进行映射并使用VLOOKUP来选择给定列中第一个找到的大小。
然而,问题在于我不仅有3种不同尺寸的产品,而是15种不同尺寸的产品,所以我不知道如何以巧妙的方式进行映射。
答案 0 :(得分:0)
1)使用为每个产品提取的值创建一个查找表,
来源表:
<强>代码强>:
Sub lookup()
Dim i As Long, j As Long, prod As Integer, str As String
prod = InputBox("Enter Number of Products")
Sheets.Add.Name = "LookupSheet"
j = 1
For i = 1 To prod
Columns(i).Copy Sheets("LookupSheet").Cells(1, j)
j = j + 2
Next i
For j = 1 To prod * 2 Step 2
For i = 2 To Sheets("LookupSheet").Cells(Rows.Count, j).End(xlUp).Row
str = Replace(Replace(Sheets("LookupSheet").Cells(i, j), " ", ""), "cm", "")
Sheets("LookupSheet").Cells(i, j + 1) = Left(str, InStr(str, "x") - 1) _
* Mid(str, InStr(str, "x") + 1, 999)
Next i
Next j
End Sub
这个简单的代码创建了一个包含相应值的查找表。代码忽略了文本之间的任何空格。
<强> LookupSheet 强>:
由于您有15
个不同的产品,请运行此宏以提取查找数据。除非您有其他产品,否则这应该是一次性活动。
2)假设您输入的产品和尺寸为F5
和F6
,我建议您使用下拉列表进行数据验证,以便从列表中进行选择,
3)使用worksheet_change
事件,检测F5
和F6
中的更改,
<强>代码强>:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim str As String, result As Integer, i As Long
'F5 and F6 contains Product and Size repectively
If (Target.Address = "$F$5" Or Target.Address = "$F$6") _
And Range("F5") <> "" And Range("F6") <> "" Then
str = Replace(Replace(Range("F6"), " ", ""), "cm", "")
result = Left(str, InStr(str, "x") - 1) * Mid(str, InStr(str, "x") + 1, 999)
j = 8
For i = 1 To Cells(1, Columns.Count).End(xlToLeft).Column
If Cells(1, i) <> Range("F5") Then
Range("E" & j) = Cells(1, i)
j = j + 1
End If
Next i
End If
End Sub
此代码会自动填充column E
,
4)变量result
将包含您在F6
中提供的值的产品/区域。唯一未决的任务是循环查找表以查找最接近的匹配。算法如下,
<强>算法:强>
F5
与查找表(需要循环)的第1行中的数据进行比较步骤:
diff = cell.value - result
if diff < 0 then multiply diff by -1
loop:
nextdiff = nextcell.value - result (multiply by -1 if negative)
if nextdiff < diff then
diff = nextdiff
end if
end loop:
具有最小差异的单元格值将是您对该特定产品类型的最佳匹配。
更长的解释,希望这有帮助。