VBA 字符串空间:首选方法?

Posted

技术标签:

【中文标题】VBA 字符串空间:首选方法?【英文标题】:VBA String Spaces: Preferred Method? 【发布时间】:2014-12-23 02:14:26 【问题描述】:

连接字符串时,有多种插入空格的有效方法。

空间函数:

Print "A" & Space(1) & "B"
A B

VS

引述:

Print "A" & " " & "B"
A B

VS

Chr:

Print "A" & Chr(32) & "B"
A B

所有三种方法产生相同的结果。我发现 Space 有益的唯一地方是使用变量来表示空格数。

Space( <expression of number - len(var)> )

谁能提供任何关于为什么一种方法比另一种更好的见解?

【问题讨论】:

我很确定它们在编译时都归结为同一件事;它们只是不同的表示。例如,“”是一个字符串(仅包含一个空格的字符列表);而 Chr(32) 是空间的 Char 表示。 【参考方案1】:

正如建议的那样,它们在编译时都会产生相同的结果。可能会有一些情境优势,例如:

1) Space() - 当需要多个空间时很好。Space(100) 优于 chr(32) & chr(32) & chr(32) & ...

2) " " - 易于理解的视觉表达,尤其适用于新的 vba 学习者 编辑:也比方法调用更快,感谢 Blackhawk 指出

3) chr() - 可用于打印特定字符以表示文本文件的字符表达式。例如。使用 chr(10) 打印 Enter/Return。但是,我没有看到打印空间有任何明显的好处

【讨论】:

@RHDxSPAWNx,如果您所做的只是写一个带有几个空格的立即字符串值,那么“AB”最有意义 - VBA 无论如何都会解析代码,所以需要额外的几个空格在代码中可能比诸如space()chr() 之类的方法调用更快。 Space() 通常用于在字符串中预分配内存以用作缓冲区,例如在 Windows API 调用中。正如 Alex 所暗示的,Chr() 通常用于将不可打印的字符转换为字符串,例如 CR 或 LF。我用它来匹配网页文本中的不间断空格,chr(160)。【参考方案2】:

使用字符串文字应该是最快的,因为其他两个是函数。正如您所指出的,这很容易理解,但是当您需要的不仅仅是一个空间时,@Alex pointed out Space() 肯定会更好。我总是更喜欢文字或space() 而不是chr(32)chr(32) 对于维护者来说非常晦涩难懂。

还有一个你没有考虑过的选项。创建一个常量。

Const space As String = " "

这具有space(1) 的所有可读性以及文字" " 的性能。作为一个额外的好处,内存中只有一个常量实例,因为每个实例的文字都会显示一次。


如果您决定使用chr(32),则最好使用它的字符串版本:chr$(32)。常规版本返回一个变体,而字符串版本返回一个字符串。变体有一些额外的开销,在这里可以避免。

【讨论】:

【参考方案3】:

也许存在性能差异?你可以自己测试一下!请参阅the code at this answer related to the performance counters 以获取有用的 VBA 计时器类。

这是(Excel-ish)VBA 中此类计时的示例:

Option Explicit

Sub DoTimings()
    Dim oTimer As New CTimer
    Dim fTimer(3) As Double

    Dim iiter As Long
    Const ITERATIONS As Long = 10000

    oTimer.StartCounter
    For iiter = 1 To ITERATIONS
        Debug.Print "A" & Space(1) & "B"
    Next
    fTimer(1) = oTimer.TimeElapsed

    oTimer.StartCounter
    For iiter = 1 To ITERATIONS
        Debug.Print "A" & " " & "B"
    Next
    fTimer(2) = oTimer.TimeElapsed

    oTimer.StartCounter
    For iiter = 1 To ITERATIONS
        Debug.Print "A" & Chr(32) & "B"
    Next
    fTimer(3) = oTimer.TimeElapsed

    Range("A1").Value = "Spaces: "
    Range("B1").Value = fTimer(1)
    Range("A2").Value = "Quotes: "
    Range("B2").Value = fTimer(2)
    Range("A3").Value = "Chr: "
    Range("B3").Value = fTimer(3)

End Sub

当我在我的机器上运行它时,差异可以忽略不计或受其他因素支配(最明显的是您要打印到的任何 I/O)。因此,可以肯定地说,没有任何明显的性能差异,从可维护性的角度来看,您可以使用最有意义的任何东西。

【讨论】:

如果没有 CTimer 类,不管是什么,这都行不通。 是的,@RubberDuck... 该代码可在帖子中的链接中找到:***.com/questions/198409/…

以上是关于VBA 字符串空间:首选方法?的主要内容,如果未能解决你的问题,请参考以下文章

VBA笔记

javascript 命名空间的首选技术

Access中的VBA返回方法[重复]

在对列表进行双重递归时,“预检查”是避免添加无类型或空字符串的首选方法吗?

VBA注释临时

访问 VBA - 遍历报表元素/属性