代码之家  ›  专栏  ›  技术社区  ›  Jon Artus

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

  •  0
  • Jon Artus  · 技术社区  · 15 年前

    我在vba中遇到了一个非常奇怪的错误,我想知道是否有人可以发出一些光?

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

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

    这是为了得到我传递的项目的行。在某些情况下(虽然我不能确定确切的时间),对match函数的调用会发生奇怪的事情。

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

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

    也就是说,查找工作正常,lmyrow得到一个分配给它的值。如果让该语句在实际代码中执行,则lmyrow的值为0。

    这看起来很奇怪!我不明白在即时窗口中执行某个东西如何能成功地分配一个值,当它在代码中正常运行时,在程序执行的同一点上的同一个调用可以给它一个值0!

    我唯一能想到的是,这是一个奇怪的选择,但是如果我要分配的变量是int、double或甚至是string,我也会有同样的行为。

    我都不知道从哪里开始-救命!!

    6 回复  |  直到 11 年前
        1
  •  2
  •   Will Rickards    15 年前

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

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

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

    如果在vba代码模块的顶部没有option explicit,则应该添加它。

        2
  •  2
  •   Dick Kusleika    15 年前

    您没有分配函数名,因此该函数将始终返回零(如果您期望的是long)。看来你应该

    makeTheLookup = lMyRow

    在你的功能结束时。

        3
  •  1
  •   Gaffi jusathr    12 年前

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

    Function makeTheLookup(vItemID As Variant, rngMyRange as Range)as Long
        makeTheLookUp = WorksheetFunction.Match(vItemID, rngMyRange.Columns(1), 0)
    End Function
    
        4
  •  0
  •   Dirk Vollmar    15 年前

    我无法用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函数的所有参数在宏和即时窗口中都是相同的吗?可能范围对象已更改?

        5
  •  0
  •   Jon Artus    15 年前

    谢谢你们的回答-我应该在打电话的方式上说得更具体一点:

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

    奇怪的是,我把这两个参数传递到函数中,所以我看不出函数内外有什么不同。也就是说,我仍然完全不知道这是什么原因造成的,特别是因为这是一个非常间歇性的问题

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

    顺便说一句,我正在使用excel 2007,不过我不确定这是否有什么区别。

        6
  •  0
  •   Devdatta Tengshe    15 年前

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

    我会尽量利用 调试打印 陈述,还有观察,看它们是否匹配,然后从那里拿出来。

    推荐文章