【问题标题】:Placing Double Quotes Within a String in VBA在 VBA 中的字符串中放置双引号
【发布时间】:2017-08-15 02:13:23
【问题描述】:

我很难理解如何在 VBA 中的字符串中放置双引号 (")。我知道我可以使用 char(34) 函数轻松地做到这一点。我也明白这样做的另一种方式是使用4个双引号:""""。所有这些都来自之前的SO帖子:

How do I put double quotes in a string in vba?

但是,我的问题是.... 为什么需要 4 个引号?前两个是否充当转义符,第三个是引用本身,第四个是终止引用?还是它以不同的方式工作?我还没有找到关于 VBA 如何处理这些双引号的具体答案。

我还注意到,如果我尝试在字符串中添加或删除双引号的数量,Visual Studio 将动态添加或删除双引号。例如,我最初有以下字符串:

data = TGName + """ + iterator.Value + """

...在消息框中产生以下内容:

但是,如果我尝试将字符串末尾的第二组双引号 (+ """) 从 3 调整为 4,Visual Studio 会自动将其调整为 5。我无法在结束。这是消息框中的结果字符串:

消息框中的字符串不是我希望的实际输出,它们纯粹是出于实验目的。但是,我注意到的是,显然对 VBA 中字符串中允许的引号数量有要求。有谁知道这个要求是什么?为什么 IDE 会在第二个字符串中强行插入额外的引号?有人可以解释我描述的两种情况下实际字符串内容和格式引号之间的区别吗?

与往常一样,我们将不胜感激任何帮助:)

【问题讨论】:

  • 我最好的猜测是字符串中的引号数不可能是偶数。这可能是由于一对引号被视为一个字符串,并且在四个引号的情况下,它将被视为两组“”,这只会导致两个空字符串。它可能试图通过确保只有奇数的字符串来克服这个问题。老实说,我不能确定这是否正是正在发生的事情,但逻辑是最有意义的。另外,为什么不避免头痛呢?使用 Chr(34),这样你就能得到你想要的(特别是因为你注意到你知道这一点。)

标签: vba excel double-quotes


【解决方案1】:

一般规则如下。

第一个双引号 (DQ) 宣布字符串的开始。之后,一些 DQ 宣布字符串结束。但是,如果 DQ 前面有 DQ,则它被“转义”。转义意味着它是字符串的字符部分,而不是分隔符。

简单地说,当字符串中有任何偶数个连续双引号时,比如2n,这意味着有n个转义双引号。当数字是奇数时,比如2n+1,你有n个转义的DQ和一个分隔符

例子

  """ + iterator.Value + """
' delimiter " + iterator.Value + " delimiter
'           ^ escaped            ^ escaped

  """ + iterator.Value + """"
' delimiter " + iterator.Value + ""  ' (missing enclosing delimiter) 
'           ^ escaped            ^^ both escaped.

在后一种情况下,缺少最后一个分隔符,因此 VS 为您插入了它,您得到了 5 个 DQ。

最后是特殊情况""""(只有4个DQ),第一个和最后一个是分隔符,里面有一个转义的DQ。这相当于chr(34)

【讨论】:

  • 我想确认我对此的理解。对于 4 DQ 的情况,第二个 DQ 是实际的转义字符。这是否与 Java 中的 \ 同义(这是我更熟悉的)?所以\n 表示一个新行,\ 是实际的转义字符。并且 \ 后面的任何字符都将被不同地解释。那是对的吗?还是我误会了什么?
  • @coolDude 正确,C 派生 语言中的转义字符是\ 。在那些语言中,顺序 DQ 通常宣布 concatenation;即"a "" b" "a b"。另一方面,\ 在 VB 语言中没有特殊含义。你用 DQ 逃脱 DQ。同样,想想如何用另一个\ 转义Java 中的\ 。偶数个\ ,比如 2n,是 n 个转义的反斜杠。
  • 顺便说一句,VB中没有通用的escape。只有双引号可以转义,另一个双引号。要在字符串中插入新行,您必须像"line 1" & vbCrLf & "line 2" 一样组合它
  • 这两个对连接引号和变量是正确的:""" + iterator.Value + """"""" + iterator.Value + """",这是不正确的,因为它导致"..""""" + iterator.Value + """"
【解决方案2】:

要将迭代器值附加到引号中的 TGName,您可以这样做:

Data = TGName & """" & iterator.Value & """"

或者这个:

Data = TGName & Chr(34) & iterator.Value & Chr(34)

注意:我用 & 替换了 + 符号,因为这只是连接字符串时的 VBA 最佳实践。

【讨论】:

    猜你喜欢
    • 2014-08-08
    • 2012-02-19
    相关资源
    最近更新 更多