VBA字符串是不可变的吗?

Pao*_*oni 8 string excel vba excel-vba

我知道.NET(以及VB.NET)字符串是不可变的.但是,我在Excel 2010中使用VBA 7.0.字符串是否不可变?我正在进行大量的字符串处理,对于少量,一些(直接)字符串操作很好,但我担心它不会扩展 - 因为每个额外的字符从一个字符串移动到另一个字符串可能会创建另一个实例字符串.

Ale*_* K. 8

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

例如,赋值via mid$()明显快于正常的new-string-from-assignment.

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 
Run Code Online (Sandbox Code Playgroud)


use*_*740 5

虽然 VB.NET 字符串是不可变的,但正如 System.String 所规定的那样,VBA(包括 VB6?)字符串可以改变(例如使用Mid$)。请参阅Alex K 的回答并记StrPtr下操作后的结果。


原答案;有文件支持,与反例相反。

VBA 字符串是不可变的。

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


与 .NET 文档不同,VBA 的此类行为参考 [变得] 难以追踪。从MS-VBAL: 2.1 Data Values and Value Types,我们发现了这个罕见的小宝石

单个数据值是不可变的。这意味着在 VBA 环境中没有可用的已定义机制可以导致数据值更改为另一个数据值。

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