带有价值带的Excel定价模型

时间:2018-03-16 16:29:08

标签: excel

我正在开发Excel中的定价模型,并且在尝试使用下面的数组公式时遇到错误。

Pricing Table

|           |             |        |        |      |      |      |      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。

我也可以用不同的方式设置表格,但我觉得这是呈现数据的最佳方式。

2 个答案:

答案 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);
}

enter image description here

修改

以下是修正后的错误处理公式

=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,则会在工作表中将其格式化为百分比。

在工作表中使用:

Data

<强>代码:

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