我创建了一个函数来获取具有给定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
答案 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
方法无效,完全忽略!
解决方案:重构代码并限定所有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
目前这可能是一项繁琐的任务,但我强烈建议重构您的代码。我似乎是一个非常大的项目,你需要坚持良好的实践规则,以使其可维护,并避免进一步的意外。