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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
如何在VBA中循环嵌套的If-Then语句_Vba_Loops_If Statement - Fatal编程技术网

如何在VBA中循环嵌套的If-Then语句

如何在VBA中循环嵌套的If-Then语句,vba,loops,if-statement,Vba,Loops,If Statement,我将尝试简化我的目标,并添加我的所有vba,因为我的OP不清楚 我正在编写一个宏,用于根据一级、二级、BPO或企业的特定战略、毛利率范围和合同年确定佣金百分比。这将需要在最终产品中循环大约5000行数据。我一直在尝试嵌套多个If-Then语句来实现我的目标,但是它不起作用 下表列出了适用于每个策略的佣金率,以及我为这个嵌套If-then语句编写的代码 我们希望尽量简化这个过程,并将其循环到包含数据的所有行中。目标是让J列中的每个单元格返回一个佣金率,该佣金率由i列中的策略、D列中的年份和Z列中的

我将尝试简化我的目标,并添加我的所有vba,因为我的OP不清楚

我正在编写一个宏,用于根据一级、二级、BPO或企业的特定战略、毛利率范围和合同年确定佣金百分比。这将需要在最终产品中循环大约5000行数据。我一直在尝试嵌套多个If-Then语句来实现我的目标,但是它不起作用

下表列出了适用于每个策略的佣金率,以及我为这个嵌套If-then语句编写的代码

我们希望尽量简化这个过程,并将其循环到包含数据的所有行中。目标是让J列中的每个单元格返回一个佣金率,该佣金率由i列中的策略、D列中的年份和Z列中的GM确定。该策略有可能改变页面下的每一行。 创建自定义函数会更好吗

对于第一次编写宏的人来说,这是一项疯狂的任务。感谢所有我已经得到的反馈,并期待着任何其他想法的到来

我的代码:

其中第I列=策略

其中D列=年份

其中Z列=毛利

其中,第J列=If-Then的结果

其中,C列是定义的数据集,用于确定工作簿中的行数

子定义通信速率 最后一排一样长 LastRow=Range C&Rows.Count.EndxlUp.Row

If Sheet1.Range("I2") = "BPO" And Sheet1.Range("Z2") >= 0.24 Then
    If Sheet1.Range("D2") = 1 Then
        Sheet1.Range("J2") = 0.4
    Else
        If Sheet1.Range("D2") = 2 Then
            Sheet1.Range("J2") = 0.3
        Else: Sheet1.Range("J2") = 0.15
        End If
    End If
End If

If Sheet1.Range("I2") = "BPO" And Sheet1.Range("Z2") >= 0.21 And Sheet1.Range("Z2") < 0.24 Then
    If Sheet1.Range("D2") = 1 Then
        Sheet1.Range("J2") = 0.35
    Else
        If Sheet1.Range("D2") = 2 Then
            Sheet1.Range("J2") = 0.25
        Else: Sheet1.Range("J2") = 0.1
        End If
    End If
End If

If Sheet1.Range("I2") = "BPO" And Sheet1.Range("Z2") >= 0.18 And Sheet1.Range("Z2") < 0.21 Then
    If Sheet1.Range("D2") = 1 Then
        Sheet1.Range("J2") = 0.3
    Else
        If Sheet1.Range("D2") = 2 Then
            Sheet1.Range("J2") = 0.2
        Else: Sheet1.Range("J2") = 0.05
        End If
    End If
End If

If Sheet1.Range("I2") = "BPO" And Sheet1.Range("Z2") < 0.18 Then
    If Sheet1.Range("D2") = 1 Then
        Sheet1.Range("J2") = 0.25
    Else
        If Sheet1.Range("D2") = 2 Then
            Sheet1.Range("J2") = 0.15
        Else: Sheet1.Range("J2") = 0.05
        End If
    End If
End If

If Sheet1.Range("I2") = "Enterprise24" Then
    If Sheet1.Range("D2") = "1" Then
        Sheet1.Range("J2") = 0.4
    Else
        If Sheet1.Range("D2") = 2 Then
            Sheet1.Range("J2") = 0.3
        Else: Sheet1.Range("J2") = 0.15
        End If
    End If
End If

If Sheet1.Range("I2") = "Enterprise21" Then
    If Sheet1.Range("D2") = 1 Then
        Sheet1.Range("J2") = 0.35
    Else
        If Sheet1.Range("D2") = 2 Then
            Sheet1.Range("J2") = 0.25
        Else: Sheet1.Range("J2") = 0.1
        End If
    End If
