2012-02-05 11 views
1

我已经创建了一个类模块,我在其中定义了一个函数。无论何时调用该函数,它都会在本地窗口中列出两次。只有第二个值的变化,第一个值根据其类型保持为空或“零”,直到代码执行结束。我在标准模块中定义的函数没有这个问题。我做错了什么,这是一个错误,还是有这背后的逻辑原因?为什么我的函数名在“locals”窗口中出现两次?

所述的TestClass类模块的内容:标准模块的

Public Value As Double 

Function AddFive() As Double 
    AddFive = Me.Value + 5 
End Function 

内容:

Sub TestSub() 
    Dim TestObject As New TestClass 
    TestObject.Value = 2 
    MsgBox TestObject.AddFive 
End Sub 

下面是一个屏幕截图示出了,当执行该代码行由在函数的代码执行后,函数的值在本地窗口中列出两次,并且只有第二个值已经更改。

(link to screenshot)

我使用VBA的Excel 2010中

在此先感谢。

+0

请发表您的代码。 – brettdj 2012-02-05 02:52:48

+1

VBA函数中有一个与函数名称相同的隐式变量。你在你的片段中分配的那个。变化的是隐式变量,不是实际函数的返回值,只有在退出函数后才进行计算。 – 2012-02-05 16:36:56

+0

如果函数是在标准模块中定义的,则函数的返回值不会出现在本地窗口中。为什么只有隐含变量出现? – Cutter 2012-02-05 16:46:44

回答

0

这个问题更多的是你如何做。如果你有一个函数只是将5添加到一个类对象的内部变量中,那么它在技术上就是一个void(VBA中的Sub),因为你不需要返回值。

你的代码应该是:

CLASS

Public Value As Double 

Sub AddFive() 
    Me.Value = Me.Value + 5 
End Sub 

MODULE

Sub test() 

Dim testObject As New TestClass 
testObject.Value = 2 
testObject.AddFive 

MsgBox testObject.Value 

End Sub 

我可以想像可能有多种原因有创建2个变量的原因,但是我觉得自从你这么做以后,为什么会出现意想不到的行为是没有意义的e做错误的代码。

如果你愿意,你甚至可以编写类函数,它会在msgbox中显示它的值为+ 5,这也不会创建额外的变量。但这很奇怪,我想你想要上面的代码。但在这里它是不分:

CLASS

Public Value As Double 

Sub ShowPlusFive() 
    MsgBox Me.Value + 5 
End Sub 

MODULE

Sub test() 

Dim testObject As New TestClass 
testObject.Value = 2 

testObject.ShowPlusFive 

End Sub 
+0

为了简单起见,我选择了这个例子。我不想避免创建第二个变量,我试图理解为什么创建它。 – Cutter 2012-02-07 11:34:28

+0

我的猜测是VBA在模块中使用了一个变量(MsgBox需要返回一些变量),并且类函数还创建了一个返回值(最终传递给模块中的MsgBox的那个)。在你的类函数中传递返回值之前,最可能是0的模块之一。这只是一个猜测,而且这个例子有点时髦,因为你通常不会在msgbox调用中使用带有返回值的函数。 – aevanko 2012-02-07 16:07:07

+0

我想象一下msgbox在碰到MsgBox行时隐式创建变量,因为它知道它需要某处到temp。存储返回值,并且类函数将创建它自己的返回值变量,因为它应该与类成员关联(它不会只是捎带并使用由主模块中的MsgBox调用创建的temp变量) 。这就可以解释为什么你不在普通模块中这种行为(类成员函数可能是这样设置的)。 – aevanko 2012-02-07 16:10:08

相关问题