我实际上是在开发我的第一个VBA项目.(来自C++)
我想通过实现类和多态来改进Microsoft Excel工作簿使用的现有VBA项目.
我的问题是:
1 -我阅读了很多文章/论坛,解释说VBA不是面向对象编程(OOP)语言,不支持多态性.
其中一些人使用关键字Implements提出了一种解决方法.
2 -我还发现了一些像这样的网页,它解释了如何使用Inherits,Overrides,Overridable,MustOverrides等关键字在VBA中执行OOP和多态.
所以我的问题是:
是VBA的面向对象语言,它支持多态?
我需要在VBA中制作一些需要互相引用的自定义对象,我有一些问题.
首先 - 对象构造函数如何在VBA中工作?有施工人员吗?
第二 - 有破坏者吗?VBA如何处理对象生命周期的结束?如果我有一个引用其他对象的对象(这是他们唯一的引用),那么我可以将它设置为Nothing并用它完成或者是否会产生内存泄漏?
这种准OO的东西只是有点刺激.
我希望能够初始化一个
CArticle 具有以下属性:
Private pNumber As String
Private pQuantity As Double
Run Code Online (Sandbox Code Playgroud)
具有空值,预定义值或当前值.我怎样才能做到这一点?我正在考虑以下几点:
新空 CArticle
pNumber
pQuantity
Run Code Online (Sandbox Code Playgroud)
新的假人 CArticle
pNumber
pQuantity = 99999
Run Code Online (Sandbox Code Playgroud)
新的init CArticle(number, quantity)
pNumber = number
pQuantity = quantity
Run Code Online (Sandbox Code Playgroud) 人们普遍认为,使用类似的结构Dim dict As New Dictionary比表现更差Dim dict As Dictionary / Set dict = New Dictionary.
解释是前一个例子 - 自动实例化 - 推迟实例化直到第一次使用变量dict.因此,每次引用dict时,编译的代码必须首先检查是否dict等于Nothing.
但是我发现编译代码无论如何都会这样做.每当您尝试使用对象引用时,您将收到错误Nothing.
所以,为了向科学致敬,我进行了一些测试.结果表明两种方法之间没有性能差异.(在Excel 2007上运行)
拨打"创建字典并添加2项"100,000次.
反转测试呼叫的顺序:
调用"创建字典并添加6项"100,000次.
创建字典并添加100,000个项目.
创建字典并添加1,000,000个项目.
我没有看到任何迹象表明自动实例化与显式实例化的表现不佳.(要明确的是,出于其他原因,我会避免自动实例化,但我只是对这里的性能角度感兴趣.)
这是一个神话吗?
UPDATE
让我列出为什么表演论点对我没有意义.有人说
x.Add("Key", "Item")
Run Code Online (Sandbox Code Playgroud)
在自动实例化的对象中等效于以下内容:
If x is Nothing then
Set x = New Dictionary
End If
x.Add("Key", "Item")
Run Code Online (Sandbox Code Playgroud)
如果你这几千次打电话,这会让它看起来像"令人恐惧的开销".但是在显式实例化情况下,它正是代码编译版本中生成的逻辑形式:
If …Run Code Online (Sandbox Code Playgroud) 我有以下VBA代码:
Sub read_in_data_from_txt_file()
Dim dataArray() As String
Dim i As Integer
Const strFileName As String = "Z:\sample_text.txt"
Open strFileName For Input As #1
' -------- read from txt file to dataArrayay -------- '
i = 0
Do Until EOF(1)
ReDim Preserve dataArray(i)
Line Input #1, dataArray(i)
i = i + 1
Loop
Close #1
Debug.Print UBound(dataArray())
End Sub
Run Code Online (Sandbox Code Playgroud)
...我正试图从文件中逐行读取文本(假设'sample.txt'是常规的ascii文件),并将此数据分配给数组中的连续元素.然而,当我运行它时,我将所有数据都放在数组的第一个值中.有人可以帮我解决我做错的事吗?
例如,如果'sample.txt'是:
foo
bar
...
dog
cat
Run Code Online (Sandbox Code Playgroud)
...我希望这些单词中的每一个都在VBA中的连续数组元素中.
谢谢!
这不起作用:
clsTestDefaultInstance
Dim HowAmIInitialised As Integer
Private Sub Class_Initialize()
HowAmIInitialised = 99
End Sub
Run Code Online (Sandbox Code Playgroud)
Public Sub CallMe()
Debug.Print "HowAmIInitialised=" & HowAmIInitialised
End Sub
Run Code Online (Sandbox Code Playgroud)
即clsTestDefaultInstance.CallMe()输出HowAmIInitialised=99因为 Class_Initialize()即使是默认实例也被调用.
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "clsTestDefaultInstance"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Compare Database
Option Explicit
' test how class instance can tell if it is default
'clsTestDefaultInstance
Dim HowAmIInitialised As Integer …Run Code Online (Sandbox Code Playgroud) vba ×6
excel ×2
object ×2
constructor ×1
destructor ×1
excel-vba ×1
memory-leaks ×1
oop ×1
polymorphism ×1
variables ×1