我的自定义函数使用代码成功运行,但使用公式返回#VALUE

时间:2016-12-31 11:17:34

标签: excel vba function macros formula

我创建了一个函数来获取具有给定Product-Number的产品属性。<​​/ p>

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

功能(已编辑):

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

1 个答案:

答案 0 :(得分: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

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