首页 > 解决方案 > VBA excel函数

问题描述

我需要制作一个 Excel 宏,它采用三角形边长并确保它存在,如果它需要输出它是什么类型的三角形。

每当我输入 values和a = 2时,它应该是一个等边三角形,但它输出为一个等腰三角形。b = 2c = 2

任何帮助表示赞赏!

Public Function triangle(a, b, c) As String
Select Case True
Case a + b <= c Or a + c <= b Or c + b <= a
triangle = "Doesnt exist"
Case a = b Or c = b Or a = c
triangle = "Isosceles"
Case (a + b) ^ 2 = c ^ 2 Or (b + c) ^ 2 = b ^ 2 Or (c + a) ^ 2 = a ^ 2
triangle = "right triangle"
Case a = b = c
triangle = "Equilateral"
Case Else
triangle = "Regular triangle"

End Select

MsgBox triangle

End Function

标签: excelvba

解决方案


Case块从上到下评估,哪个分支首先匹配条件(即哪个是第一个True)将是获胜条件。

因此,您应该首先评估受约束最大的规则,最后评估受约束较少的规则 - 这意味着您需要在检查等腰三角形之前检查等边三角形,因为等边三角形也是等腰三角形,正如 Warcupine 已经指出的那样

但是等边条件有一个问题:

Case a = b = c

VBA 将评估a = b为一个Boolean表达式,然后取其结果并将其与c- 所以如果c是任何非零值,如果两者相等,a = b = c则将True不管c(假设非零)的值。ab

如果该函数打算用作 UDF,请考虑避免MsgBox调用,并返回 aVariant以便在输入无效的情况下产生实际的 Excel 单元格错误值 - 请注意,您所谓的“正三角形”可能属于不等边三角形

Public Function TriangleType(ByVal a As Double, ByVal b As Double, ByVal c As Double) As Variant
    If a <= 0 Or b <= 0 Or c <= 0 Then
        TriangleType = CVErr(xlErrValue)
        Exit Function
    End If

    Select Case True
        Case a + b <= c Or a + c <= b Or c + b <= a
            TriangleType = CVErr(xlErrValue)

        Case a = b And b = c And c = a
            TriangleType = "Equilateral"
        Case a = b Or c = b Or a = c
            TriangleType = "Isosceles"
        'Case (a + b) ^ 2 = c ^ 2 Or (b + c) ^ 2 = b ^ 2 Or (c + a) ^ 2 = a ^ 2
        Case a ^ 2 + b ^ 2 = c ^ 2 Or b ^ 2 + c ^ 2 = a ^ 2 Or c ^ 2 + a ^ 2 = b ^ 2
            TriangleType = "Right Triangle"

        Case Else
            TriangleType = "Scalene Triangle"
    End Select

End Function

推荐阅读