【问题标题】:Comparing two inputs to data set to return single output将两个输入与数据集进行比较以返回单个输出
【发布时间】:2014-09-23 12:42:28
【问题描述】:

我在编程过程中需要一些帮助,而不是程序本身(如果代码可用,那就更好了!)。我有一个包含 3 列(ID、CS、部分)的电子表格,我正在尝试设置一个用户表单,如果将 ID 和 CS 指定为输入,则其中最接近的值集返回一个部分(或多个部分有接近的 ID 和 CS 值)例如,数据是:

ID///CS///部分

10///4.2///PN1

12///5.7///PN038

103.43///5.7///PN99

并且用户输入 ID=11.27,CS=4,程序返回 PN1,因为这是“最接近”的组合。

我尝试通过循环遍历所有 CS 并在所需值的上方和下方找到一个并准确地设置它是否存在于数据中,然后检查这些 CS 的 ID,就像检查 CS通过查看上面的 ID,就在下面,如果存在则精确,然后将所有 9 个值输出到一个列表框中,然而,这变得非常混乱和混乱,因此,我正在寻找一个更优雅的解决方案来解决这个问题。

【问题讨论】:

    标签: excel vba compare


    【解决方案1】:
     Sub test()
    
    'leastDeviation changed to 4447 as its maximum value is 4446. (61.75*8^2+494)
     leastDeviation = 4447
     lastRow = Range("A" & Rows.Count).End(xlUp).Row
     For rowCheck = 1 To lastRow
         'squared to eliminate sign
         deviation = 61.75 * (inputID - Cells(rowCheck, "A")) ^ 2 + (inputCS - Cells(rowCheck, "B")) ^ 2
         If deviation < leastDeviation Then
             closest = rowCheck
         End If
     Next rowCheck
     closestPart = Cells(closest, "C")
     End Sub`
    

    【讨论】:

    • 非常感谢,这太棒了,而且效果比我整理的要好得多。有没有办法设置它,使得 ID 的偏差与 CS 的得分不同?我的意思是,在小偏差方面,CS 在哪里稍微更关键?这是因为 ID 范围在 6-500 之间,而 CS 在 1-9 左右。
    • 您可以尝试按范围对偏差进行加权。所以ID的范围是1-9;相差 8。CS 范围为 6-500,相差 494,使得范围比为 8:494。 494/8 是 61.75,所以我们可以说 ID 偏差 1 的波动性是 CS 偏差的 61.75 倍;检查我在上面所做的更改。这也取决于您的目的是什么;如果输入的 ID 和 CS 旨在表示均值,那么您可以使用标准差统计数据做类似的事情。
    猜你喜欢
    • 2010-12-21
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多