VBA立即窗口与应用程序运行时有什么不同?

我在VBA中遇到了一个非常奇怪的错误,并想知道是否有人可以解释一下吗?

我打电话给这样的工作表函数:

Dim lMyRow As Long lMyRow = WorksheetFunction.Match(vItemID, rngMyRange.Columns(1), 0) 

这是为了得到我通过的项目的行。在某些情况下(虽然我不能确切地什么时候),奇怪的事情发生在调用匹配function。

如果我在即时窗口执行该行,我得到以下内容:

 lMyRow = WorksheetFunction.Match(vItemID, rngMyRange.Columns(1), 0) ?lMyRow 10 

即查找工作,并且lMyRow得到分配给它的值。 如果我让这个语句在实际的代码中执行,我lMyRow得到0的值。

这似乎很奇怪! 我不明白如何在立即窗口中执行某些东西可以成功地分配一个值,在程序执行的同一点,同一个调用可以在代码中正常运行时赋值0。

我能想到的唯一的事情就是这是一些奇怪的转换,但是如果我分配的variables是一个int,一个double,甚至一个string,我会得到相同的行为。

我甚至不知道从哪里开始 – 帮助!

即时窗口和正常代码运行之间的唯一区别是范围。 即时窗口中的代码在当前的应用程序范围内运行。 如果没有任何东西在运行,这意味着全球范围。 放在VBA函数中的代码仅限于函数范围。

所以我的猜测是你的一个variables超出了范围。

我会在你的函数中放置一个断点,然后添加手表来找出哪个variables没有设置。

如果你的vba代码模块的顶部没有Option Explicit,你应该添加它。

您不分配函数名称,以便函数将始终返回零(如果您期望一个长)。 看来你应该有

makeTheLookup = lMyRow

在你的函数结束。

我不知道你是否还在看这个,但我会这样写:

 Function makeTheLookup(vItemID As Variant, rngMyRange as Range)as Long makeTheLookUp = WorksheetFunction.Match(vItemID, rngMyRange.Columns(1), 0) End Function 

我不能用Excel 2007重现问题。

这是我使用的代码:

 Sub test() Dim vItemID As Variant Dim lMyRow As Long Dim rngMyRange As Range Set rngMyRange = ActiveWorkbook.Sheets(1).Range("A1:Z256") vItemID = 8 lMyRow = WorksheetFunction.Match(vItemID, rngMyRange.Columns(1), 0) Debug.Print lMyRow End Sub 

这可能听起来很愚蠢,但是您确定Match函数的所有参数在您的macros和即时窗口中都是相同的吗? 也许范围对象已经改变?

谢谢你们的回答 – 我应该在下面打电话的时候稍微具体一些:

 Function makeTheLookup(vItemID As Variant, rngMyRange as Range) Dim lMyRow As Long lMyRow = WorksheetFunction.Match(vItemID, rngMyRange.Columns(1), 0) End Function 

奇怪的是,我将这两个parameter passing给函数,所以我不能看到它们在函数内部和外部的不同。 也就是说,我还是完全无能为力,尤其是因为这是一个间歇性的问题

是否有任何简单的方法比较函数上下文中的范围对象到即时窗口上下文中的范围对象,并告诉它们是否不同? 鉴于范围是一个引用types,感觉就像我应该能够比较两个指针,但我不知道如何在VBA中做到这一点!

顺便说一句,我正在使用Excel 2007,但我不确定这是否有所作为。

如上所述,这绝对是一个范围问题。 或一个朦胧的Bug。

我会尝试使用Debug.print语句以及Watch,并查看它们是否匹配,然后从中取出。