我在Excel中有一个2变量100x100数据表。
我需要一个函数来返回产生给定目标值的所有可能的变量集。 我正在看的是某种反复的二维查找功能。有人能指出我正确的方向吗?
答案 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中搜索匹配,然后在上一场比赛之后的调整范围内搜索匹配来实现。
然后通过上面的解释在电子表格中更容易,但这是我目前能做的最好的事情......