VBA:运行时错误 '91' ?

标签 vba

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

Dim SourceWindow As Window, QACheckWindow As Window
SourceWindow = ActiveWindow

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

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

最佳答案

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

这是从旧版 Let 继承而来的用于赋值的关键字,以及 Set分配引用的关键字; Let最终被弃用(尽管仍然需要定义属性)和 Set保留,保留 VB6/VBA 赋值语法,如 [Let] variable = value ,其中“让”是可选的。

在声明和赋值中:

Dim SourceWindow As Window, QACheckWindow As Window
'this is like saying "Let SourceWindow = ActiveWindow":
SourceWindow = ActiveWindow
SourceWindow是一个对象,就好像它是一个值一样分配 - 这会导致 VBA 尝试通过默认成员调用进行 let-coercion。如果对象未初始化,则成员调用失败并返回错误 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 既分配值又分配引用,无需指定 LetSet ,因为在 .net 中,考虑到所有内容最终源自 System.Object,这种区别是一条更细的线。 ... 包括 System.ValueType .这就是为什么the Set keyword was also deprecated in VB.net ,以及为什么用于定义属性的 VB.net 语法已删除 Let赞成 Set - 因为无参数默认成员在 VB.NET 中是非法的,所以这种模棱两可的 let-coercion 不会发生。

关于VBA:运行时错误 '91' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18927297/

相关文章:

excel - VBA如何遍历Excel中的列

VBA Excel 变量对多个键/顺序进行排序

vba - 工作表更改事件陷入无限循环

excel - Selenium + VBA 控制 Chrome

vba - 如何获取 VBA For Each 循环中的索引(使用 Excel 编程)?

vba - Open.ics 与 Outlook 2013 一起阅读项目

excel - 如果 CubeField.Orientation = xlPageField 如何设置 PivotField.HiddenItemsList 属性的值

excel - 如果循环单元是 = 到前一个,有没有办法 [VBA] 来检查每个循环?

excel - 使用 Excel VBA 从 URL 获取数据

excel - 如何在vba中的Rows()函数中使用OFFSET函数