End If

If Sheet1.Range("I2") = "Enterprise18" Then
    If Sheet1.Range("D2") = 1 Then
        Sheet1.Range("J2") = 0.3
    Else
        If Sheet1.Range("D2") = 2 Then
            Sheet1.Range("J2") = 0.2
        Else: Sheet1.Range("J2") = 0.05
        End If
    End If
End If

If Sheet1.Range("I2") = "Enterprise00" Then
    If Sheet1.Range("D2") = 1 Then
        Sheet1.Range("J2") = 0.25
    Else
        If Sheet1.Range("D2") = 2 Then
            Sheet1.Range("J2") = 0.15
        Else: Sheet1.Range("J2") = 0.05
        End If
    End If
End If

If Sheet1.Range("I2") = "Tier1" Then
    If Sheet1.Range("Z2") > 0.4 Then
        Sheet1.Range("J2") = 0.5
    Else
        If Sheet1.Range("Z2") <= 0.4 And Sheet1.Range("Z2") > 0.25 Then
            Sheet1.Range("J2") = (1 * Sheet1.Range("Z2")) + 0.1
        Else
            If Sheet1.Range("Z2") <= 0.25 And Sheet1.Range("Z2") > 0.075 Then
                Sheet1.Range("J2") = (2 * Sheet1.Range("Z2")) - 0.15
            Else
               If Sheet1.Range("Z2") <= 0.075 And Sheet1.Range("Z2") > 0 Then
                    Sheet1.Range("J2") = 0
               Else: Sheet1.Range("J2") = 0.5
               End If
            End If
        End If
    End If
End If

If Sheet1.Range("I2") = "Tier1-100" Then
    If Sheet1.Range("Z2") > 0.4 Then
        Sheet1.Range("J2") = 0.5
    Else
        If Sheet1.Range("Z2") <= 0.4 And Sheet1.Range("Z2") > 0.25 Then
            Sheet1.Range("J2") = (1 * Sheet1.Range("Z2")) + 0.1
        Else
            If Sheet1.Range("Z2") <= 0.25 And Sheet1.Range("Z2") > 0.075 Then
                Sheet1.Range("J2") = (2 * Sheet1.Range("Z2")) - 0.15
            Else
               If Sheet1.Range("Z2") <= 0.075 And Sheet1.Range("Z2") > 0 Then
                    Sheet1.Range("J2") = 0
               Else: Sheet1.Range("J2") = 0.5
               End If
            End If
        End If
    End If
End If

If Sheet1.Range("I2") = "Tier2" Then
    If Sheet1.Range("Z2") > 0.35 Then
        Sheet1.Range("J2") = 0.5
    Else
        If Sheet1.Range("Z2") <= 0.35 And Sheet1.Range("Z2") > 0.25 Then
            Sheet1.Range("J2") = (1 * Sheet1.Range("Z2")) + 0.15
        Else
            If Sheet1.Range("Z2") <= 0.25 And Sheet1.Range("Z2") > 0.05 Then
                Sheet1.Range("J2") = (2 * Sheet1.Range("Z2")) - 0.1
            Else
                If Sheet1.Range("Z2") <= 0.05 And Sheet1.Range("Z2") > 0 Then
                    Sheet1.Range("J2") = 0
                Else: Sheet1.Range("J2") = 0.5
                End If
            End If
        End If
    End If
End If


If Sheet1.Range("I2") = "Tier2-100" Then
    If Sheet1.Range("Z2") > 0.35 Then
        Sheet1.Range("J2") = 0.5
    Else
        If Sheet1.Range("Z2") <= 0.35 And Sheet1.Range("Z2") > 0.25 Then
            Sheet1.Range("J2") = (1 * Sheet1.Range("Z2")) + 0.15
        Else
            If Sheet1.Range("Z2") <= 0.25 And Sheet1.Range("Z2") > 0.05 Then
                Sheet1.Range("J2") = (2 * Sheet1.Range("Z2")) - 0.1
            Else
                If Sheet1.Range("Z2") <= 0.05 And Sheet1.Range("Z2") > 0 Then
                    Sheet1.Range("J2") = 0
                Else: Sheet1.Range("J2") = 0.5
                End If
            End If
        End If
    End If
End If

Sheet1.Range("J2").AutoFill Destination:=Sheet1.Range("J2:J" & LastRow)
Application.Calculate

