Dim As New 与 Dim / Set 有什么区别

2024-04-28

在 VBA 中,我可以通过以下两种方式之一创建对象:

'First way
Dim myCol1 As New Collection

'Second way
Dim myCol2 As Collection
Set myCol2 = New Collection

myCol1.Add "AAA"    'Works
myCol2.Add "BBB"    'Works as well

第二种方式只是第一种方式的更详细版本,还是 myCol1 和 myCol2 对象之间实际上存在差异?


有几个关键的区别。你绝对应该更喜欢第二个Dim/Set方法。

Reason 1 - With As New,在调用该对象的属性或方法之前,不会创建该对象,但请看一下此示例,其中将对象设置为 Nothing,然后调用属性/方法会导致对象重新实例化自身:

Sub ShortcutInstantiation()

  Dim x As New Collection

  x.Add "FOO", "BAR"
  Set x = Nothing

  'This line implicitly recreates a new Collection
  Debug.Print x.Count

  Debug.Print x Is Nothing 'Prints False

End Sub

Sub SafeInstantiation()

  Dim x As Collection
  Set x = New Collection

  x.Add "FOO", "BAR"
  Set x = Nothing

  'Throws error because x is nothing
  Debug.Print x.Count

End Sub

Reason 2 The As New方法较慢,因为 VBA 需要检查它之前是否已实例化该对象每一个属性或方法调用。

查看此伪代码,了解 VBA 在幕后做了什么:

Sub NotSoShortcutInstantiation()

  Dim x As New Collection

  If x Is Nothing Then Set x = New Collection
  x.Add "FOO", "BAR"

  If x Is Nothing Then Set x = New Collection
  x.Add "FIZZ", "BUZZ"

  If x Is Nothing Then Set x = New Collection
  x.Add "CAR", "DOOR"

  If x Is Nothing Then Set x = New Collection
  Debug.Print x.Count

End Sub

Reason 3如果您的对象构造函数执行某些操作,则可能会出现严重的时间差异after你期望它,而不是当你显式实例化它时:

比较这段代码的结果:

Sub InstantiationTiming()

  Dim foo As String

  Dim x As New Class1
  Debug.Print Format(Now(), "hh:mm:ss") & " x should be ready"
  foo = x.foo

  Dim y As Class1
  Set y = New Class1
  Debug.Print Format(Now(), "hh:mm:ss") & " y should be ready"
  foo = y.foo

End Sub

The As New方法打印:

06:36:57 x should be ready
06:36:57 Class Initialized

The Set y = New方法打印:

