我的自定义函数使用代码运行成功,但使用公式返回#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:重构你的代码,并限定你所有的Range
和Cells
东西。 确保你永远不要使用ActiveSheet
或Activate
东西。 例如,上面的代码可以很容易地使用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议重构你的代码。 我似乎是一个相当大的项目,你需要坚持良好的实践规则,以保持可持续性,并避免更多的惊喜。