?本文于2023年3月8日首发于本人同名公众号:Excel活学活用,敬请关注! Excel里有很多字符串处理函数,如Left,Right,Mid,这些函数在VBA里也有,用法也基本相同。今天主要来谈一谈Mid函数的用法(下图是我自定义的iMid函数演示)。 其中,"text"是要从中提取字符的文本字符串,"start_num"是要提取的第一个字符的位置,"num_chars"是要提取的字符数,"start_num"参数从1开始。 这些基本的东西没啥好说的,对付一些简单的字符提取没有问题,但稍微复杂一些的情况就有点麻烦了,比如下面一个字符串,我们称它为“Item”: “【XJ:支付的职工薪酬】【BM:行政部】【QT:其他项目】” 我要提取出如下表格式的字符串: 序号 项目1 项目2 项目3 1 【XJ:支付的职工薪酬】 XJ:支付的职工薪酬 支付的职工薪酬 2 【BM:行政部】 BM:行政部 行政部 3 【QT:其他项目】 QT:其他项目 其他项目 如果在Excel工作表里,我们用Mid函数来做: 项目1公式:算了,我不想烧脑了,有哪位高人感兴趣的可以试试,我就给它来个自定义函数吧: 简单解释一下: 首先看我们的“Item”字符串,它是有规律的:每一个小项目都是用中文方括号【】括起来的,开头是“【”+“项目代码”+“:”,所以我们来描述一下需求: 项目1:取出以“【XX:”开头,以“】”结尾的字符串,包括开头和结尾字符。 项目2:取出以“【XX:”开头,以“】”结尾的字符串,不包括开头和结尾各一个字符。 项目3:取出以“【XX:”开头,以“】”结尾的字符串,不包括开头和结尾的字符。 函数代码实际上也是用了Mid函数,根据不同需求来决定: "start_num","end_num"(结尾字符位置),"num_chars",这些参数的值,然后再通过Mid函数来取得结果。 题外话,在写今天的分享文的时候,iMid函数还不存在,先前我是把每一个项目写了一个函数,但今天我在写的时候,感觉应该可以合并成一个函数,只要在函数的参数里加上一个type来决定取哪种结果,于是就诞生了iMid。 那么,这个函数如何使用呢? 功能:根据给定的首尾字符来截取首尾字符之间的字符,根据iType的值来决定输出结果: 1、默认是0,输出包含首尾字符之间的字符串,包含首尾字符; 2、iType=1,输出包含首尾字符之间的字符串,去掉首尾各一个字符 3、iType=2或其他整数,输出包含首尾字符之间的字符串,不包含首尾字符。 另外,该自定义函数要求第2个参数startStr,即首字符是唯一的,否则不能取得正确结果。 最后,由于时间仓促,未及全面测试,可能存有BUG,请谨慎使用,欢迎提出宝贵意见! 好了,今天就分享到这里,希望对你能有所帮助,感谢阅读!示例文件下载地址(如果有小伙伴不方便使用下面链接的,也可以在留言区贴上你的邮箱地址,我通过邮件发送): ??本文于2023年3月8日首发于本人同名公众号:Excel活学活用,敬请关注!基本语法:
MID(text, start_num, num_chars)
Function iMid(wholeStr As String, startStr As String, endStr As String, Optional iType As Integer = 0)
Dim StartPosition As Integer '开始位置,startStr首字符位置
Dim EndPosition As Integer '结束位置,endStr末字符位置
If iType = 0 Then
'包含首尾字符
StartPosition = InStr(wholeStr, startStr)
EndPosition = InStr(StartPosition, wholeStr, endStr) + Len(endStr) - 1
ElseIf iType = 1 Then
'不包含首尾1个字符
StartPosition = InStr(wholeStr, startStr) + 1
EndPosition = InStr(StartPosition, wholeStr, endStr) + Len(endStr) - 2
Else
'不包含首尾字符
StartPosition = InStr(wholeStr, startStr) + Len(startStr)
EndPosition = InStr(StartPosition, wholeStr, endStr) - 1
End If
iMid = Mid(wholeStr, StartPosition, EndPosition - StartPosition + 1)
End Function
链接:https://pan.baidu.com/s/1UA7pHDWyRuW5xvu56r8rvA?pwd=exi8
提取码:exi8