访问应用程序并实例化对象

时间:2018-01-30 17:26:22

标签: vba excel-vba excel

我正在尝试从名为EXTRA的引用库应用程序创建一个名为ExtraScreen的特定类的实例。如何使用ExtraScreen类中的SendKeys函数?

到目前为止,我试过这个:

Dim software As EXTRA.ExtraScreen
software.SendKeys ("a")

结果是错误:

  

对象变量或未设置块变量。

2 个答案:

答案 0 :(得分:1)

你还需要Set来做某事:

Dim software As EXTRA.ExtraScreen
Set software = CreateObject("EXTRA.ExtraScreen")

Dim software As New EXTRA.ExtraScreen

答案 1 :(得分:0)

你已经声明了一个具有特定的早期绑定类型的对象变量 - 这意味着代码可以编译和编译。运行,然后项目有一个类型库的引用。

Dim software As EXTRA.ExtraScreen

Dim语句不可执行:您无法在Dim语句中设置断点。他们所做的只是在内存中分配给定大小的点。在这种情况下,它保留足够宽的点来保存对象引用 - 而不包含任何其他

执行时,要执行的第一个语句是:

software.SendKeys ("a")

但问题是,如果你在这里放置一个断点并检查 Locals 工具窗口,你会发现software对象包含Nothing。在其他语言中,这被称为" null引用" - 对象变量未设置:有一个用于保存对象引用的保留点,但该点是空的。

您使用New关键字创建类的实例 - 即创建对象。在VBA对象中,引用分配需要Set关键字:

Set software = New EXTRA.ExtraScreen

现在,如果您运行该行并检查当地人,您就会发现software不再是Nothing了,您可以检查它州/财产。

一旦对象变量拥有适当的对象引用,您就可以合法地调用其成员:

software.SendKeys "a"

你永远不能在Nothing对象引用上调用任何东西:Nothing 的对象变量是,什么都不是:它不是对象,因此它没有成员可以调用。 VBA运行时通过抛出运行时错误91"对象(或使用块变量)而不是Set"来响应。

"使用块变量" part指的是With关键字,它也可以包含对象。例如,你可以这样做:

With software
    .SendKeys "a"
End With

如果software不是Set,您就会得到完全相同的错误。考虑完全删除局部变量,如果它只需要在某个特定过程中作为局部变量存在:

With New EXTRA.ExtraScreen
    .SendKeys "a"
End With

在这种情况下,With块保存对象引用;在End With,对象消失了(避免跳入With块,特别是出于这个原因。)