相关疑难解决方法(0)

VBA是OOP语言,它是否支持多态?

我实际上是在开发我的第一个VBA项目.(来自C++)

我想通过实现类和多态来改进Microsoft Excel工作簿使用的现有VBA项目.

我的问题是:

1 -我阅读了很多文章/论坛,解释说VBA不是面向对象编程(OOP)语言,不支持多态性.

其中一些人使用关键字Implements提出了一种解决方法.

2 -我还发现了一些像这样的网页,它解释了如何使用Inherits,Overrides,Overridable,MustOverrides等关键字在VBA中执行OOP和多态.

所以我的问题是:

VBA面向对象语言,它支持多态?

oop polymorphism excel vba

38
推荐指数
2
解决办法
3万
查看次数

Excel VBA对象构造函数和析构函数

我需要在VBA中制作一些需要互相引用的自定义对象,我有一些问题.

首先 - 对象构造函数如何在VBA中工作?有施工人员吗?

第二 - 有破坏者吗?VBA如何处理对象生命周期的结束?如果我有一个引用其他对象的对象(这是他们唯一的引用),那么我可以将它设置为Nothing并用它完成或者是否会产生内存泄漏?

这种准OO的东西只是有点刺激.

vba constructor destructor memory-leaks object

26
推荐指数
4
解决办法
4万
查看次数

VBA:使用值初始化对象?

我希望能够初始化一个

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)

variables vba initialization object

21
推荐指数
1
解决办法
5万
查看次数

Excel VBA自动实例化的糟糕表现是一个神话吗?

人们普遍认为,使用类似的结构Dim dict As New Dictionary比表现更差Dim dict As Dictionary / Set dict = New Dictionary.

解释是前一个例子 - 自动实例化 - 推迟实例化直到第一次使用变量dict.因此,每次引用dict时,编译的代码必须首先检查是否dict等于Nothing.

但是我发现编译代码无论如何都会这样做.每当您尝试使用对象引用时,您将收到错误Nothing.

所以,为了向科学致敬,我进行了一些测试.结果表明两种方法之间没有性能差异.(在Excel 2007上运行)

拨打"创建字典并添加2项"100,000次.

  • 明确:16,891ms /自动:16,797ms(自动94ms更快)
  • 明确:16,797ms /自动:16,781ms(自动快16ms)

反转测试呼叫的顺序:

  • 自动:16,766ms /明确:16,812ms(自动快46ms)
  • 自动:16,828ms /明确:16,813ms(明确快15ms)

调用"创建字典并添加6项"100,000次.

  • 自动:17,437ms /明确:17,407ms(明确快30ms)
  • 自动:17,343ms /明确:17,360ms(自动快17ms)

创建字典并添加100,000个项目.

  • 自动:391ms /明确:391ms(相同)

创建字典并添加1,000,000个项目.

  • 自动:57,609ms /明确:58,172ms(自动563ms更快)
  • 明确:57,343ms /自动:57,422ms(明确快79ms)

我没有看到任何迹象表明自动实例化与显式实例化的表现不佳.(要明确的是,出于其他原因,我会避免自动实例化,但我只是对这里的性能角度感兴趣.)

这是一个神话吗?

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)

excel vba excel-vba

12
推荐指数
1
解决办法
1338
查看次数

将数据从文本文件读入VBA数组

我有以下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中的连续数组元素中.

谢谢!

vba powerpoint-vba

3
推荐指数
1
解决办法
2万
查看次数

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

3
推荐指数
1
解决办法
150
查看次数