我正在开发Excel中的定价模型,并且在尝试使用下面的数组公式时遇到错误。
| | | | | | | | Cycle
|-----------|-------------|--------|--------|------|------|------|------|------|------|------|
| Region | Region Code | Low | High | A | X | P | 1 | 2 | 3 | 4 |
| NorthEast | 1 | 10000 | 25000 | -61% | N/A | 38% | TBD | | | |
| NorthEast | 1 | 25000 | 50000 | -32% | N/A | -2% | -2% | -2% | -2% | -2% |
| NorthEast | 1 | 50000 | 75000 | -21% | -50% | -34% | -34% | -34% | -34% | -34% |
| NorthEast | 1 | 75000 | 100000 | -38% | -26% | -19% | -19% | -19% | -19% | -19% |
| NorthEast | 1 | 100000 | 125000 | -27% | -45% | -21% | -21% | -21% | -21% | -21% |
我在公式中搜索的变量是 1区 周期2 价值35000
我需要公式来查找区域代码,低和高数字之间的值,然后最后是值的循环,以返回循环列下右侧表格中的%。
到目前为止,我已尝试使用索引匹配数组来搜索这些变量:
=INDEX(I12:L15, MATCH(1,(C:C=P19)*(10:10=Q19)*((D:D>=R19)/(E:E<=R19)),0))
P19 = 1(区域代码),Q19 = 2,R19 = 35000。在这种情况下,列C是表的区域代码列,列D是低值,列E是高值,行10是循环所在的位置。
尝试计算时,Excel资源不足。我确信有更好的方法可以进行此计算,可能还有多个Vlookup / Hlookup / Lookups。
我也可以用不同的方式设置表格,但我觉得这是呈现数据的最佳方式。
答案 0 :(得分:1)
第一篇帖子恕我直言的好问题。
我认为下面的公式是正确的,显示了如何使用INDEX / MATCH更有效地完成它,但目前缺少错误处理(即小于10000的值会给#N / A,大于125000会给出与125000相同的答案。
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new CompilerPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 30);
}
修改
以下是修正后的错误处理公式
=INDEX($I:$L,MATCH(R2,INDEX($D:$D,MATCH(P2,$C:$C,0)):INDEX($D:$D,MATCH(P2,$C:$C)))+MATCH(P2,$C:$C,0)-1,MATCH(Q2,$I$1:$L$1,0))
答案 1 :(得分:1)
这是一个可以在工作表中调用的UDF。代码将进入标准模块。可能需要进行一些错误检查。
如果找不到值-999999
,则会在工作表中将其格式化为百分比。
在工作表中使用:
<强>代码:强>
Option Explicit
Public Function GetPercentage(ByVal Region As Long, ByVal Cycle As Long, ByVal Amount As Double) As Double
Dim wb As Workbook
Dim wsSource As Worksheet
Set wb = ThisWorkbook
Set wsSource = wb.Worksheets("Sheet1") 'change as appropriate
Dim lookupSource()
Dim lastRow As Long
If Cycle < 1 Or Cycle > 4 Then
MsgBox "Invalid cycle chosen"
GetPercentage = -999999 'chose your not found return value
Exit Function
End If
With wsSource
lastRow = .Cells(.Rows.Count, "C").End(xlUp).Row
End With
'Assuming data starts in C2
lookupSource = wsSource.Range("C2:N" & lastRow).Value2 'change as appropriate
Dim requiredColumn As Long
requiredColumn = Application.Match(Cycle, wsSource.Range("C2:N2"), 0)
Dim currentRow As Long
For currentRow = 2 To UBound(lookupSource, 1)
If lookupSource(currentRow, 2) = Region And lookupSource(currentRow, 3) <= Amount And lookupSource(currentRow, 4) >= Amount Then
GetPercentage = lookupSource(currentRow, requiredColumn)
Exit Function
Else
GetPercentage = -999999
End If
Next currentRow
End Function