End Sub

我将使用间接、索引、匹配和一些表格提供一种非VBA方法。我的想法是,不用在VBA中用硬编码的值对大量嵌套的IF进行编码,而应该能够用查找表进行编码。免责声明:这也是一个有趣的智力练习

首先,创建一个类似于您已有的佣金表的表,并在公式>名称管理器下将其命名为您的特定策略,例如BPO。我在一张名为Tables的单独表格上创建了我的。请注意,我使用了第1行中的1作为您的最大和不切实际的毛利率。我还分别在单元格B1、C1和D1中添加了1、2和3。您需要为其他策略创建类似的表,并将它们放在BPO表下

然后在数据选项卡的J列中,输入以下公式:=INDEXINDERDICTI2,MATCHZ2,INDIRECTI2&[&Z$1&],-1,MATCHD2,Tables$A$1:$D$1,1

该指数公式有3个主要部分:

INDIRECTI2-返回包含您命名为BPO的表的数组-因此您知道您正在查看适合该特定策略的表。 MATCHZ2,INDIRECTI2&[&Z$1&],-1-这将在Z列中对照BPO表查找您的毛利,在[毛利]列中查找。MATCH type的最后一个参数是-1,这意味着它会找到大于或等于毛利的最小值注意,在表中,毛利按降序排序。例如,如果您的毛利率为0.22,则匹配结果将返回0.2399。 对桌$A$1:$D$1,1-查找年份,并尝试查找小于或等于年份的最大值。因此,如果年份为1、2或3,则匹配将分别返回1、2或3,但如果年份大于3,则匹配将返回3。
第二个屏幕截图中的AB列和AC列只是2的结果。三,。包括以显示返回了正确的佣金值。请注意,年份栏不是第2年或第3年,而是BPO表中的第2列或第3列,即分别为第1年或第2年。

感谢所有的输入/反馈

由于需要合并的附加销售计划的复杂性增加,以及需要随时添加/删除销售计划的灵活性,我最终编写了一个自定义函数

Function Commissions(Strategy As String, GM As Variant, YR As Variant) As Variant


If Strategy = "BPO" And GM >= 0.24 And YR = 1 Then
    Commissions = 0.4
ElseIf Strategy = "BPO" And GM >= 0.24 And YR = 2 Then
    Commissions = 0.3
ElseIf Strategy = "BPO" And GM >= 0.24 And YR >= 3 Then
    Commissions = 0.15
ElseIf Strategy = "BPO" And GM >= 0.21 And GM < 0.24 And YR = 1 Then
    Commissions = 0.35
ElseIf Strategy = "BPO" And GM >= 0.21 And GM < 0.24 And YR = 2 Then
    Commissions = 0.25
ElseIf Strategy = "BPO" And GM >= 0.21 And GM < 0.24 And YR >= 3 Then
    Commissions = 0.1
ElseIf Strategy = "BPO" And GM >= 0.18 And GM < 0.21 And YR = 1 Then
    Commissions = 0.3
ElseIf Strategy = "BPO" And GM >= 0.18 And GM < 0.21 And YR = 2 Then
    Commissions = 0.2
ElseIf Strategy = "BPO" And GM >= 0.18 And GM < 0.21 And YR >= 3 Then
    Commissions = 0.05
ElseIf Strategy = "BPO" And GM < 0.18 And YR = 1 Then
    Commissions = 0.25
ElseIf Strategy = "BPO" And GM < 0.18 And YR = 2 Then
    Commissions = 0.15
ElseIf Strategy = "BPO" And GM < 0.18 And YR >= 3 Then
    Commissions = 0.05
''all other strategies continued below....''

End If
End Function

我没有看到任何循环,代码都指向特定的单元格,您没有解释它不工作的意思。请不要在注释中添加澄清。取而代之的是你的原始帖子,并在原始帖子中添加澄清。选项明确感谢你的反馈。我最初将此文件构建为索引匹配项和IfStatement公式,并将其向下拖动到所有单元格中。问题是,对于工作簿中的所有其他公式,即使向下拖动公式,也需要10分钟才能更新工作簿。再次讨论引用4个基础数据选项卡的5000行数据。我一定会试试你的想法!!选择的案例可能会更干净,而不是其他的汉克斯,我必须调查一下。我以前从未使用过Select Case。很抱歉,我在手机上看到这个,没有在屏幕上看到您的其他标准。ElseIf可能是更好的方式: