乐于分享
好东西不私藏

Excel VBA字符串

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 的关键字对大小写不敏感,比如 IfIFif 都能跑。

但字符串不是这样。

  • 1
  • 2
"USD""usd"

这两个字符串,在 VBA 看来不是一回事。

所以像币种、部门编号、客户编码这种内容,你要是拿来比较,大小写一定得留意。


3. 数字,不等于数字字符串

这个区别也得尽快建立起来。

  • 1
123

这是数字。

  • 1
"123"

这是字符串。

虽然它们看上去都像 123,但 VBA 处理它们的方式完全不一样。一个是数值,一个是文本。后面一旦涉及运算或者拼接,差别就出来了。


真正到了工作里,字符串最常见的用途其实是“拼文本”

字符串这块,最常用的是把固定内容和变化内容拼在一起。

比如这些场景就很常见:

  • 自动生成客户通知

  • 批量拼接收件信息

在 VBA 里,拼字符串最常用的符号是 &

我自己也更建议直接养成习惯:

只要是拼文本,就优先用 &,别随手用 +

因为 + 在 VBA 里容易和数字加法混在一起。特别是当两边一个像数字、一个又像文本的时候,结果就容易出歧义。& 就清楚得多,一看就是在拼字符串。


来看一个实际的例子

比如现在有一张客户回访安排表,我们想在 E 列里自动生成一段通知文案。

示例表格

A
B
C
D
E
1
客户姓名
产品名称
回访时间
联系方式
通知内容
2
张敏
数据看板服务
3月30日 10:00
13800001234
3
李哲
自动报表工具
3月30日 14:30
13900004567
4
王雯
销售分析模板
3月31日 09:00
13700007890
5
陈凯
经营周报项目
3月31日 16:00
13600005678

我们希望 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 列里生成一句简单备注。

示例表格

A
B
C
D
1
姓名
部门
状态
备注
2
林峰
销售部
已联系
3
周宁
市场部
未联系
4
许婷
客服部
已联系
5
高源
运营部
未联系

如果状态是“已联系”,备注写“已完成首轮沟通”;如果状态是“未联系”,备注写“待跟进”。

  • 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 = "已联系"Then   Cells(i,4).Value="已完成首轮沟通"'如果已经联系,就写已完成备注ElseIf statusText = "未联系"Then   Cells(i,4).Value="待跟进"'如果还没联系,就写待跟进EndIfNext iEndSub

这个例子短一点,但很适合你感受字符串在判断里的作用。

这里比的不是数字,而是文字。也就是说,If 后面比较的对象,完全可以是字符串。


最后把这篇的重点总结一下

字符串这部分,看起来碎,真用起来却特别频繁。

很多刚开始写 VBA 的人,问题不是出在循环和判断上,而是出在这些很细的小地方:

  • 该加双引号的时候没加
  • 该用 & 的地方用了 +
  • 把变量直接写进了双引号里
  • 把空字符串和空格混在了一起
  • 把数字和数字字符串当成了同一个东西

字符串这块别嫌它“像基础”。

它确实基础,但它也是后面很多文本自动化处理的起点。