关键字"新"在VBA中有什么作用?

Cod*_*odo 7 excel vba excel-vba

在VBA过程中,我们通常会在对现有对象实例的对象引用进行实例化时不断满足关键字New.但在某些实例中,我们使用关键字New,而在其他实例中,我们不使用例如:

Dim T As Excel.Workbook

Set T = Application.Workbooks(Bk)

在上面的示例No.1中,使用"新"关键字

Dim fso As FileSystemObject

Set fso = New FileSystemObject

在上面的例子2号的的关键字正在使用

为什么?请记住,我是VBA的新船,但我会尽我所能去理解!

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

Dim WS As Worksheet

在上面的示例No.1中,使用"新"关键字

Dim myClassModule As New cl_ChartEvents

在上面的例子2号的的关键字正在使用

微软帮助只是告诉我什么......

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

Gratz2u

亲爱的人们,这是最后一次了解深刻理解

Dim WS as Worksheet

Set WS = Worksheets("Sheet1")

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

4 @exantas

对不起说没有足够的代表发布pic :-(

nag*_*ben 12

当您对变量进行Dim时,您将指定它将保留的数据类型.在创建时,它的值始终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
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助!


Tho*_*ler 5

你说:"[我们]通常在对现有对象实例的对象引用实例化时遇到关键字New".正好相反:如果有些地方工作的新使用还存在,要创建它,以及"新".

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

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

Dim ... As ...
Set ... = New ...
Run Code Online (Sandbox Code Playgroud)

对于您创建新工作表的最后一个问题,它完成了

Dim WS As Worksheet
Set WS = Sheets.Add
WS.Name = "My new worksheet"
Run Code Online (Sandbox Code Playgroud)

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

  • 分裂的另一个原因是因为"As New"声明了一个*auto-instantiated*对象,并且它改变了引用行为的归零方式.如果您不了解它,可能会导致令人惊讶的错误.FWIW声明顶部的所有变量都是愚蠢的; 在任何其他语言中,建议将变量声明为尽可能接近其用法.继续将它们声明为顶部,然后当其中一半不在任何地方使用时不要感到惊讶. (2认同)
  • @Mat's Mug 将所有声明放在顶部可以提高短程序的可读性,但我同意长程序。为了进一步详细说明 _italic_auto-instantiation_italic_,单行语法本质上创建了一个坚不可摧的对象(有关更多信息,请参阅:[链接](/sf/ask/568027911/未在声明时实例化对象)) (2认同)