06:36:57 Class Initialized
06:36:57 y should be ready
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dim As New 与 Dim / Set 有什么区别 的相关文章

  • VBA - 循环遍历表单上的控件并读取值

    我想循环遍历表单上的控件并读取值 但是 Value 和 Checked 属性不可用 我的问题是 当我循环访问控件 在本例中为复选框 时 如何读取它们的值 Dim Ctrl as Control For Each Ctrl In frmMai
  • 在 VBA 中接收文件创建通知,无需轮询

    我正在编写一个与 ScanSnap 扫描仪集成的程序 ScanSnap 扫描仪不支持 TWAIN 扫描文档后 它会自动保存为 PDF 我想监视保存文件的目录 并在文件出现 并完成写入 时采取一些操作 一种简单的方法是使用 MS Access
  • 当单元格值和复选框更改时更改工作表

    我有一本包含多个工作表的工作簿 我有一个菜单页面 工作表 其中包含多个用户选择 输入新订单 更新订单等 每个选项旁边都有一个复选框 根据选中的复选框 单元格F4 F21改变自0 to 1并且 细胞B1更改我想要去的工作表的名称 我的主菜单工
  • Excel VBA application.visible 立即设置回 True

    我已经设置了一个新的 空的 无模式的用户表单 用最少的代码来解决我的问题 当工作簿打开时 执行以下代码来隐藏 Excel 并显示用户窗体 这是工作簿的唯一代码 Private Sub Workbook Open UserForm1 Show
  • 防止在 Windows 资源管理器中打开重复的文件夹或子文件夹

    我正在使用下面的代码打开特定文件夹 我需要在打开之前检查一下 如果是的话文件夹或子文件夹是否已在 Windows 资源管理器中打开 以防止重复 感谢任何有用的评论和答案 Sub Prevent opening duplicate folde
  • 通过 Whatsapp 从 Excel 发送图片

    我们如何通过 Whatsapp 从 Excel 发送图片 我找到了通过以下方式发送消息的vba代码https web whatsapp com https web whatsapp com Sub Test Dim text As Stri
  • 空格键在 Excel VBA 编辑器中的行尾不起作用

    我将 Personal xlsb 移至新笔记本电脑 但遇到了一个奇怪的问题 空格键在行尾不起作用 除非它是完全空的行 示例 1 不起作用的示例 不工作 示例 2 工作示例 会工作 当我按空格键时 文本选择指针没有移动 但位置指示器在原始位置
  • 如何在Excel VBA中获取给定模块名称的函数和子列表

    我正在开发一个帮助宏 它可以查看活动 Excel 工作簿上给定模块名称的列表函数 例如 我有一个模块名称 Module1 该模块内部有以下功能或子功能 Sub Sub1 End Sub Sub Sub2 End Sub Function F
  • 使用 VBA 设置 Sharepoint 标签/属性

    是否可以使用 VBA 设置 Sharepoint 文档 特别是 Excel 的标签 目前我知道处理此问题的唯一方法是将文件保存到 Sharepoint 在出现提示时设置标签 然后再次下载该文件并将其用作模板 然而 我需要使用这些标签的几种不
  • VBA中工作表变化的递归调用

    我已经创建了包含多个工作表的工作簿 我正在尝试使用 WorkSheet ChangeSheet1 即工作表 1 上的某些更改正在复制到工作表 2 中 同样 如果有任何改变Sheet2我想做出类似的改变Sheet1以及 这样做时 两张表上都会
  • 列表框错误“无法设置列表属性。属性值无效。”

    我有一个带有列表框 文本框 组合框和保存按钮的用户表单 下面是我的保存按钮代码 Private Sub cmdsave Click Dim x As Integer x Me ListBox1 ListCount If Me cmbtran
  • VBA Office2010 Shapes.PasteSpecial 失败

    我在将 VBA 代码从 Office2003 迁移到 Office2010 时遇到问题 我想将单元格 Excel 的文本复制到Powerpoint Office2003生成了一个新的文本框 文本样式与Excel中相同 现在我的代码在 Off
  • 按日期计算 Outlook 中的电子邮件

    我有以下代码来计算 Outlook 文件夹中的电子邮件数量 Sub HowManyEmails Dim objOutlook As Object objnSpace As Object objFolder As Object Dim Ema
  • VBA:删除数组项后减少循环迭代?

    在 Excel 的 VBA 中 For i 0 To UBound artMaster For j i To UBound artMaster If i lt gt j And artMaster i VDN artMaster j VDN
  • Outlook Application_NewMailEx 在启动时不工作

    我正在使用一个Application NewMailEx处理收到的所有电子邮件 它适用于 Outlook 打开时收到的电子邮件 然而在启动时 Application NewMailEx不会因收到的电子邮件而被呼叫 我尝试使用Applicat
  • 用于将 MS Word 表导出到 Excel 工作表的宏

    我有一个包含许多表格的word文档 有谁知道如何编写宏将此类表导出到不同的 Excel 工作表 答案摘自 http www mrexcel com forum showthread php t 36875 http www mrexcel
  • Excel - 根据选择创建图表的宏

    我想就以下问题寻求您的帮助 因为我必须创建大量图表 所以我想要一个宏来根据我的选择插入图表 由于我对 VBA 没有任何了解 但现在需要它 至少现在 我真的应该自己学习使用它 我将感谢您的帮助 基本上 我需要知道如何调整我记录的代码 以便根据
  • VBA仅清除数据透视表缓存,但保留数据透视表结构

    如何使用VBA清除数据透视表缓存 但不破坏数据透视表结构 我的数据透视表已连接到外部数据源 SQL 源决定哪个用户应该查看数据的哪一部分 当表刷新时 源会填充该表 我想保存 Excel 文件并使用干净的数据透视表 内部没有数据 分发它 结果
  • 列表框:添加组合框作为项目?

    是否可以将列表框的每个项目都作为组合框 我需要这个 因为我将列表框设置为可检查 然后我需要让用户从列表中每个元素的不同选项中进行选择 Thanks 如果您不打算分发您的应用程序 那么您还可以查看 TreeView 控件 请参阅此示例 COD
  • 将 copyfromrecordset 写入范围

    我有以下 vba 它从单元格 C10 开始读取 MCO 直到其为空 并将从 SQL 数据库获取机器数量 解密和升级机器数量 这工作正常 但我在获取相应行中的数据时遇到问题 目前它总是将数据写入 D10 因为我已经对其进行了硬编码 但我不确定

