【问题标题】:VBA UDF Excel 2010 #VALUEVBA UDF Excel 2010 #VALUE
【发布时间】: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

【问题讨论】:

  • LengthzMonthz = Mid(YearsMonths, Colonz + 1, Lengthz - Colonz) 行中为 0,因为您尚未设置该值。
  • 你不希望它返回一些东西吗?喜欢Function TOTALMONTHS(YearsMonths As String) as Long ?
  • 我希望它返回整数个月 - 谢谢你,我现在就试试这两个!
  • 非常感谢你们俩!它有效!
  • @GLDevlin 你可以回答你自己的帖子,用你的工作代码写下来

标签: vba excel user-defined-functions udf


【解决方案1】:

试试下面更新的 UDF 代码:

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 ":" sign
Colonz = InStr(YearsMonths, ":")

Yearz = Mid(YearsMonths, Greaterz, Colonz - Greaterz)
monthz = Right(YearsMonths, Len(YearsMonths) - Colonz)
TOTALMONTHS = Yearz * 12 + monthz

End Function

您可以在下面找到我测试此 UDF 代码的数据示例:

(请记住,B 和 E 列中的单元格需要格式化为文本)

【讨论】:

  • 传奇!非常感谢您的帮助!它现在完美运行!你的建议很有帮助,我觉得我学到了很多!
猜你喜欢
  • 2011-05-09
  • 2020-03-24
  • 2014-05-26
  • 2019-01-10
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多