excel - VBA excel函数
问题描述
我需要制作一个 Excel 宏,它采用三角形边长并确保它存在,如果它需要输出它是什么类型的三角形。
每当我输入 values和a = 2
时,它应该是一个等边三角形,但它输出为一个等腰三角形。b = 2
c = 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
解决方案
Case
块从上到下评估,哪个分支首先匹配条件(即哪个是第一个True
)将是获胜条件。
因此,您应该首先评估受约束最大的规则,最后评估受约束较少的规则 - 这意味着您需要在检查等腰三角形之前检查等边三角形,因为等边三角形也是等腰三角形,正如 Warcupine 已经指出的那样。
但是等边条件有一个问题:
Case a = b = c
VBA 将评估a = b
为一个Boolean
表达式,然后取其结果并将其与c
- 所以如果c
是任何非零值,如果两者相等,a = b = c
则将True
不管c
(假设非零)的值。a
b
如果该函数打算用作 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
推荐阅读
- javascript - javascript类构造函数初始化数组
- python - 在 Flask 应用程序中的视图 (html) 上显示 pyfolio 输出
- python - 如何去除图像中的显示器闪烁噪声?
- swift - Swift Combine - 数组上的前缀发布者
- json - 如何为jq中的每个内部数组元素打印对象元素
- python - 更改熊猫列中的值:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame error
- here-api - 提高 HERE.com 地理编码器的精度
- reactjs - React、DotNet 核心本地化
- c# - Tcp xml 通信 C#
- powerbi - Power BI:度量未忽略切片器筛选器