在Excel中查找数据

我在Excel中有一个2variables100x100数据表。

我需要有一个函数返回所有可能的产生给定目标值的variables集合。 我所看到的是某种二维查找function。 有人能指出我正确的方向吗?

它可以在没有VBA的情况下完成,就像这样。

假设你的100×100表格在B2:CW101中,我们把从A2到A101左边的数字1到100的列表,以及从B1到CW1的顶部再次从1到100

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

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函数find最大的结果,排除所有先前find的结果,即它从右下angular开始一次一个地find目标结果直到左上。 (通过一点努力,你可以通过其他方式来search)。

这会给你9922的结果,这是第99行,第22列,你可以很容易地从数字中提取这些值。

希望这是有道理的。

没有内置的function,将做你想做的,我99%肯定的。

返回一个数组的VBA函数可以按照已经显示的quick-and-dirty Sub的内容build立。 创build一个Variant来保存输出,也许Redimmed的结果数量最多,Redim Preserve-d最后减less到实际的数字。 然后返回该函数的结果,然后需要将其作为数组函数调用(Control-Shift-Enter)。

一个不好的方面是,你必须确保目标范围足够大,以保持整个结果:Excel不会自动执行。

我尝试了很多,而不使用VBA,但没有它,似乎不可能。 为了解决这个问题,我需要遍历整个数组并find最接近的值。 然后使用调用和范围属性取消这些值,并在每次有效匹配的范围内生成输出。

快速和肮脏的实施如下:

 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的方法。

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

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

总结如下 – 让我知道如果你需要更多的细节。 N =数据的维数,例如100。

首先,创build一个包含五列和NxN行的新表格。 在每种情况下,将我的列名replace为相应的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)包含数据表中的值,使用如下forms:= OFFSET($ A $ 1,DATAROW,DATACOL),假设您的数据表以$ A $ 1开始

现在我们已经有了一个保存所有数据的一维表格。

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

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

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

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

这是通过searchVALUERANGE中的匹配,然后在上一次匹配之后search在调整范围内的匹配来工作的。

在电子表格中,通过上面的解释要容易得多,但这是目前我能做的最好的…