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

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

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

function(编辑):

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 

其他部分是非常长的,因为它与macros观工作; 我不需要包括那些。

我的工作macros:

 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 

电子表格如果您需要其他部分: 链接

我不得不看看你的工作簿,以了解发生了什么问题。 对于那些不会说你的语言的人来说有点难过:)

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

在你的VBA代码中,你在ActiveSheet上计数很多 ,并使用不合格的范围。 例如,在你的function中,你可以从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,虽然它甚至不build议。 (专业人士不应该使用Activate东西,除非真的有必要,我几乎从来没有发现一种我们无法避免的情况)。 但是,在UDF里面, Activate方法没有效果, 完全被忽略

解决scheme:重构你的代码,并限定你所有的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 

这可能是一个乏味的任务,但我强烈build议重构你的代码。 我似乎是一个相当大的项目,你需要坚持良好的实践规则,以保持可持续性,并避免更多的惊喜。