如何在组合的if,vlookup和index函数中包含另一个if函数?

时间:2014-03-15 12:19:33

标签: excel

我的数据如下:

Colums C,D,E,F

Row 1 4,10,40,F

Row 2 4,12,48,F

Row 3 4,14,56,F

Row 4 3,16,48,F

Row 5 1,18,18,F

Row 6 1,20,10,F

Row 7 0,22,0,0

我的f是在F列上。我在F列中的当前数组公式是:

=IF(C31=0,VLOOKUP(INDEX($C$30:$C$38,MIN(($C$30:C30*D31)-$E$30:E30)),$C$30:$E$38,1),"F")

如果列C等于0,我希望列F的公式返回列C的值,该列具有列C(allrowsbefore)*列D(currentrow)和E(各自)之间的相应最小差异,之前的所有行)。例如,在第2行中,最小化问题将等于:C1 * D2-E1,如果C2将等于0.

但是,现在我希望F列公式只选择一个不等于0的C值。

因此,在列 F7 中,我希望列F给出值1,因为这是一个C值,它大于0并且具有(C6 * D7)之间的相应最小差值 - E6。 (对于C的值4,它将是32,对于C的值3,它将是18)。

我如何以及在哪里将if条件(我选择的C值必须大于1)包含在我现有的公式中?

非常感谢您提供帮助,非常感谢!如果我需要拆分我现有的公式,那也没关系。

1 个答案:

答案 0 :(得分:0)

在做出我之前的评论后,我更仔细地重读了你的问题,我想我现在明白了。为确保获得大于0的最小值,请根据this KB article使用以下内容:

=MIN(IF(A1:A10>0,A1:A10))

因此,您在F7中的公式应该与您描述的范围相似:

=IF(C7=0,VLOOKUP(INDEX($C$1:$C$7,MIN((IF($C$1:$C$7>0,$C$1:$C$7)*D6)-$E$1:$E$7)),$C$1:$E$7,1),"F")

修改

好。我想我终于明白了这个问题。 :)

  1. 如果Cx<> 0,Fx = Cx
  2. 如果Cx = 0,则Fx = C列中产生最小值(C1 * D7 - E1,C2 * D7 - E2,......,CN * D7 - EN)的单元格地址
  3. 根据我所知道的Excel,我认为你不能用一个公式来做到这一点。 INDEXVLOOKUP都在工作表中查找值,但您尝试使用计算值(MIN)进行操作。使用数组公式来找到该值非常聪明。但是一旦我们得到了值(在这种情况下为4),我们就无法使用它来查找产生该结果的C列中的单元格地址。没有宏,我真的无法想到任何方法。你能做到吗?

    编辑:宏观解决方案

    这有点快速和肮脏,但它通过了测试。确保将工作簿另存为启用宏的工作簿。按Alt + F11打开宏编辑器。您可能需要插入一个新模块。您可以通过右键单击左侧项目资源管理器中的工作簿项目来执行此操作。

    Add module

    完成此操作后,双击该模块。你应该在右边有一个空白的白色文本编辑器。将以下代码粘贴到该窗口中:

    Public Function MinimumC()
    
        Dim rngCurrent As Range
        Set rngCurrent = Application.ThisCell
    
        Dim rngMin As Range
        Dim minimum As Long
        minimum = 100000000
    
        Dim tmp As Long
    
        Dim rngC As Range
        Set rngC = ActiveSheet.Range("C1:C" & rngCurrent.Row - 1)
    
        For Each c In rngC.Cells
            If c.Value2 <> 0 Then
                tmp = c.Value2 * rngCurrent.Offset(0, -2).Value2 - c.Offset(0, 2)
                If tmp < minimum Then
                        minimum = tmp
                        Set rngMin = c
                    End If
                End If
            Next c
    
        MinimumC = rngMin.Value2
    
    End Function
    

    保存工作簿。您现在可以关闭代码编辑器。

    现在,您可以在F1中使用以下公式,并复制列F:=IF(C1<>0,C1,MinimumC())

    只要C1 * Dy - E1的值永远不会超过100000000,这将有效。:)