Excel VBA字符串
VBA 里的字符串,到底该怎么理解
做 Excel 表的时候,很多人最先注意到的,往往是数字。
求和、平均值、排名、条件判断,这些看起来都很“程序”。
但真到了写 VBA 的时候,你很快就会发现,工作里真正反复碰到的,很多时候不是数字,而是文字。
客户姓名、部门名称、订单状态、币种缩写、备注内容、收件地址、提示文案,这些全都是表格里很常见的东西。你用眼睛看,它们只是单元格里的字;可到了 VBA 里,它们不是随便写写就行的。双引号该不该加,空格算不算内容,123 和 "123" 到底是不是一回事,这些地方一旦没分清,程序就容易跑出一些莫名其妙的结果。
所以这一篇,就专门来讲 VBA 里的字符串。
说白了,就是:VBA 怎么把一段内容当成“文字”来处理。
什么是字符串
先别把“字符串”想得太复杂。
你可以直接把它理解成:一段文本内容。
比如下面这些:
-
"已联系" -
"销售部" -
"USD" -
"张三" -
"请下周回访"
它们都属于字符串。
在 VBA 里,字符串最明显的标志,就是两边带一对半角双引号。只要一段内容被双引号包起来,VBA 就知道:这是一段文字,不是变量名,也不是别的代码。
比如下面这句:
-
1
Range("B2").Value = "已完成"
它的意思就是,把“已完成”这几个字写进 B2 单元格里。
这个地方我一般会让初学者先记一句特别朴素的话:
双引号里面放内容,双引号外面放代码。
后面很多坑,基本都跟这句话有关。
第一件事,先把双引号分清楚
刚接触 VBA 的时候,很容易写出这种代码:
-
1
Range("B2").Value = Hello
你心里想的是:我想让 B2 显示 Hello。
但 VBA 不是这么理解的。它会把 Hello 当成一个变量名去找,而不是把它当成文本。
你真想输出文字 Hello,得这么写:
-
1
Range("B2").Value = "Hello"
这两句看着只差一对双引号,含义已经完全变了。
-
"Hello"是字符串 -
Hello是变量名
这个地方非常基础,但也非常容易写错。
还有一个小细节也别忽略:这里必须用半角双引号。中文输入法下那种全角引号,看着差不多,VBA 可不认。

如果字符串里本身就想写双引号,怎么办
这个情况在写提示文案的时候很常见。
比如你想输出一句:
客户回复:“下周再联系我”
问题就在于,双引号本来就是字符串的边界。你在字符串里面再直接写一个双引号,VBA 就容易判断错。
在 VBA 里,处理方式很简单:
如果想在字符串里表示一个双引号,就连续写两个双引号。
-
1
Range("B2").Value = "客户回复:""下周再联系我"""
最后显示出来,就会是一对正常的双引号。
这个你不用先去抠原理,先把写法记住就够用了。
如果字符串里想换行,也不能直接敲回车
有时候我们希望在一个单元格里放两行内容,比如:
-
第一行写客户姓名 -
第二行写回访时间
这时候,不能直接在字符串中间按回车。因为 VBA 里的一个字符串,必须写在同一行代码里。
要换行,得插入换行符。最常用的写法就是 vbNewLine:
-
1
Range("B2").Value = "客户:张敏" & vbNewLine & "时间:3月30日 10:00"
注意这里的 vbNewLine 要写在双引号外面。因为它不是普通文字,而是 VBA 里的系统常量。
这几个地方,也特别容易混
1. 空字符串,不等于空格
下面这个:
-
1
""
叫空字符串,里面一个字符都没有。
而下面这个:
-
1
" "
看着也像空的,但它不是空字符串。它里面其实有内容,只不过内容是空格,所以你肉眼不太容易看出来。
这在实际表格里特别常见。
有些单元格看上去像没填,实际上里面塞了几个空格。你拿它去判断“是不是空”,结果就会发现怎么都不对。
所以以后如果你遇到“看着是空的,程序却说它有值”,大概率就是这个原因。
2. 大小写,字符串里是要认真区分的
VBA 的关键字对大小写不敏感,比如 If、IF、if 都能跑。
但字符串不是这样。
-
1 -
2
"USD""usd"
这两个字符串,在 VBA 看来不是一回事。
所以像币种、部门编号、客户编码这种内容,你要是拿来比较,大小写一定得留意。
3. 数字,不等于数字字符串
这个区别也得尽快建立起来。
-
1
123
这是数字。
-
1
"123"
这是字符串。
虽然它们看上去都像 123,但 VBA 处理它们的方式完全不一样。一个是数值,一个是文本。后面一旦涉及运算或者拼接,差别就出来了。
真正到了工作里,字符串最常见的用途其实是“拼文本”
字符串这块,最常用的是把固定内容和变化内容拼在一起。
比如这些场景就很常见:
-
自动生成客户通知
-
批量拼接收件信息
在 VBA 里,拼字符串最常用的符号是 &。
我自己也更建议直接养成习惯:
只要是拼文本,就优先用 &,别随手用 +。
因为 + 在 VBA 里容易和数字加法混在一起。特别是当两边一个像数字、一个又像文本的时候,结果就容易出歧义。& 就清楚得多,一看就是在拼字符串。
来看一个实际的例子
比如现在有一张客户回访安排表,我们想在 E 列里自动生成一段通知文案。

