【问题标题】:User defined function returns #REF in worksheet, works in VBA用户定义的函数在工作表中返回#REF,在 VBA 中工作
【发布时间】:2016-08-10 12:31:30
【问题描述】:

我正在尝试编写一个简单的 UDF,它可以告诉我货币代码是否为 G10。当我在 VBA 的子程序中测试它时它工作正常,但是当我尝试在电子表格中使用它时,我得到 #REF。

Function IsG10(Cur As Range) As Boolean

  Dim G10s As Variant
  Dim Rslt As Boolean
  Dim Cross As Variant

 Cross = Cur.Value
 Rslt = False

 G10s = Array("USD", "GBP", "EUR", "CHF", "NOK", "SEK", "AUD", "NZD", "CAD", "JPY")

If Not (Application.WorksheetFunction.IsText(Cross)) Or Len(Cross) > 3 Then
    IsG10 = CVErr(xlErrNA)
Else
    For Each i In G10s
        If Cross = i Then Rslt = True
    Next i
End If

IsG10 = Rslt

End Function

这是我用来测试的 Sub:

Sub Test()

 Dim TC As Range
 Dim ans As Variant
 Set TC = Range("Y53")

 ans = IsG10(TC)

End Sub

我已经尝试了很多方法让它工作,删除了错误处理,返回一个字符串而不是一个布尔值......没有任何效果。我看不到任何明显的 UDF 错误。

谢谢!

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    您需要重命名函数。 ISG10 是有效的单元格地址,因此当您将公式放入像 =ISG10(A1) 这样的单元格中时,Excel 无法正确解析它。当我将其更改为 Function Foobar(Cur As Range) As Boolean 时,它工作得很好。

    【讨论】:

    • 您可以通过 Excel 将 =IsG10(...) 更改为 =ISG10(...) 并全部大写来获得提示。
    • 如果完全限定为=Module1.ISG10(C3) 将起作用,其中module1 是存储函数的模块名称。当然不是真正的解决方案。
    • 好收获@Comintern
    • FWIW,为了获得更好的性能,请在Rslt = True 之后添加: Exit For。 (+1)
    • 嗯,另一个理由避免使用带有数字后缀的神秘无意义的名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2011-06-06
    • 2018-09-14
    • 1970-01-01
    • 2013-12-25
    相关资源
    最近更新 更多