在VBA中字符串内部放置双引号

3

我很难理解如何在VBA字符串中插入双引号(")。我知道可以使用char(34)函数轻松实现这一点。我也知道另一种方法是使用4个双引号:""""。所有这些都来自于之前的一个SO帖子:

如何在VBA中在字符串中放置双引号?

但是,我的问题是...为什么需要4个引号呢?第一和第二个引号是转义字符吗?第三个引号才是真正的引号,第四个引号是结束引号?还是有不同的工作方式?我一直没有找到关于VBA如何处理这些双引号的明确答案。

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

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

...会生成以下信息框:

在此输入图片描述

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

在此输入图片描述

信息框内的字符串不是我希望得到的实际输出,它们仅用于实验目的。然而,我注意到在VBA中显然存在允许出现的引号数量的要求。是否有人知道这个要求是什么?为什么IDE强制在第二个字符串中插入一个额外的引号?能否解释我所描述的两种情况下实际字符串内容和格式化引号之间的差异?

像往常一样,对此提供任何帮助都将不胜感激 :)


我最好的猜测是字符串中引号的数量不能是偶数。这可能是因为一对引号被视为一个字符串,在四个引号的情况下,它将被视为两组"",导致两个空字符串。它可能会通过确保只有奇数个字符串来尝试克服这个问题。老实说,我不能确定这是否正是发生的事情,但这个逻辑是最有意义的。另外,为什么不避免麻烦呢?使用Chr(34),这样你就可以得到你想要的东西(特别是你已经知道了这一点)。 - Brandon Barney
2个回答

7
一般规则如下。
第一个双引号(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个DQs。
最后是特殊情况""""(只有4个DQ),第一个和最后一个是分隔符,在其中有一个转义的DQ。这相当于chr(34)。

我想确认我的理解。对于4个DQ案例,第二个DQ是实际的转义字符。这是否等同于Java中的\(这是我更熟悉的)?因此,\n 表示换行,\ 是实际的转义字符。并且跟在 \ 后面的任何字符都会被解释成不同的含义。这正确吗?还是我理解错了什么? - coolDude
@coolDude 正确,C语言衍生的语言中转义字符是 \。在这些语言中,连续的双引号通常表示连接;即 "a "" b" <==> "a b"。另一方面,在VB语言中,\没有特殊含义。你需要用一个DQ来转义DQ。类似地,想象一下如何用另一个\转义Java中的\。偶数个\,比如2n,就是n个转义反斜杠。 - A.S.H
顺便说一下,在VB中没有通用的转义。只有双引号可以通过另一个双引号进行转义。要在字符串中插入新行,您必须像"line 1" & vbCrLf & "line 2"这样组合它 - A.S.H
这两个是正确的拼接引号和变量的方式:""" + iterator.Value + """"""" + iterator.Value + """"。而这种方式是不正确的,因为它会导致结果为"..""""" + iterator.Value + """" - Timo

0

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

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

或者这个:

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

注意:我将“+”符号替换为“&”,因为在连接字符串时,这是VBA的最佳实践。

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