【问题标题】:My Custom Function Runs Successfully With Code, But With Formula Returns #VALUE我的自定义函数使用代码成功运行,但使用公式返回 #VALUE
【发布时间】:2017-05-15 10:31:55
【问题描述】:

我创建了一个函数来获取具有给定产品编号的产品属性。

当我从模块运行时它成功运行,但不是从公式运行。

功能(已编辑):

Public Function ÖZELLİKGETİR(İsim As String, Özellik As String) As String
    Dim Okunan() As Römork
    Okunan() = VERİGETİR()

    Dim i
    MsgBox UBound(VERİGETİR()) '0
    ReDim Preserve Okunan(UBound(VERİGETİR()) + 1)
    MsgBox "Reached" 'Even this is not reached
    For i = 0 To UBound(Okunan())
    If Not Okunan(i) Is Nothing Then
    MsgBox "Reached"
        If Okunan(i).ÜrünKodu = İsim Then
        MsgBox "Reached"
            ÖZELLİKGETİR = CallByName(Okunan(i), Özellik, VbGet)
            Exit Function
        End If
    End If
    Next i

End Function

其他部分真的很长,因为它与宏一起使用;我不需要包括那些。

我的工作宏:

Sub T()
    ÖZELLİKGETİR("NM 511.136","ÜrünKodu") 'Returns "NM 511.136"
End Sub

公式:

=ÖZELLİKGETİR("NM 511.136";"ÜrünKodu") Returns #VALUE

如果您需要其他部分,请使用电子表格: Link

【问题讨论】:

  • 首先将Option Explicit 放在所有模块的开头。这将迫使您显式声明所有变量,并可能导致您遇到问题。 (而且你应该设置Tools/References 来要求它)。如果这没有帮助,请在 UDF 中的每一行上放置断点以查看失败的位置。 UDF 本身没有返回错误;相反,它更有可能来自代码中的“坏行”。一种可能性是,当从工作表调用 UDF 时,VERİGETİR 在代码中没有值。
  • 天哪!变量 i 未定义!谢谢老兄,我搜索了两个多小时。
  • @RonRosenfeld 但是......它仍然是#VALUE
  • 如果你设置了Option Explicit,那么继续我评论中的第二步。
  • 在 Excel 中,UDF(称为单元格公式的函数)无法完成普通函数所能做的所有事情,请参阅 support.microsoft.com/en-us/kb/170787

标签: excel vba function macros formula


【解决方案1】:

我不得不查看您的工作簿以了解问题所在。对于不会说您的语言的人来说有点困难:)

嗯,毕竟,这是由于@RonRosenfeld 和@AxelRichter 指出的:用户定义函数(UDF)有限制。

在您的 VBA 代码中,您对ActiveSheet 计数很多,并且您使用了不合格的范围。例如,在您的函数VERÝGETÝR 中,您以Sheets("Veri Sayfasý").Activate 开头;然后你用不合格的Cells(r, c) 调用许多函数。

看看这里:

    In Sub  VERÝGETÝR(...)
        Sheets("Veri Sayfasý").Activate
        ...
        Set vRömork.DingilSayýsý = MetinOluþtur(Cells(2, i), Cells(2, i + 1))
        Set vRömork.Ton = MetinOluþtur(Cells(3, i), Cells(3, i + 1))
        Set vRömork.En = SayýOluþtur(Cells(4, i), Cells(4, i + 1))
        ...

所有这些都适用于普通的 VBA,尽管甚至不推荐。 (专业人士不应该使用Activate 的东西,除非真的有必要,我几乎从来没有发现我们无法避免的情况)。但是,在 UDF 中,Activate 方法无效,它被完全忽略

解决方案:重构您的代码并限定您的所有 RangeCells 内容。确保你从不使用ActiveSheetActivate 的东西。例如,您上面的代码可以使用With 子句而不是Activate 轻松重写:

       With Sheets("Veri Sayfasý") // <~~ no need to activate, just a With
           Set vRömork.DingilSayýsý = MetinOluþtur(.Cells(2, i), .Cells(2, i + 1))
           Set vRömork.Ton = MetinOluþtur(.Cells(3, i), .Cells(3, i + 1))
           Set vRömork.En = SayýOluþtur(.Cells(4, i), .Cells(4, i + 1))
           ...
       End with

目前这可能是一项乏味的任务,但我强烈建议重构您的代码。我似乎是一个相当大的项目,您需要坚持良好的实践规则才能使其可维护并避免进一步的意外。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    相关资源
    最近更新 更多