VBA字符串空格:首选方法是什么?

3

在拼接字符串时,有多种有效的方法可以插入空格。

空格函数:

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

VS

引言:

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

VS

Chr:

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

这三种方法都可以得到相同的结果。唯一让我觉得使用空格有益的地方是在使用一个变量作为空格数量时。

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

有人能解释一下为什么一个方法比另一个更好吗?


我非常确定它们在编译时都归结为相同的内容;它们只是不同的表示形式。例如," "是一个字符串(仅包含一个空格的字符列表);而Chr(32)是空格的Char表示。 - Bernard Saucier
3个回答

8
如建议所示,它们在编译时都产生相同的结果。可能会有情境上的好处,例如:
1)Space() - 在需要多个空格时很好。
Space(100)chr(32) & chr(32) & chr(32) & ...更好。
2)" " - 可视化表达式易于理解,尤其适合新的vba学习者
编辑:也比方法调用更快,感谢Blackhawk指出。
3)chr() - 字符表达式可用于打印特定字符以输出到文本文件。例如,使用chr(10)打印Enter/Return。然而,我没有看到任何明显的打印空格的好处。

1
@RHDxSPAWNx,如果你所做的只是写入一个带有几个空格的立即字符串值,那么"A B"是最合理的选择 - VBA将解析代码,因此代码中的一些额外空格可能比space()chr()之类的方法调用更快。 Space()通常用于为字符串预分配内存以用作缓冲区,例如在Windows API调用中。如Alex所述,Chr()通常用于将非打印字符(例如CR或LF)放入字符串中。我曾经使用它来匹配网页文本中的不间断空格,即chr(160)。 - Blackhawk

2
使用字符串字面量应该是最快的,因为其他两个是函数。正如你指出的那样,它很容易理解,但是正如@Alex指出的那样,当你需要多个空格时,Space()肯定更好。我总是更喜欢字面量或space()而不是chr(32)。对于维护者来说,chr(32)相当晦涩难懂。
但是还有另一种选择,你没有考虑到:创建一个常量。
Const space As String = " "

这具有与字面量" "相同的可读性,同时还具有更好的性能。作为额外的好处,常量在内存中只有一个实例,而字面量会为每个实例出现一次。
如果您决定使用chr(32),最好使用它的字符串版本:chr$(32)。普通版本返回一个变体,而字符串版本返回一个字符串。在这里可以避免一些额外的开销。

1
也许会有性能差异?您可以自行测试!请参考与性能计数器相关的答案中的代码以获取有用的VBA计时器类。
以下是(类似于Excel的)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
1
是的,@RubberDuck... 该代码可在帖子中的链接中找到:https://dev59.com/Y3VC5IYBdhLWcg3wvT1a - jeffrey_t_b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接