【问题标题】:VBA: Run time error '91'?VBA:运行时错误'91'?
【发布时间】:2013-09-20 23:30:01
【问题描述】:

我在这里要做的只是保存对当前活动窗口的引用,但它似乎不起作用。它在最后一行给了我一个运行时错误。

Dim SourceWindow As Window, QACheckWindow As Window
SourceWindow = ActiveWindow

我不确定为什么。 ActiveWindow 不应该返回当前活动的窗口吗?如果没有,我该如何引用它?

编辑:上面是我函数的开头,所以之前的都是Sub FuncName()

【问题讨论】:

  • 不应该是Set SourceWindow = ActiveWindow吗?
  • 啊哈!是的,我并没有像看起来那样使用VB。谢谢。
  • VBA run time error 91 的可能重复项

标签: vba


【解决方案1】:

在 VB 中,对象变量需要分配 Set 关键字。作为对象的对象属性也需要为Set。当分配不使用该关键字时,会引发运行时错误 91“未设置对象变量”。

这是继承自旧的Let 关键字以分配,以及Set 关键字以分配引用Let 最终被弃用(尽管仍然需要定义属性),Set 仍然存在,留下了像 [Let] variable = value 这样的 VB6/VBA 值赋值语法,其中“Let”是可选的。

在声明和赋值中:

Dim SourceWindow As Window, QACheckWindow As Window
'this is like saying "Let SourceWindow = ActiveWindow":
SourceWindow = ActiveWindow

SourceWindow 是一个 object,就像它是一个 value 一样分配 - 这会导致 VBA 通过 let-coercion 尝试 em>默认成员调用。如果对象未初始化,则成员调用失败并出现错误 91。如果对象已初始化但没有 默认成员,则会引发错误 438。

所以在这种情况下,由于隐式成员调用而引发了错误 91; .net 等价物将是 NullReferenceException:

Dim SourceWindow As Window, Dim WindowTitle As String
'"SourceWindow" reference isn't set, the object can't be accessed yet:
WindowTitle = SourceWindow.Caption 

我在这里有点过火了,但旧的Let 声明不应与Let 子句混淆(在VB.net中) 在 LINQ 查询语法(在 VB.net 中)中,计算一个值并将其分配给一个新的、查询范围的变量(示例取自 MSDN):

From p In products 
Let Discount = p.UnitPrice*0.1 '"Discount" is only available within the query!
Where Discount >= 50
Select p.ProductName, p.UnitPrice, Discount

VB.net 分配 valuesreferences,而无需指定 LetSet,因为在 .net 中这种区别非常重要更细的线,考虑到一切最终如何源自System.Object...包括System.ValueType。这就是the Set keyword was also deprecated in VB.net 的原因,也是 VB.net 定义属性的语法放弃了 Let 以支持 Set 的原因 - 因为无参数 默认成员 在 VB.NET 中是非法的,所以这模棱两可的 let-coercion 不会发生。

【讨论】:

  • 谢谢。 Set 来自其他语言,似乎有点多余。
  • 虽然在这里指出了代码中的错误,但这个答案并不完全正确。错误 91 完全等同于 NullReferenceException。对于对象(没有默认成员)的 Let 分配,您是否收到错误 91 或错误 438(不支持成员)取决于该对象是否已经初始化。 VBA 将尝试访问默认成员以获取值。如果变量已初始化并且没有默认成员,则会收到错误 438。如果未初始化,则会收到错误 91,因为您尝试访问 Nothing 上的默认成员。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多