【发布时间】:2016-09-19 18:49:47
【问题描述】:
我已阅读有关 UDF #VALUE 错误的线程,似乎我对 VBA 的了解不够,无法使用它们,或者我遇到的问题不一样。
无论哪种方式,我都在尝试根据我创建的公式以 YY:MM 格式创建一个 UDF 来计算一个年龄的月数。
Function TOTALMONTHS(YearsMonths As String)
Colonz = WorksheetFunction.Find(":", YearsMonths)
Yearz = Left(YearsMonths, Colonz - 1)
Monthz = Mid(YearsMonths, Colonz + 1, Lengthz - Colonz)
Lengthz = Len(YearsMonths)
TOTALMONTHS = Yearz * 12 + Monthz
End Function
上述代码在 Excel 2010 中实现时返回 #VALUE 错误。
任何关于我所犯错误的帮助将不胜感激!
谢谢!
编辑:
我正在尝试使用 If 块来满足开头包含“>”的年龄。 例如,8:6 和 >8:6。我想我一开始可能会在 search=1 结果中得到误报,但不知道为什么。
Function TOTALMONTHS(YearsMonths As String) As Integer
If WorksheetFunction.Search(">", YearsMonths) = 1 Then
Greaterz = 2
Else
Greaterz = 1
End If
Colonz = WorksheetFunction.Find(":", YearsMonths)
Yearz = Mid(YearsMonths, Greaterz, Colonz - Greaterz)
monthz = Right(YearsMonths, Len(YearsMonths) - Colonz)
TOTALMONTHS = Yearz * 12 + monthz
End Function
我不知道如何做“如果”位,也无法弄清楚如何将代码放在下面的评论中......在此先感谢!
使用下面的答案解决了 - 非常感谢!
这是允许“:”或“。”的最终代码。分隔符和“>”符号也是如此:
Function TOTALMONTHS(YearsMonths As String) As Integer
Dim Colonz As Integer, Yearz As Integer, monthz As Integer, Greaterz As Integer
' check if the stings consists of ">" sign
If InStr(YearsMonths, ">") >= 1 Then
Greaterz = 2
Else
Greaterz = 1
End If
' check position of ":" or "." sign
If InStr(YearsMonths, ":") >= 1 Then
Colonz = InStr(YearsMonths, ":")
Else
Colonz = InStr(YearsMonths, ".")
End If
Yearz = Mid(YearsMonths, Greaterz, Colonz - Greaterz)
monthz = Right(YearsMonths, Len(YearsMonths) - Colonz)
TOTALMONTHS = Yearz * 12 + monthz
End Function
【问题讨论】:
-
Lengthz在Monthz = Mid(YearsMonths, Colonz + 1, Lengthz - Colonz)行中为 0,因为您尚未设置该值。 -
你不希望它返回一些东西吗?喜欢
Function TOTALMONTHS(YearsMonths As String) as Long? -
我希望它返回整数个月 - 谢谢你,我现在就试试这两个!
-
非常感谢你们俩!它有效!
-
@GLDevlin 你可以回答你自己的帖子,用你的工作代码写下来
标签: vba excel user-defined-functions udf