使用IF,AND和OR语句不重复Excel中的代码

时间:2018-02-01 05:54:40

标签: python excel vba

我正试图找出在excel中使用IF语句的最有效方法。我知道我希望我的代码看起来像是Python,但我在excel中苦苦挣扎。

继承我在excel中的代码,它可以工作并做我想要的事情:

=IFS((AND(B4="Fall", C4="Triple")), 2190, (AND(B4="Fall", C4="Double")), 2731, (AND(B4="Fall", C4="Single")), 3175,
 AND(B4="Winter", C4="Triple"), 1902,  AND(B4="Winter", C4="Double"), 2372,  AND(B4="Winter", C4="Single"), 2757,
  AND(B4="Spring", C4="Triple"), 1671, AND(B4="Spring", C4="Double"), 2084, AND(B4="Spring", C4="Single"), 2423,
 ISBLANK(B4), "Pick A quarter", ISBLANK(C4), "Pick A dorm style")

正如你所看到的,有许多东西重复而且是不必要的。这使得阅读变得困难,并且很难打字。特别是因为我必须对AND()语句和结果中的第二个参数进行非常小的更改才能做同样的事情。

以下是我希望代码等同于的内容。

B4 = "Fall"
C4 = "Double"

if (B4=="Fall"):
    if (C4 == "Triple"):
        print(2190)
    if (C4 == "Double"):
        print(2731)
    if (C4 == "Single"):
        print(3175)
elif (B4 == "Winter"):
    if (C4 == "Triple"):
        print(1902)
    if (C4 == "Double"):
        print(2372)
    if (C4 == "Single"):
        print(2757)
elif (B4 == "Spring"):
    if (C4 == "Triple"):
        print(1671)
    if (C4 == "Double"):
        print(2084)
    if (C4 == "Single"):
        print(2423)
else:
    print("...")

现在可以肯定的是,这段代码仍然不是很好,似乎会有一个更好,更短,更有效的方式来编写它。但它得到了重点。 (如果有一种方法可以在python中创建它并从python代码更改excel单元格,那就太酷了)。有人有想法吗?

4 个答案:

答案 0 :(得分:5)

最常见的Excel解决方案是使用帮助程序表并使用INDEX - MATCH

示例:

enter image description here

B5中的公式:

=INDEX($F$3:$H$5,MATCH(B4,$E$3:$E$5,0),MATCH(C4,$F$2:$H$2,0))

帮助程序表可以位于可以隐藏的单独工作表上。所以它不可见。

答案 1 :(得分:4)

您可以从公式中调用驻留在工作簿中的VBA函数,将两个输入单元格作为参数传递。

使用以下代码在VBA IDE中添加模块:

Function GetRate(season As String, size As String)
    If season = "Fall" Then
        If size = "Triple" Then
            GetRate = 2190
        ElseIf size = "Double" Then
            GetRate = 2731
        ElseIf size = "Single" Then
            GetRate = 3175
        End If
    ElseIf season = "Winter" Then
        If size = "Triple" Then
            GetRate = 1902
        ElseIf size = "Double" Then
            GetRate = 2372
        ElseIf size = "Single" Then
            GetRate = 2757
        End If
    ElseIf season = "Spring" Then
        If size = "Triple" Then
            GetRate = 1671
        ElseIf size = "Double" Then
            GetRate = 2084
        ElseIf size = "Single" Then
            GetRate = 2423
        End If
    Else
        GetRate = "..."
    End If
End Function

注意:我真的很快就将你的python代码翻译成了VBA。我不会深入研究所述代码的质量,因为它似乎超出了这个问题的范围。 (它并不坏,但可能会有所改善。)

在单元格公式中调用函数并将两个单元格引用作为参数传递:

=GetRate(A1, B1)

必须使用文件类型" Excel启用宏的工作簿(* .xlsm)"保存工作簿。如果您没有,它会发出警告,如果您忽略警告并保存为正常的.XLS文件,您将丢失模块和代码。

答案 2 :(得分:1)

我不了解excel,但是这个Python代码:

if (B4=="Fall"):
    if (C4 == "Triple"):
        print(2190)
    if (C4 == "Double"):
        print(2731)
    if (C4 == "Single"):
        print(3175)
elif (B4 == "Winter"):
    if (C4 == "Triple"):
        print(1902)
    if (C4 == "Double"):
        print(2372)
    if (C4 == "Single"):
        print(2757)
elif (B4 == "Spring"):
    if (C4 == "Triple"):
        print(1671)
    if (C4 == "Double"):
        print(2084)
    if (C4 == "Single"):
        print(2423)
else:
    print("...")

与这个更好的Python代码大致相同:

print {
    ("Fall", "Triple"): 2190,
    ("Fall", "Double"): 2731,
    ("Fall", "Single"): 3175,
    ("Winter", "Triple"): 1902,
    ("Winter", "Double"): 2372,
    ("Winter", "Single"): 2757,
    ("Spring", "Triple"): 1671,
    ("Spring", "Double"): 2084,
    ("Spring", "Single"): 2423,
}.get((B4, C4), '...')

答案 3 :(得分:0)

似乎案例陈述可能有效......

以下是其工作原理的链接。

https://www.tutorialspoint.com/vba/vba_switch_statement.htm

干杯。