Excel 基于拆分的If函数
我有一个问题,我一直无法在网上远程找到任何类似的东西 我有20列数据,其中包含摊销公式 我现在需要检查摊销是否符合两个标准 基于对第15行的拆分,我需要它检查两个项目item是否引用了第1行,即它们是否包含第3行,以及这两个项目在第13行中的值是否相同 现在,拆分可以是项目1、2、4或1、2或1、5等。基于用户输入的任何组合 如果未包含状态,则检查第18行中是否包含状态 我知道如何使用if函数,但不是基于拆分 通过我在这里收到的指导,我知道如何将拆分作为函数的一部分,但我无法确定如何将IF添加到函数中。我的代码根本不起作用,所以没有发布 我的函数是从这里获得的,它们在第13行和第16行中使用 我对代码的错误尝试:-Excel 基于拆分的If函数,excel,vba,Excel,Vba,我有一个问题,我一直无法在网上远程找到任何类似的东西 我有20列数据,其中包含摊销公式 我现在需要检查摊销是否符合两个标准 基于对第15行的拆分,我需要它检查两个项目item是否引用了第1行,即它们是否包含第3行,以及这两个项目在第13行中的值是否相同 现在,拆分可以是项目1、2、4或1、2或1、5等。基于用户输入的任何组合 如果未包含状态,则检查第18行中是否包含状态 我知道如何使用if函数,但不是基于拆分 通过我在这里收到的指导,我知道如何将拆分作为函数的一部分,但我无法确定如何将IF添加到
Function checkIf(sItemIDX As String, cCostToAmortize As Currency, Optional lItemRow As Long = 1) As String
Dim v
Dim P As Currency
Application.Volatile
For Each v In Split(sItemIDX, ",")
'Assuming Item List starts in column B
' But could use other methods to locate table
P = P + Cells(lItemRow + 1, v + 1)
Next v
checkIf = IF(cCostToAmortize = Cells(lItemRow + 1, Application.Caller.Column) then IF(cCostToAmortize = Cells(lItemRow + 1, Application.Caller.Column) Then "" Else "Check"
End If
End Function
这就是我希望结果看起来的样子,颜色只是为了更容易解释
在第18行,我想做一个检查,在我的头脑中,这将在以下步骤中完成
拆分第15行,第15行中的每个数字表示项目第1行。
在最后一张表格中,第15行的任何单元格中都可能有20个数字
根据这些数字,将完成一个If语句,以检查包含的选项第3行。如果输入第3行,则所有选项都应为“是”
15,示例B15表示项目1和2,因此项目1b和项目2c
第三排的学生应该说是的。由于情况并非如此,它应该返回
签入第18行B列和C列
下一阶段,如果项目4 e和项目5 f的情况都是肯定的,则会进行检查,以确保所需的工具成本
摊销与第13行的值相同。在本例中,它们不是
以红色突出显示,因此再次在第18行E列和
F
如果第15行中没有任何内容,那么就可以了,如果第3行中的B列和C列都说是,则再次使用B列和C列,则返回a
注:在最终版本中,第15行的每个单元格中可能包含1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,这意味着它们都需要进行比较
我希望这是有意义的,任何问题都让我知道
谢谢你的阅读
要检查的图像
公式图像
如果我正确理解了您的需求,并且您有Excel for windows 2013+,则可以使用工作表函数完成此操作 例如,要将逗号分隔的数据拆分为单独的数组元素,可以使用:
=FILTERXML("<t><s>" & SUBSTITUTE(B15,",","</s><s>") & "</s></t>","//s")
在适当的情况下,用B12代替B15
因此,您的公式可以如下所示:
B13: =IFERROR(SUM(INDEX(B$1:B$11,FILTERXML("<t><s>" & SUBSTITUTE(B12,",","</s><s>") & "</s></t>","//s"))),0)
B14: =SUM(B5:B11,-B13)
B16: =IFERROR(B13/SUM(INDEX($B$2:$U$2,FILTERXML("<t><s>" & SUBSTITUTE(B15,",","</s><s>") & "</s></t>","//s")))*B2,0)
B17: =B14+B16
B18:
=IFERROR(
IF(AND(
AND(INDEX($B$3:$U$3,FILTERXML("<t><s>" & SUBSTITUTE(B15,",","</s><s>") & "</s></t>","//s"))="Yes"),
AND(INDEX($B$13:$U$13,FILTERXML("<t><s>" & SUBSTITUTE(B15,",","</s><s>") & "</s></t>","//s"))=B13)),
"","Check"),
"")
在下面的屏幕截图中,出现复选框,因为项目2包含行上没有
如果将C3更改为“是”,则第18行的签入将消失
这些公式将处理20列数据。如果有更多或更少,请相应地将各种公式中的引用更改为Bn:Un
请共享您的代码,因为调试现有代码正是此网站的目的。我们没有必要从头开始,因为你可能比你想象的要近。抱歉@urderboy我想这可能会让人困惑。现在补充说。阅读问题和查看代码很难理解您真正需要什么。为了从函数中理解一些东西,我们必须知道函数是如何调用的。实际上,字符串sItemIDX是什么?讨论中的所有行是否都使用分隔符连接?如果不是,那是什么?什么是lItemRow?根据它的名称,我们可以猜测它将是已处理的行号。但是对于一个对这样的代码不感兴趣的人来说,首先制作拼图变得更加困难。你的函数在第5行结束……如果你发布一个屏幕截图,显示基于你的数据的预期结果,可能会有所帮助,因为我不清楚。是的,这很有帮助,尽管我根本不知道第16行是否有功能。也许你想自己试一试?所以在第15行使用Split,循环遍历结果数组。一旦你在第三排找到一个“否”,就停下来。只要第13行中的条目与最后一站不同。如果你在到达最后一项时还没有停下来,你就知道它已经通过了。这是我将如何处理它的概要。您可以稍微缩短一段代码,因为如果您在第15行中发现一个字符串,您可以复制前面的结果;这段对话已经结束。