示例表格
|
|
|
|
|
|
|
|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
我们希望 E 列最后变成这种格式:
张敏,您好,您预约的“数据看板服务”回访时间为 3月30日 10:00,请保持电话畅通。
这个需求本质上就一件事:把固定文案和变化内容拼在一起。
-
1 -
2 -
3 -
4 -
5 -
6 -
7 -
8 -
9 -
10 -
11 -
12 -
13 -
14 -
15 -
16 -
17 -
18 -
19 -
20
Sub BuildFollowupNotice()Dim i AsLongDim customerName AsStringDim productName AsStringDim followupTime AsStringDim noticeText AsStringFor i = 2To5'遍历第 2 行到第 5 行的客户数据customerName = Cells(i, 1).Value 'A 列:客户姓名productName = Cells(i, 2).Value 'B 列:产品名称followupTime = Cells(i, 3).Value 'C 列:回访时间noticeText=customerName&",您好,您预约的“"&productName&"”回访时间为 "&followupTime&",请保持电话畅通。"'把固定文案和变化内容拼成一句完整通知Cells(i, 5).Value = noticeText '把结果写入 E 列Next iEndSub
关键的是这一句:
-
1
noticeText = customerName & ",您好,您预约的“" & productName & "”回访时间为 " & followupTime & ",请保持电话畅通。"
你会发现:
-
固定不变的话,放在双引号里 -
会变化的内容,写在双引号外 -
中间用 &连起来
字符串这块,说到底就是在反复做这件事。
还有一个特别常见的错误:把变量写进双引号里
这个坑真的很高频。
比如有人想输出“第 3 名”,就会写成:
-
1
Cells(i, 5) = "第 k 名"
或者写成:
-
1
Cells(i, 5) = "第 " & "k" & " 名"
这就不对了。
因为一旦 k 被你放进双引号,它就不再是变量,而只是字母 k 本身。最后输出出来的,也只会是“第 k 名”。
正确写法应该是:
-
1
Cells(i, 5) = "第 " & k & " 名"
这个地方其实也还是同一条规则:
固定内容进双引号,变量写在双引号外。
再看一个更短一点的例子
比如你现在有一张员工状态表,想在 D 列里生成一句简单备注。
示例表格
|
|
|
|
|
|
|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如果状态是“已联系”,备注写“已完成首轮沟通”;如果状态是“未联系”,备注写“待跟进”。
-
1 -
2 -
3 -
4 -
5 -
6 -
7 -
8 -
9 -
10 -
11 -
12 -
13 -
14 -
15 -
16 -
17 -
18
Sub FillRemark()Dim i AsLongDim statusText AsStringFor i = 2To5'遍历第 2 行到第 5 行statusText = Cells(i, 3).Value 'C 列:当前状态If statusText = "已联系"ThenCells(i,4).Value="已完成首轮沟通"'如果已经联系,就写已完成备注ElseIf statusText = "未联系"ThenCells(i,4).Value="待跟进"'如果还没联系,就写待跟进EndIfNext iEndSub
这个例子短一点,但很适合你感受字符串在判断里的作用。
这里比的不是数字,而是文字。也就是说,If 后面比较的对象,完全可以是字符串。
最后把这篇的重点总结一下
字符串这部分,看起来碎,真用起来却特别频繁。
很多刚开始写 VBA 的人,问题不是出在循环和判断上,而是出在这些很细的小地方:
-
该加双引号的时候没加 -
该用 &的地方用了+ -
把变量直接写进了双引号里 -
把空字符串和空格混在了一起 -
把数字和数字字符串当成了同一个东西
字符串这块别嫌它“像基础”。
它确实基础,但它也是后面很多文本自动化处理的起点。
夜雨聆风