2014-10-27 75 views
2

当连接字符串时,有多种插入空格的有效方法。VBA字符串空间:首选方法?

空间功能:

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

VS

行情:

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

VS

人权委员会:

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

所有这三种方法产生相同的结果。我发现空间有益的唯一的地方是在空间数量上使用变量。

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

任何人都可以提供任何洞察,为什么一种方法比另一种更好?

+0

我很确定他们在编译时都会遇到同样的问题;他们只是不同的表示。例如,“”是一个字符串(只包含一个空格的字符列表);而Chr(32)是空间的Char表示。 – 2014-10-27 19:33:53

回答

5

正如所建议的,它们在编译时都会得到相同的结果。有可能是情景的好处,如:

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

2)" " - 视觉表达式,它是很容易理解尤指为新的VBA学习者
编辑:另外比一个方法调用快,由于黑鹰指出

3)chr() - 字符表达式可以b e用于打印特定的字符来表示文本文件。例如。印刷输入/退货chr(10)。我没有看到任何明显的打印空间优势,但是

+1

@RHDxSPAWNx,如果你所做的只是编写一个带有几个空格的直接字符串值,那么“AB”最有意义 - VBA将会解析代码,所以代码中的一些额外空间可能比方法调用,如'space()'或'chr()'。 'Space()'通常用于预先分配字符串中的内存以用作缓冲区,例如在Windows API调用中。像Alex暗示的那样,Chr()通常用于将非打印字符转换为字符串,如CR或LF。我用它来匹配网页文本中的非空白空格,chr(160)。 – Blackhawk 2014-10-27 21:01:41

1

也许有性能差异?你可以自己测试一下!请参阅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到你打印的任何东西)。因此,说没有任何明显的性能差异是非常安全的,并且您可以使用从可维护性角度来说最有意义的任何内容。

+0

如果没有'CTimer'类,这将无法工作,无论如何。 – RubberDuck 2014-10-27 21:07:00

+1

是的,@RubberDuck ...该代码是可在链接中的帖子:http://stackoverflow.com/questions/198409/how-do-you-test-running-time-of-vba-code – 2014-10-27 21:14:27

1

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

还有另一个选项,你没有考虑。创建一个常量。

Const space As String = " " 

这有所有space(1)用文字" "性能的可读性。作为一个额外的好处,在内存中只有一个真正的实例,其中每个实例的文字将显示一次。


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