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

时间:2008-12-08 17:21:42

标签: excel vba excel-vba

我在VBA遇到了一个非常奇怪的错误,并想知道是否有人可以解决一些问题?

我正在调用这样的工作表函数:

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

这是为了获取我传入的项目的行。在某些情况下(虽然我无法准确确定何时),但是对匹配函数的调用会发生奇怪的事情。

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

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

即。查找工作,lMyRow获取分配给它的值。如果我让该语句在实际代码中执行,那么lMyRow的值为0。

这看起来很奇怪!我不明白在即时窗口中执行某些操作是否可以成功分配一个值,同一个调用,在程序执行的同一点,当它在代码中正常运行时可以给出值0!

我唯一能想到的是它是一些奇怪的转换事物,但如果我指定的变量是int,double或甚至是字符串,我会得到相同的行为。

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

6 个答案:

答案 0 :(得分:2)

立即窗口和正常代码运行之间的唯一区别是范围。 即时窗口中的代码在当前应用程序范围内运行。 如果当前没有任何操作,则表示全局范围。 放入VBA函数时的代码仅限于函数范围。

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

我会在你的函数中放置一个断点并添加监视以找出未设置的变量。

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

答案 1 :(得分:2)

您没有指定函数名称,因此函数将始终返回零(如果您期望Long)。看来你应该

makeTheLookup = lMyRow

在你的功能结束时。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

我无法使用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功能的所有参数在您的宏和即时窗口中都是相同的吗?也许范围对象已经改变了?

答案 4 :(得分:0)

感谢答案的人 - 我应该在下面的电话会议中稍微具体一点:

Function makeTheLookup(vItemID As Variant, rngMyRange as Range)

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

End Function

奇怪的是,我将两个参数传递给函数,所以我看不出它们在函数内外的任何不同方式。也就是说,对于造成这种情况的原因,我仍然完全无能为力,特别是因为这是一个非常间歇性的问题

有没有简单的方法可以将函数上下文中的范围对象与立即窗口上下文中的范围对象进行比较,并告诉它们是否不同?鉴于范围是一个引用类型,感觉我应该只能比较两个指针,但我不知道如何在VBA中做到这一点!

我正在使用Excel 2007,虽然我不确定这是否有所不同。

答案 5 :(得分:0)

如上所述,它绝对是一个范围问题。或者是一个模糊的Bug。

我会尝试使用 Debug.print 语句以及Watch,看看它们是否匹配,然后从那里开始。