前言
在VBA程序中,常用的内置函数可以按照功能分为字符串函数、数字函数、转换函数等等,本节主要会介绍常用的字符串的内置函数,包括Len()、Left()、Mid()、Right()、Split()、String()、StrConV()等。
本节的练习数据表以下表为例:
1.使用Len()计算字符串长度
示例:
Sheet1的A列是商品的ID编码,现需要检查商品编码是否正确,其中正确的商品编码应该为10位字符组成,最终需在B列记录检查结果。完整的代码如下:
Sub LenTest()
Dim ws As Worksheet ' 声明变量用来存储worksheet对象
Dim lastRow As Integer
Dim i As Integer
' 设置worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 获取工作表的最大行数
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' 循环遍历查询,因第一行为表头,故从第二行开始循环
For i = 2 To lastRow
' 判断A列值的长度是否等于10
If Len(ws.Cells(i, "A").Value) = 10 Then
ws.Cells(i, "B").Value = "True"
Else
ws.Cells(i, "B").Value = "False"
End If
Next i
End Sub
2.字符串截取函数Left、Mid、Right
若需要提取字符串中的某一部分时,则可以通过函数Left()、Mid()、Right()函数来进行实现。
函数 | 语法 | 说明 |
---|---|---|
Left() | Left(String,Length) | 获取字符串从左开始,截取指定数量Length的字符串 |
Mid() | Mid(String,Start,Length) | 获取字符串从固定位置Start开始,截取指定数量Length的字符串 |
Right() | Right(String,Length) | 获取字符串从右开始,截取指定数量Length的字符串 |
说明:
String是需要处理的字符串
Length表示需要截取字符串的长度,其中Mid()函数中的Length为非必填项
Start是Mid()函数中用来表示从左数第几个字符开始,若length未填则表示一直截取到最后
示例:
在Sheet1中C列为商品的产品型号,由品牌、名称、型号构成,现需要将产品型号进行拆分后,在F、G、H 三列中的别填入品牌、名称、型号信息,完整的代码如下:
Sub StringTest()
Dim ws As Worksheet ' 声明变量用来存储worksheet对象
Dim lastRow As Integer
Dim i As Integer
' 设置worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 获取工作表的最大行数
lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
' 循环遍历查询,因第一行为表头,故从第二行开始循环
For i = 2 To lastRow
' 获取品牌--从左取3个字符
ws.Cells(i, "F").Value = Left(ws.Cells(i, "C").Value, 3)
' 获取名称--从第5个字符开始取4位
ws.Cells(i, "G").Value = Mid(ws.Cells(i, "C").Value, 5, 4)
' 获取型号--从右取3个字符
ws.Cells(i, "H").Value = Right(ws.Cells(i, "C").Value, 3)
Next i
End Sub
运行后截图
3. 字符串分割Split()
使用Split()可以按照固定的分隔符对字符串进行分割,最终返回类型为数组(默认数组下标从0开始)
如以上案例中,C列的产品型号由品牌、名称、型号构成,三者之间通过“-”进行连接,那么在拆分时也可以通过“-”来进行分割处理,完整的代码如下:
Sub StringTest()
Dim ws As Worksheet ' 声明变量用来存储worksheet对象
Dim lastRow As Integer
Dim i As Integer
' 设置worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 获取工作表的最大行数
lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
' 循环遍历查询,因第一行为表头,故从第二行开始循环
For i = 2 To lastRow
' 获取品牌--分割后获取数组下标为0
ws.Cells(i, "F").Value = Split(ws.Cells(i, "C").Value, "-")(0)
' 获取名称--分割后获取数组下标为1
ws.Cells(i, "G").Value = Split(ws.Cells(i, "C").Value, "-")(1)
' 获取型号--分割后获取数组下标为2
ws.Cells(i, "H").Value = Split(ws.Cells(i, "C").Value, "-")(2)
Next i
End Sub
4. String()可生成重复字符串
String(Number,Char) 函数用于生成指定长度Number的重复的字符串Char
示例:
在sheet1中J列为联系电话,为保护联系人的隐私,现需要将其电话号码的中间四位数字隐藏,使用星号*代替。
思路:
先通过Mid() 函数提取出联系电话中间的四位数字,随后使用Replace()函数进行替换,替换后的字符串使用String()来定义,完成的代码如下:
Sub StringTest()
Dim ws As Worksheet ' 声明变量用来存储worksheet对象
Dim lastRow As Integer
Dim i As Integer
Dim strTel As String ' 定义联系电话变量
' 设置worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 获取工作表的最大行数
lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
' 循环遍历查询,因第一行为表头,故从第二行开始循环
For i = 2 To lastRow
' 替换联系电话中间四位数字为四个星号*
strTel = ws.Cells(i, "J").Value
ws.Cells(i, "J").Value = Replace(strTel, Mid(strTel, 4, 4), String(4, "*"))
Next i
End Sub
运行后截图
5. StrConV()转换字符串
StrConv()函数可以实现对字符串英文的大小写转换,还能实现其他类型的一些转换,主要用法是StrConv(String,Conversion,<LCID>),其中String表示待处理的字符串,Conversion表示执行转换的类型,LCID为可选参数,表示与系统LocaleID不同,则为LocaleID。
关于Conversion转换类型,可参考下表总结
常量名称 | 值 | 说明 |
---|---|---|
vbUpperCase | 1 | 将字符串转换成全部大写形式 |
vbLowerCase | 2 | 将字符串转换成全部小写形式 |
vbProperCase | 3 | 将字符串转换成首字母大写形式 |
vbWide | 4 | 将字符串中的单字节字符转换成双字节字符 |
vbNarrow | 8 | 将字符串中的双字节字符转换成单字节字符 |
vbUnicode | 64 | 将字符串根据系统的默认编码转换成Unicode |
vbFromUnicode | 128 | 将字符串由Unicode转换成系统的默认编码 |
示例
在Sheet1的I列联系人中,为规范格式,先需要将该列内容统一修改为首字母大写的形式,完整的代码如下:
Sub StringTest()
Dim ws As Worksheet ' 声明变量用来存储worksheet对象
Dim lastRow As Integer
Dim i As Integer
' 设置worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 获取工作表的最大行数
lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
' 循环遍历查询,因第一行为表头,故从第二行开始循环
For i = 2 To lastRow
' 修改I列 联系人的格式为首字母大写
ws.Cells(i, "I").Value = StrConv(ws.Cells(i, "I").Value, vbProperCase)
Next i
End Sub
运行后截图
扩展
以下表格整理了字符串常用的字符串函数
函数 | 返回类型 | 功能 | 示例 | 返回值 |
---|---|---|---|---|
StrComp(字符串1,字符串2, [,比较]) | VariantInteger | 比较两个字符串。字符串1<字符串2,返回值-1;字符串1=字符串2,返回值0;字符串1>字符串2,返回值1; | StrComp(“AE”,“FS4”) | -1 |
StrConv(字符串,数字) | String | 变换字符串。数字为1时,将字符串内容转换成大写;数字为2时,将字符串转换成小写… | StrConv(“fghh”,1);StrConv(“AAhh”,2) | “FGHH”;“aahh” |
Format(字符串,可选参数) | VariantString | 设置字符串格式 | Format(Date,“Long Date”) | “2024年7月5日” |
LCase(字符串) | String | 将字符串转换成小写 | LCase(“LoNg”) | “long” |
UCase(字符串) | String | 将字符串转换成大写 | UCase(“LoNg”) | “LONG” |
Space(长度) | String | 将字符串中插入整个空格 | “Hi” & Space(2) & “World” | “Hi World” |
String(长度,字符) | String | 重复数个字符 | String(5,“*”) | “*****” |
Len(字符串) | Long | 计算字符串的长度 | Len(“Customer”) | 8 |
InStr([开始位置,]字符串1,字符串2[,比较]) | VariantLong | 字符串2在字符串1中最先出现的位置,若不存在则返回0 | InStr(1,“GHmdml”,“m”) | 3 |
Left(字符,长度) | String | 从左起取指定个数的字符 | Left(“fdgm32”,4) | “Fdgm” |
Right(字符,长度) | String | 从右起取指定个数的字符 | Right(“fdgm32”,4) | “gm32” |
Mid(字符,开始位置[,长度]) | String | 从开始位置起取指定个数的字符 | Mid(“fdgm3245”,4,3) | “324” |
LTrim(字符串) | String | 去掉字符串左边的空格 | LTrim(" ghd ") | "ghd " |
RTrim(字符串) | String | 去掉字符串右边的空格 | RTrim(" ghd ") | " ghd" |
Trim(字符串) | String | 去掉字符串前后两边的空格 | Trim(" ghd ") | “ghd” |
Asc(字符串) | Integer | 字符串收字裤的ASCII代码 | Asc(“abc”) | 97 |
Chr(数字) | String | 将数字转换成ASCII代码执行的字符 | Chr(65) | “A” |
Str(数字) | String | 将数字转换成字符串 | Str(54) | “54” |
Val(字符串) | Variant | 字符串转换成数字 | Val(“54D5SL23”) | 54000000 |