14

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

Dim SourceWindow As Window, QACheckWindow As Window
SourceWindow = ActiveWindow

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

编辑:以上内容正好在我的功能的开头,所以之前的所有内容Sub FuncName()

4

1 回答 1

28

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

这是继承自legacy Letkey to assign values,和Setkeyword to assign references;最终被Let弃用(尽管仍然需要定义属性)并Set保留,留下 VB6/VBA 值分配语法,如[Let] variable = value,其中“Let”是可选的。

在声明和赋值中:

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

SourceWindow是一个对象,就像它是一个一样分配 - 这会导致 VBA通过默认成员调用尝试强制强制。如果对象未初始化,则成员调用失败并出现错误 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,而无需指定 aLet或 a Set,因为在 .net 中,考虑到所有事物最终如何派生自System.Object...包括System.ValueType. 这就是为什么关键字在 VB.net 中也被弃用的原因Set也是为什么用于定义属性的 VB.net 语法放弃了Let支持Set- 因为无参数默认成员在 VB.NET 中是非法的,所以这种模棱两可的 let-coercion不会发生。

于 2013-09-21T03:59:09.777 回答