Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 基于拆分的If函数_Excel_Vba - Fatal编程技术网

Excel 基于拆分的If函数

Excel 基于拆分的If函数,excel,vba,Excel,Vba,我有一个问题,我一直无法在网上远程找到任何类似的东西 我有20列数据,其中包含摊销公式 我现在需要检查摊销是否符合两个标准 基于对第15行的拆分,我需要它检查两个项目item是否引用了第1行,即它们是否包含第3行,以及这两个项目在第13行中的值是否相同 现在,拆分可以是项目1、2、4或1、2或1、5等。基于用户输入的任何组合 如果未包含状态,则检查第18行中是否包含状态 我知道如何使用if函数,但不是基于拆分 通过我在这里收到的指导,我知道如何将拆分作为函数的一部分,但我无法确定如何将IF添加到

我有一个问题,我一直无法在网上远程找到任何类似的东西

我有20列数据,其中包含摊销公式

我现在需要检查摊销是否符合两个标准

基于对第15行的拆分,我需要它检查两个项目item是否引用了第1行,即它们是否包含第3行,以及这两个项目在第13行中的值是否相同

现在,拆分可以是项目1、2、4或1、2或1、5等。基于用户输入的任何组合

如果未包含状态,则检查第18行中是否包含状态

我知道如何使用if函数,但不是基于拆分

通过我在这里收到的指导,我知道如何将拆分作为函数的一部分,但我无法确定如何将IF添加到函数中。我的代码根本不起作用,所以没有发布

我的函数是从这里获得的,它们在第13行和第16行中使用

我对代码的错误尝试:-

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行中发现一个字符串,您可以复制前面的结果;这段对话已经结束。