
本文于2023年3月8日首发于本人同名公众号:Excel活学活用,敬请关注!
Excel里有很多字符串处理函数,如Left,Right,Mid,这些函数在VBA里也有,用法也基本相同。今天主要来谈一谈Mid函数的用法(下图是我自定义的iMid函数演示)。

基本语法:MID(text, start_num, num_chars)
其中,"text"是要从中提取字符的文本字符串,"start_num"是要提取的第一个字符的位置,"num_chars"是要提取的字符数,"start_num"参数从1开始。
这些基本的东西没啥好说的,对付一些简单的字符提取没有问题,但稍微复杂一些的情况就有点麻烦了,比如下面一个字符串,我们称它为“Item”:
“【XJ:支付的职工薪酬】【BM:行政部】【QT:其他项目】”
我要提取出如下表格式的字符串:

如果在Excel工作表里,我们用Mid函数来做:
项目1公式:算了,我不想烧脑了,有哪位高人感兴趣的可以试试,我就给它来个自定义函数吧:
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
简单解释一下:
首先看我们的“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活学活用,敬请关注!