在Excel中查找数据

时间:2008-10-21 06:28:41

标签: excel lookup

我在Excel中有一个2变量100x100数据表。

我需要一个函数来返回产生给定目标值的所有可能的变量集。 我正在看的是某种反复的二维查找功能。有人能指出我正确的方向吗?

5 个答案:

答案 0 :(得分:1)

没有内置功能会做你想做的事情,我对此肯定是99%。

可以构建一个返回数组的VBA函数,沿着已经显示的快速和脏的子行。创建一个Variant来保存输出,可能Redimmed到最大可能的结果数,Redim Preserve-d到最后的实际数。然后返回作为函数的结果,然后需要将其作为数组函数调用(Control-Shift-Enter)。

一个缺点是,您必须确保目标范围足够大以容纳整个结果:Excel不会自动执行此操作。

答案 1 :(得分:1)

可以在没有VBA的情况下完成,相当紧凑,就像这样。

假设你的100x100表在B2:CW101中,我们在A2到A101的左下方放置一个数字1到100的列表,从B1到CW1的顶部再放一个1到100

在下面创建一列单元格,从B104开始(比如说)

 B104=MAX(($A$2:$A$101*100+$B$1:$CW$1<B103)*($B$2:$CW$101=TargetValue)*($A$2:$A$101*100+$B$1:$CW$1))

这是一个“数组”公式,因此请按Ctrl-Shift-Enter而不是Enter,并且公式周围应出现大括号{}。

然后向下复制尽可能多的行。您还需要在第一个公式上方放置一个大数字,即在B103中,例如999999。

公式的作用是计算Rowx100 + Column,但仅针对每个成功的单元格,MAX函数找到最大的结果,排除所有先前的结果,即它一次找到一个目标结果,从底部开始正确并向左上方工作。 (只需稍加努力就可以让它以另一种方式进行搜索)。

这将为您提供9922之类的结果,即第99行第22列,您可以轻松地从数字中提取这些值。

希望这是有道理的。

答案 2 :(得分:0)

答案 3 :(得分:0)

我在没有使用VBA的情况下尝试了很多,但没有它也似乎不可能。 为了解决这个问题,我需要遍历整个数组并找到最接近的值。然后使用调用和范围属性对这些值进行derefernced,并在每个有效匹配时递增的范围内生成输出。

快速而肮脏的实现如下:

Dim arr As Range
Dim tempval As Range
Dim op As Integer

Set arr = Worksheets("sheet1").Range("b2:ao41")
op = 1
Range("B53:D153").ClearContents





For Each tempval In arr
If Round(tempval.Value, 0) = Round(Range("b50").Value, 0) Then

Range("b52").Offset(op, 0).Value = Range("a" & tempval.Row).Value
Range("b52").Offset(op, 1).Value = Cells(tempval.Column, 1).Value
Range("b52").Offset(op, 2).Value = tempval.Value
op = op + 1

End If

Next
Range("b50").Select

我仍在寻找没有VBA的方法。

答案 4 :(得分:0)

我有一个不使用VBA的解决方案,但它相当混乱。它涉及在Excel中创建另一个一维表并对其进行查找。对于100x100数据表,新表需要10,000行。

如果这不符合您的需求,请道歉。

摘要如下 - 如果您需要更多详细信息,请与我们联系。 N =数据的维度,例如你的例子中有100个。

首先,创建一个包含五列和NxN行的新表。在每种情况下,使用适当的Excel引用替换我的列名称

第一列(称为INDEX)只列出1,2 ... NxN。

第二列(DATAROW)包含一个循环1,2,... N,1,2 ... N的公式...这可以使用类似= MOD(INDEX-1,N)+的方法来完成1

第三列(DATACOL)包含1,1,1 ... 2,2,2 ......(每次N次)。 这可以用= INT((INDEX-1)/ N)+1

来完成

第四列(VALUE)包含数据表中的值,使用类似于: = OFFSET($ A $ 1,DATAROW,DATACOL),假设您的数据表起价为$ A $ 1

我们现在有一个包含所有数据的一维表。

第五列(LOOKUP)包含公式: = MATCH(目标,OFFSET(VALUERANGE,[LOOKUP-1],0),0)+ [LOOKUP-1]

其中[LOOKUP-1]指的是紧接在上面的细胞(例如在细胞F4中,这指的是F3)。你需要在LOOKUP列的第一个单元格之上加0。

VALUERANGE应该是对整个VALUE列的固定(命名或使用$ sign)引用。

然后LOOKUP列保存INDEX号码,可用于查找DATAROW和DATACOL以查找数据中匹配的位置。

这可以通过在VALUERANGE中搜索匹配,然后在上一场比赛之后的调整范围内搜索匹配来实现。

然后通过上面的解释在电子表格中更容易,但这是我目前能做的最好的事情......