在Excel

时间:2017-06-08 14:29:46

标签: excel excel-vba excel-formula excel-2010 excel-2007 vba

在Excel中,我列出了许多不同尺寸的产品,大小为“10x10 cm”,“11x11 cm”和“15x15 cm”属于产品A等。

enter image description here

在其他一些细胞中,我选择的是产品(产品A,产品B或产品C)和​​尺寸。

我希望,对于每个其他产品,确定哪个尺寸最接近所选产品:

enter image description here

我不知道如何解决这个问题。一种解决方案可能是从字符串中删除所有非数字字符,并在“x”的每一侧添加两个值,然后选择与所选大小的总和具有最低绝对差值的大小。

但我想这样做更容易进行映射并使用VLOOKUP来选择给定列中第一个找到的大小。

然而,问题在于我不仅有3种不同尺寸的产品,而是15种不同尺寸的产品,所以我不知道如何以巧妙的方式进行映射。

1 个答案:

答案 0 :(得分:0)

1)使用为每个产品提取的值创建一个查找表,

来源表

enter image description here

<强>代码

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

enter image description here

由于您有15个不同的产品,请运行此宏以提取查找数据。除非您有其他产品,否则这应该是一次性活动。

2)假设您输入的产品和尺寸为F5F6,我建议您使用下拉列表进行数据验证,以便从列表中进行选择,

enter image description here

3)使用worksheet_change事件,检测F5F6中的更改,

<强>代码

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

中的其他产品类型

enter image description here

4)变量result将包含您在F6中提供的值的产品/区域。唯一未决的任务是循环查找表以查找最接近的匹配。算法如下,

<强>算法:

  1. 将单元格F5与查找表(需要循环)的第1行中的数据进行比较
  2. 如果它们相等,请忽略并移至下一个值。如果不是,则需要循环下一个列以查找下一个匹配项,并将结果填充到源表中的相应单元格中。
  3. 列式循环算法如下,
  4. 步骤

    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:
    

    具有最小差异的单元格值将是您对该特定产品类型的最佳匹配。

    更长的解释,希望这有帮助。