【问题标题】:What does the keyword 'New' do in VBA?VBA 中的“新建”关键字有什么作用?
【发布时间】:2014-03-06 08:03:50
【问题描述】:

在 VBA 程序中,我们经常遇到关键字New,通常是在实例化对现有对象实例的对象引用时。但是在某些实例中我们使用关键字 New 而在其他实例中我们不使用例如:

Dim T As Excel.Workbook

Set T = Application.Workbooks(Bk)

在上面的示例 No.1 中,“New” 关键字被使用

Dim fso As FileSystemObject

Set fso = New FileSystemObject

在上面的示例 2 中,New 关键字 正在 被使用

为什么?请记住,我是 VBA 的新手,但我会尽力理解!

除此之外,在声明对象引用时使用/不使用时我也会感到困惑:

Dim WS As Worksheet

在上面的示例 No.1 中,“New” 关键字被使用

Dim myClassModule As New cl_ChartEvents

在上面的示例 2 中,New 关键字 正在 被使用

Microsoft 帮助什么也没告诉我...

允许隐式创建对象的关键字。如果在声明对象变量时使用 New,则在第一次引用它时会创建一个新的对象实例,因此您不必使用 Set 语句来分配对象引用。

Gratz2u

亲爱的人们只是深入了解的最后一次除尘

Dim WS as Worksheet

Set WS = Worksheets("Sheet1")

在这里,我们正在创建一个已经存在的对象,以便打开 MS Excel(例如,在“默认模式”下),当然是 Sheet1。 既然它存在并且New 关键字是不可能的,我们怎么能在一行中立即实例化这个对象?

4 @exantas

抱歉,没有足够的代表发布图片:-(

【问题讨论】:

标签: vba excel


【解决方案1】:

当您对变量进行调暗时,您正在指定它将保存的数据类型。在创建时,其值始终为Nothing,直到您对其进行初始化。 Set T = Application.Workbook(Bk) 将 T 变量初始化为 Application.Workbook 的特定实例,在本例中为“Bk”。

当您Dim fso as FileSystemObject 时,您基本上是在说fso 在某个时候会持有FileSystemObject;但是它的初始值为Nothing,直到您使用Set fso = New FileSystemObject 对其进行初始化。 New 关键字意味着您正在创建一个新对象,而不是像使用 Set T = Application.Workbook(Bk) 那样使用现有对象初始化变量

还要注意Set fso = FileSystemObject 是无效的,因为它不知道您希望分配给它的FileSystemObject 的哪个实例。这就是您使用 New 关键字创建 FileSystemObject 的新实例的原因。

如前所述,Dim WS As Worksheet 只是告诉编译器您希望变量 WS 保存一个 Worksheet 对象。由于没有指定其他内容,因此在 Dim 点,WS 设置为Nothing

Dim myClassModule As New cl_ChartEvents 相当于做:

Dim myClassModule as cl_ChartEvents
Set myClassModule = New cl_ChartEvents

... 除了一行代码而不是两行。这与 Dim WS As Worksheet 的不同之处在于变量被立即初始化,即 myClassModule 设置为 cl_ChartEvents 的新实例而不是 Nothing

希望这会有所帮助!

【讨论】:

  • 先生,我知道当我引用一个对象变量时它什么都不是,而当我实例化它时它就变成了什么。我们可以看到,当我们将鼠标悬停在 VBE 中时,但是当您说 New 关键字暗示(这意味着建议但不具体)您正在创建一个新对象时,您的真正意思是什么。当您说我正在初始化变量时,您的意思是 Bk,所以在这种情况下不需要 New 关键字?你能放大一点吗?
  • 好吧,我明白了...那么为什么我们使用 2 行而不是 1 行并立即实例化?节省内存对吗?你能确认这是是还是不是?
  • 所以如果它是一个工作表,因为它总是被实例化,我们不使用 New 关键字,并且已经实例化我们需要使用像 Dim wks 这样的特定实例声明它为 Application.Worksheet("Sheet1 “) 正确的?请确认问题已解决,我可以给你问题
  • 是的。对象为Nothing,但数字为0,字符串为“”(长度为零的字符串),布尔值为假。也就是说,最好的形式是编写代码,就好像您不知道这一点并显式初始化变量一样。
  • 也可以在这里查看讨论:stackoverflow.com/questions/8489507/…
【解决方案2】:

您说:“[我们] 通常在实例化对现有对象实例的对象引用时遇到关键字 New”。恰恰相反:当某些东西存在并且您想创建它时使用“新”,“新”。

如果某些内容已经存在,您可以省略 New 关键字,例如Application 对象、ActiveWorkbook 对象和 VBA 中的其他对象,即您在启动 Excel 时已经打开的所有内容。

Dim ... As New ... 是一个快捷方式

Dim ... As ...
Set ... = New ...

对于您创建新工作表的最后一个问题,由

Dim WS As Worksheet
Set WS = Sheets.Add
WS.Name = "My new worksheet"

您不能使用Dim WS as New Worksheet,因为 Microsoft 阻止您这样做。即使您在该指令中指定New,对象仍然是Nothing

【讨论】:

  • 哇,天哪!你的意思是,而不是 Dim...As... PLUS Set...=New ... WE 可以只使用 Dim...As New...?那为什么大部分程序都有2条语句的代码呢?
  • 将其分成两行的一个原因可能是编码指南。有时,公司希望您在开始时声明所有变量,然后使用它。
  • 拆分的另一个原因是As New 声明了一个 自动实例化 对象,这会改变该引用的归零方式。如果您不了解它,可能会导致令人惊讶的错误。 FWIW 在顶部声明所有变量是愚蠢的;在任何其他语言中,建议将变量声明为尽可能接近其用法。继续在顶部声明它们,然后当其中一半没有在任何地方使用时不要感到惊讶。
  • @Mat's Mug 将所有声明放在顶部可以提高短程序的可读性,但我同意长程序。为了进一步详细说明 italic_auto-instantiation_italic,单行语法本质上创建了一个不可破坏的对象(更多信息,请参阅:link
  • @nateAtwork 我坚决不同意“将其放在顶部”以提高任何上下文的可读性,但实际上,自动实例化的对象本质上是坚不可摧的。
猜你喜欢
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 2011-05-18
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多