看到这个标题,有的同学肯定认为,这篇博客就是一个“标题党”,MID函数可以说是VBA入门级别的函数,但凡学习过几天的小白用户都会用,那么各位客官不要着急,我说说你听听,如果大家都知道这个用法,只能说明我孤陋寡闻了,如果大家觉得这是个新奇用法,那就烦请大家点个赞吧!

实例需求:将一个字符串(长度不定)进行转换,规则为倒数第3个字符和倒数第1个字符互换位置,例如:字符串为12345,转换结果为12543

这个需求并不复杂,只有会使用基本的字符串处理函数,就可以实现,参考代码如下。

Sub demo1()
    txt = "12345"
    new_txt = Left(txt, Len(txt) - 3) & _
            Right(txt, 1) & _
            Mid(txt, Len(txt) - 1, 1) & _
            Mid(txt, Len(txt) - 2, 1)
    Debug.Print ("原字符串:" & txt & vbNewLine & "新字符串:" & new_txt)
End Sub

【代码解析】
第3行代码使用Left函数提取除了尾部3个字符之外的字符串。
第4行代码使用Right函数提取最后一个字符。
第5行代码使用Mid函数提取倒数第2个字符。
第6行代码使用Mid函数提取倒数第3个字符。
第7行代码输出字符串。

这个常规思路实现代码无需多讲,接下来看看神奇的代码,由ExcelHome的ggmmlol提供。

实例代码。

Sub demo2()
    txt = "12345"
    Debug.Print ("原字符串:" & txt)
    Mid(txt, Len(txt) - 2, 3) = VBA.StrReverse(Right(txt, 3))
    Debug.Print ("新字符串:" & txt)
End Sub

【代码解析】
核心代码在于第4行,玩了10+年VBA,第一次看到Mid函数可以用于等号左侧,太神奇!
第4行的整体实现思路也很赞,调用StrReverse函数,一次性实现了字符换位。

既然Mid函数可以用于等号左侧,那么它的兄弟LeftRight函数是否可以呢,试了一下都不行。

再来测试一下这个用法是否可以实现任意长度字符替换。

Sub demo3()
    txt = "12345"
    Debug.Print ("原字符串:" & txt)
    Mid(txt, Len(txt) - 3, 4) = VBA.StrReverse(Right(txt, 3))
    Debug.Print ("新字符串:" & txt)
End Sub

输出结果如下:

原字符串:12345
新字符串:15435

并没有实现尾部4个字符替换为3个字符,而只是将倒数第4个至倒数第2个字符进行了替换,这样看来似乎是按照类似指针的方式,定位到了指定的保存位置,然后更新了存储的内容。