随机推荐

  • 即使 cookie 在开发人员工具中列出且 httpOnly 标志设置为 false,访问 document.cookie 也会返回空字符串

    有时 访问时document cookie在登录页面中 我得到一个空字符串 即使 cookie 列在 Chrome 和 Firefox 开发者工具中 我感兴趣的 cookie 的 httpOnly 标志设置为 false 我感兴趣的 coo
  • 接收客户端返回的数据

    我使用套接字连接从服务器发送了一个缩放数组到客户端 它运行良好 现在我想将数据发送回服务器以在服务器中取消缩放 数据一次每行发送到客户端 因此我尝试将它们按顺序放回到名为 Final 的空数组中 这是服务器 py import socket
  • 应用程序负载均衡器的 SurgeQueueLength 等效项

    我希望为 AWS ECS 上运行的服务设置自动缩放 来自ECS弹性伸缩文档 https docs aws amazon com AmazonECS latest developerguide service auto scaling htm
  • 寻找支付网关[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一家支付网关公司 这样我们就可以避免繁琐的 PCI DSS 认证及其相关费用 我现在就解决这个
  • 向 yii2 活动记录模型添加不在数据库中的属性

    我有一个 mySQL 数据库 其中有一个表videos和两列 开始时间 and end time 其格式为2017 01 24 15 38 11 我有一个活动记录模型Videos延伸 yii db ActiveRecord我想添加一些数据库
  • PHP上传图片

    好吧 我在这方面投入了很多时间 我是 PHP 编程新手 并试图掌握基础知识 但我有点迷失 因为昨晚我能够获得一个 PHP 表单来将基本数据 如名称地址和其他内容 上传到我的 MySQL 服务器 但今天我说让我们进行下一步 将图像发送到服务器
  • 使用 Servlet 启动 VLC HTTP Stream 时出现问题

    我正在为自己开发一个 VLC 项目 我的目标是创建一个 HTML 前端来启动流 我通过使用 Java Servlet 来完成此操作 概述 乌班图13 04 Java 7 21 冰茶 2 3 9 Eclipse JAVAEE IDE 雄猫7
  • 汇编语言中的全局_start是什么?

    这是我的汇编级代码 section text global start start mov eax 4 mov ebx 1 mov ecx mesg mov edx size int 0x80 exit mov eax 1 int 0x80
  • 将参数传递给 psql 过程脚本

    我有一个循环命令脚本psql看起来像这样 脚本 sql DO DECLARE data rec RECORD r RECORD r2 RECORD BEGIN select mytables data id into data rec fr
  • 如何将砌体项目居中?

    我已经设置了砌体来显示项目 如下所示 list masonry itemSelector propitem columnWidth 230 这有效 但所有项目 propitem 向左浮动 例如 如果我的容器 list宽度为 600 像素 左
  • tar 命令在提取时更改所有者:组

    使用此命令提取文件时tar zxf bluez arm package tgz文件和目录的所有者 1000 组 脉冲 是 更改如下例 Example drwxrwxr x 4 1000 pulse 1024 Jul 21 00 32 dbu
  • Marionette.View 中 UI 元素的可用性

    我只是想了解 Backbone Marionette 关于 UI 元素的观点背后的决定 在现有 DOM 元素上实例化 Marionette View 时 如下所示 view new Marionette ItemView el elemen
  • T-SQL 跳过获取存储过程

    我在这个网站上似乎运气不太好 但我仍然是个乐观主义者 我会继续努力 我有两个表 期刊和文章类别 使用此查询连接 SELECT Journals JournalId Journals Year Journals Title ArticleCa
  • 在 Prolog 中动态拆分列表

    我从序言开始几周 但我看到了更深入的操作列表的递归谓词的构造 我的问题是 是否可以构建一个谓词 将给定列表拆分为给定数量的其他列表 比如我想象的 split H T NumberLists Lists 递归实现 split 1 2 3 4
  • 隐藏 asp 单选按钮文本

    我有一个 asp 单选按钮 我想在 javascript 中将其可见性设置为 false
  • 发生异常后不刷新会话 - NHibernate

    我正在 NET 3 5 NHibernate 下开发一个 ASP NET MVC Web 应用程序 并托管在 Windows Azure 上 当 web 应用程序从本地开发结构运行时 它可以正常工作 然而 当我将其移动到 Windows A
  • Eclipse WTP 与 Tomcat 中干净工作目录和干净工作目录之间的区别

    我正在使用 Eclipse 进行 Java Web 开发 我安装了 WTP 和 Tomcat 我通过 Eclipse 运行 Tomcat 这是一个非常标准的配置 我想了解的是 当您右键单击 服务器 选项卡中的服务器时 它会为您提供两个选项
  • Pytorch Tensor 如何获取元素索引? [复制]

    这个问题在这里已经有答案了 我有 2 个名为x and list它们的定义如下 x torch tensor 3 list torch tensor 1 2 3 4 5 现在我想获取元素的索引x from list 预期输出是一个整数 2
  • 如何从 C# 中的显示名称获取 Active Directory 中的用户名?

    我希望能够使用 Active Directory 中用户的显示名称来获取该用户的用户 ID 显示名称是从数据库中获取的 并且已在该用户会话期间使用以下代码来存储以获取显示名称 using System DirectoryServices A
  • Dim As New 与 Dim / Set 有什么区别

    在 VBA 中 我可以通过以下两种方式之一创建对象 First way Dim myCol1 As New Collection Second way Dim myCol2 As Collection Set myCol2 New Coll