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