VBA字符串是否不变?

问题描述 投票:9回答:3

我知道.NET(因此是VB.NET)字符串是不可变的。但是,我在Excel 2010中使用VBA 7.0。那里的字符串是不可变的吗?我正在做大量的字符串处理,少量时,可以使用一些(直接)字符串操作,但是我担心它无法缩放-因为从一个字符串移动到另一个字符串的每个其他字符可能会创建另一个字符串实例字符串。

string vba excel-vba excel
3个回答
5
投票

虽然VB.NET字符串是不可变的,但根据System.String的要求,VBA字符串可以用Mid$进行突变。参见Alex K's answer


原始答案;受文档支持,与反例相反。

VBA字符串是不可变的。

就像使用VB.NET一样,如果不创建新字符串,就无法“替换字符串的一部分”或“附加到”字符串。这是否重要-因为现代计算机的速度非常快-取决于实际的算法,数据和环境。


与.NET文档不同,[VBA]这样的行为参考很难被追踪。从MS-VBAL: 2.1 Data Values and Value Types中,我们发现了这个稀有的小宝石

单个数据值是不可变的。这意味着在VBA环境中没有可用的定义机制,可以使一个数据值变成另一个数据值。

其中字符串代表“单个数据值”。


9
投票

它们是不可变的,除非它们表现出可变的行为,否则它们不是。

例如,通过mid$()进行分配比通常的新字符串来自分配要快。

Dim s As String

s = "ABC"

Debug.Print s, StrPtr(s)

'// -> ABC            122899836

Mid$(s, 1, 1) = "Z"

Debug.Print s, StrPtr(s)

'// -> ZBC            122899836     

s = "??" & Right$(s, 1)

Debug.Print s, StrPtr(s)

'// -> ??C            196635748 

1
投票

VBA字符串是可变的。先前的两个答案是错误的,但我对张贴者表示同情,因为即使在发布此答案之日,Microsoft仍然声称它们是不可变的-https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/strings/string-basics-Microsoft需要对其进行梳理。

因此,在所有VB6,VBA,VB.Net中,您可以使用Alex答复中所述的“ Mid()=”,以极快的速度覆盖部分字符串。但是,在VBSscript中,它们绝对是不可变的(“ Mid()=”将不起作用)。

这是经过测试的代码。

Dim txt$: txt = "hello world ___________" '/, anAction
Mid(txt, 14, 8) = Time 'in vb.net use [= TimeOfDay.ToString("hh:mm:ss")]
Debug.Print(txt) 'outputs "hello world _08:49:53__"

在兆字节以上的大字符串上,此技术对于速度至关重要,因此可以扩展。附言:我无法在更高版本的VBA上进行测试,但可以在更低版本的VBA上运行。如果有人可以粘贴并选中它,请发表评论,我会投票赞成。

© www.soinside.com 2019 - 2024. All rights reserved.