Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA即时窗口与应用程序运行时有何不同?_Vba_Excel - Fatal编程技术网

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

VBA即时窗口与应用程序运行时有何不同?,vba,excel,Vba,Excel,我在VBA中遇到了一个非常奇怪的错误,我想知道是否有人可以解释一下 我调用的工作表函数如下: Dim lMyRow As Long lMyRow = WorksheetFunction.Match(vItemID, rngMyRange.Columns(1), 0) 这是为了获取我传入的项目的行。在某些情况下(尽管我不能确定确切的时间),对Match函数的调用会发生奇怪的事情 如果在即时窗口中执行该行,则会得到以下结果: lMyRow = WorksheetFunction.Match(vIt

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

我调用的工作表函数如下:

Dim lMyRow As Long
lMyRow = WorksheetFunction.Match(vItemID, rngMyRange.Columns(1), 0)
这是为了获取我传入的项目的行。在某些情况下(尽管我不能确定确切的时间),对Match函数的调用会发生奇怪的事情

如果在即时窗口中执行该行,则会得到以下结果:

lMyRow = WorksheetFunction.Match(vItemID, rngMyRange.Columns(1), 0)
?lMyRow
10
i、 e.查找工作正常,lMyRow获得一个分配给它的值。如果让该语句在实际代码中执行,则lMyRow的值为0

这似乎很奇怪!我不明白在即时窗口中执行某些东西如何能够成功地赋值,在程序执行的同一点上,当它在代码中正常运行时,相同的调用可以给出0的值

我能想到的唯一一件事是,这是一些奇怪的强制转换,但如果我分配给的变量是int、double甚至字符串,我会得到相同的行为


我甚至不知道从哪里开始-救命

我无法用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

这听起来可能很愚蠢,但您确定匹配函数的所有参数在宏和即时窗口中都是相同的吗?可能范围对象已更改?

我无法用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

这听起来可能很愚蠢,但您确定匹配函数的所有参数在宏和即时窗口中都是相同的吗?可能范围对象已更改?

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

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

我会在这一行的函数中设置一个断点,并添加手表,以找出未设置的变量


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

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

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

我会在这一行的函数中设置一个断点,并添加手表,以找出未设置的变量


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

感谢各位的回答-我应该在下面的通话中稍微具体一点:

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,但我不确定这是否有什么不同。

谢谢各位的回答-我应该在打电话的方式上稍微具体一点:

Function makeTheLookup(vItemID As Variant, rngMyRange as Range)

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

End Function
奇怪的是,我将这两个参数传递到函数中,所以我看不出它们在函数内部和外部有任何不同。也就是说,我仍然完全不知道是什么导致了这一问题,特别是因为这是一个真正的间歇性问题

有没有简单的方法可以比较函数上下文中的范围对象和即时窗口上下文中的范围对象,并判断它们是否不同?考虑到范围是一个引用类型,我觉得我应该能够比较两个指针,但我不知道如何在VBA中做到这一点


顺便说一句,我正在使用Excel2007,虽然我不确定这是否会有什么不同。

正如will在上面提到的,这显然是一个范围问题。或者是一只模糊的虫子


我会尝试使用
Debug.print
语句,并观察它们是否匹配,然后从那里开始执行。

正如will上面提到的,这显然是一个范围问题。或者是一只模糊的虫子


我会尝试使用
Debug.print
语句,并观察它们是否匹配,然后从那里开始执行。

您没有分配函数名,因此函数将始终返回零(如果您希望长时间运行)。看来你应该

makeTheLookup=lMyRow


在函数结束时。

您没有指定函数名,因此函数将始终返回零(如果您希望长时间运行)。看来你应该

makeTheLookup=lMyRow


在你的函数结束时。

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

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

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

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

是的,这是一个有趣的例子——99.9%的时间里,这个电话是有效的,当它失败时,我无法确定区别是什么!是的,这是一个有趣的例子——99.9%的时间里,这个电话是有效的,当它失败时,我无法确定区别是什么!打电话怎么样?从即时窗口打开Lookup vItemID,rngMyRange?这是否有效(您应该让函数返回找到的值,但在您的示例中并非如此)?调用如何?从